【发布时间】:2018-07-26 20:19:44
【问题描述】:
type Identity<'T> = Identity of 'T
type IdentityBuilder() =
member __.Bind (Identity x) (k : 'a -> Identity<'b>) = k x
member __.Return x = Identity x
let identity = new IdentityBuilder()
let three = Identity 3
let four = Identity 4
let twelve =
identity.Bind three <| fun t ->
identity.Bind four <| fun f ->
identity.Return (t * f)
let twelve2 = identity {
let! t = three
let! f = four
return t * f
}
twelve没有引入任何问题,但是twelve2给出了
FS0001:此表达式应具有类型 'Identity' 但这里有类型 ''b * 'c'
上线let! t = three。
我认为twelve 和twelve2 应该是等价的……我弄错了吗?
【问题讨论】:
-
Bind对于 CE 构建器必须具有元组形式,而不是柯里化形式。改成Bind (x, k)