6

私は F# のモナド (別名計算式) をいじっていましたが、次の単純な Identity モナドを書きました。

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() は明らかに type の値であるため、これは意味がないと思いますIdentity<'a>

誰が私が間違っているのか教えてもらえますか?

4

2 に答える 2

9

計算式の構文Bindでは、カレーではなく、4倍の引数が必要です。それで

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

すべての署名については、この記事を参照してください。

于 2009-12-16T20:46:49.030 に答える
3

問題はBind関数のタイプです-カレーされた引数を取るべきではありません。次のように変更した場合:

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

その後、それは動作するはずです。

于 2009-12-16T20:46:21.253 に答える