2009-12-16 89 views
5

我一直在單子在F#玩弄(又名計算式)和我寫了這個簡單的身份單子:自定義的計算式

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 } 

我不明白,我得到的錯誤標記線:

這表達預計將有類型的身份<「一>但這裏的類型是」 b *「C

我覺得這是沒有意義的getInt()我s顯然是Identity<'a>類型的值。

誰能告訴我我做錯了什麼?

回答

9

計算表達式語法希望Bind有一個元組而不是curried參數。 所以

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

this article所有簽名。

+1

或請參閱語言規範的第6.4.10節: http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html – Brian 2009-12-16 21:00:40

+1

注意自我:修改該wiki頁面,因爲它沒有任何意義;) – Juliet 2009-12-17 03:53:02

3

問題是您的Bind函數的類型 - 它不應該使用curry參數。如果您將其更改爲:

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

那麼它應該工作。

相關問題