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<'a>',但这里有类型''b *'c'
就行了let! t = three
。
我认为twelve
并且twelve2
应该是等价的……我弄错了吗?