[英]Custom computation expressions in F#
我一直在玩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 }
我不明白我在標記的行中得到的錯誤:
該表達式應該具有Identity <'a>類型,但這里的類型為'b *'c
我認為這沒有意義,因為getInt()顯然是Identity<'a>
類型的值。
誰能告訴我我做錯了什么?
問題是你的Bind
函數的類型 - 它不應該采用curried參數。 如果您將其更改為:
member x.Bind (Identity v, f) = f(v)
那它應該工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.