簡體   English   中英

F#中的自定義計算表達式

[英]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有一個tupled,而不是curried參數。 所以

member x.Bind((Identity v), f) = f(v)

有關所有簽名,請參閱此文章

問題是你的Bind函數的類型 - 它不應該采用curried參數。 如果您將其更改為:

member x.Bind (Identity v, f)  = f(v)

那它應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM