anchor.diff:  open FSharpx.Choice
   open FSharpx.Validation
   open NUnit.Framework
  +open FsUnit
   open Microsoft.FSharp.Core
   
   let validator pred error value =
  
positive.code: let validateOrder (o: Order) =
      let nameNotNull = nonNull "Product name can't be null" o.ProductName
      let positiveCost n = greaterThan (0m).n (sprintf "Cost for product '%s' can't be negative" n) o.Cost
      nameNotNull >>= positiveCost |> Choice.map (fun _ -> o)
  
  (*    validation {
          let! name = nonNull "Product name can't be null" o.ProductName
  
negative.code:         <* validateOrders customer.Orders
      match result with
      | Choice1Of2 c -> failwithf "Valid customer: %A" c
      | Choice2Of2 errors -> 
          printfn "Invalid customer. Errors:\n%A" errors
          errors.Length |> should equal 3
          errors |> should contain "Cost for product 'Bar' can't be negative"
          errors |> should contain "Product name can't be null"
          errors |> should contain "Surname can't be foo"
  
  [<Test>]
  let ``using ap``() =
    let customer = Customer()
    let result = 
      returnM (konst2 customer)
      |> Validation.ap (nonNull "Surname can't be null" customer.Surname)
      |> Validation.ap (notEqual "foo" "Surname can't be foo" customer.Surname)
    match result with
    | Choice1Of2 c -> failwithf "Valid customer: %A" c
    | Choice2Of2 errors -> 
        printfn "Invalid customer. Errors:\n%A" errors
        errors.Length |> should equal 1
        errors |> should contain "Surname can't be null"
  
  [<Test>]
  let ``validation with monoid``() =
  