Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.43 KB | None | 0 0
  1. module Result =
  2. let bind f = function
  3. | Ok x -> f x
  4. | Error x -> Error x
  5.  
  6. let map f = function
  7. | Ok x -> Ok(f x)
  8. | Error err -> Error err
  9.  
  10. let apply fResult xResult =
  11. match fResult, xResult with
  12. | Ok f, Ok x -> Ok(f x)
  13. | Ok _, Error x -> Error x
  14. | Error f, Ok _ -> Error f
  15. | Error f, Error x -> Error(List.concat [ f; x ])
  16.  
  17. let (<!>) = Result.map
  18. let (<*>) = Result.apply
  19.  
  20. type ResultBuilder() =
  21. member this.Bind(m, f) = Result.bind f m
  22. member this.Return(x) = Ok x
  23.  
  24. let result = new ResultBuilder()
  25.  
  26. /// mix of monad and applicative
  27. type Username = Username of string
  28. module Username =
  29. let create u =
  30. if String.length u > 10
  31. then Error ["Too long"]
  32. else Ok (Username u)
  33. let value (Username s) = s
  34. type Email = Email of string
  35. module Email =
  36. let create s =
  37. if String.length s > 10
  38. then Error ["Wrong email"]
  39. else Ok (Email s)
  40. let value (Email s) = s
  41. let login u e =
  42. let (Username u) = u
  43. let (Email e) = e
  44. [|u; e|] |> String.concat "/"
  45.  
  46. // short circuit any step that returns Error
  47. let xx = result {
  48. // collects all intermediate results
  49. // into one Ok (login successfully called)
  50. // or Error (one or more intermediate errors)
  51. let! l =
  52. login
  53. <!> (Username.create "1234567890")
  54. <*> (Email.create "1234567890")
  55. let! u = Username.create "abc"
  56. return u
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement