Skip to content

Instantly share code, notes, and snippets.

@dlidstrom
Last active September 20, 2019 12:11
Show Gist options
  • Select an option

  • Save dlidstrom/68cf244ccf3170dab9e612b6df541be4 to your computer and use it in GitHub Desktop.

Select an option

Save dlidstrom/68cf244ccf3170dab9e612b6df541be4 to your computer and use it in GitHub Desktop.
Mix of result and applicative
module Result =
let bind f = function
| Ok x -> f x
| Error x -> Error x
let map f = function
| Ok x -> Ok(f x)
| Error err -> Error err
let apply fResult xResult =
match fResult, xResult with
| Ok f, Ok x -> Ok(f x)
| Ok _, Error x -> Error x
| Error f, Ok _ -> Error f
| Error f, Error x -> Error(List.concat [ f; x ])
let mapError f = function
| Ok success -> Ok success
| Error failure -> Error (f failure)
let (>>=) m f = Result.bind f m
let (<!>) = Result.map
let (<*>) = Result.apply
/// mix of monad and applicative
type Username = Username of string
module Username =
let create u =
if String.length u > 10
then Error ["Too long"]
else Ok (Username u)
let value (Username s) = s
type Email = Email of string
module Email =
let create s =
if String.length s > 10
then Error ["Wrong email"]
else Ok (Email s)
let value (Email s) = s
let login u e =
let (Username u) = u
let (Email e) = e
[|u; e|] |> String.concat "-"
type ResultBuilder() =
//member this.Return(x) = Ok x
member this.Bind(m, f) = Result.bind f m
member this.Zero() = None
member this.Return(x) = Ok x
let result = new ResultBuilder()
let xx = result {
let! l =
login
<!> (Username.create "12345678900")
<*> (Email.create "12345678900")
let! u = Username.create "abc"
return u
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment