R. *_*des 5 f# computation-expression
我一直在玩F#(也就是计算表达式)中的monads,我写了这个简单的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 }
Run Code Online (Sandbox Code Playgroud)
我不明白我在标记的行中得到的错误:
该表达式应该具有Identity <'a>类型,但这里的类型为'b*'c
我认为这没有任何意义,因为getInt()显然是类型的值Identity<'a>.
谁能告诉我我做错了什么?
计算表达式语法希望Bind有一个tupled,而不是curried参数.所以
member x.Bind((Identity v), f) = f(v)
Run Code Online (Sandbox Code Playgroud)
有关所有签名,请参阅此文章.
| 归档时间: |
|
| 查看次数: |
957 次 |
| 最近记录: |