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