代码之家  ›  专栏  ›  技术社区  ›  R. Martinho Fernandes

F中的自定义计算表达式#

  •  5
  • R. Martinho Fernandes  · 技术社区  · 16 年前

    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 }
    

    我不明白我在标记行中遇到的错误:

    此表达式应具有类型标识<'a>但这里有“b*”c型

    我认为这毫无意义,因为getInt()显然是一个类型的值 Identity<'a> .

    谁能告诉我我做错了什么?

    2 回复  |  直到 16 年前
        1
  •  9
  •   Dario    16 年前

    计算表达式语法需要 Bind 有一个元组,而不是咖喱的论点。 所以

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

    看见 this article

        2
  •  3
  •   kvb    16 年前

    问题在于你的工作类型 Bind 函数-它不应该接受curry参数。如果将其更改为:

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