I've been toying with monads in F# (aka computation expressions) and I wrote this simple Identity monad:
type Identity<'a> =
| Identity of 'a
type IdentityBuilder() =
member x.Bind (Identity v) f = f(v)
member x.Return v = Identity v
let identity = new IdentityBuilder()
let getInt() = identity { return Int32.Parse(Console.ReadLine()) }
let calcs() = identity {
let! a = getInt() // <- I get an error here
let! b = getInt()
return a + b }
I don't understand the error I'm getting in the marked line:
This expression was expected to have type Identity<'a> but here has type 'b * 'c
I think this makes no sense as getInt() is clearly a value of type Identity<'a>
.
Can anyone tell me what am I doing wrong?
The computation expression syntax wants Bind
to have a tupled, not curried argument.
So
member x.Bind((Identity v), f) = f(v)
See this article for all signatures.
The problem is the type of your Bind
function - it shouldn't take curried arguments. If you change it to:
member x.Bind (Identity v, f) = f(v)
then it should work.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With