F#中的自定义计算表达式

我一直在玩F#(又名计算表达式)monad,并且我写了这个简单的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 }

我不明白我在标记中遇到的错误:

预计这个表达式具有Identity <a>类型,但是这里有'b *'c类型

我认为这没有意义,因为getInt()显然是Identity<'a> <a>类型的值。

谁能告诉我我做错了什么?


计算表达式语法希望Bind拥有一个元组,而不是curried参数。 所以

member x.Bind((Identity v), f) = f(v)

看到这篇文章的所有签名。


问题是你的Bind函数的类型 - 它不应该采用curry参数。 如果您将其更改为:

member x.Bind (Identity v, f)  = f(v)

那么它应该工作。

链接地址: http://www.djcxy.com/p/24411.html

上一篇: Custom computation expressions in F#

下一篇: Interface Builder outlets managing