F# 计算表达式中的类型推断错误 类型标识)=k x 成员返回x=Identity x let identity=new IdentityBuilder() 设三=恒等式3 设4=恒等式4 十二点= 身份,绑定三个 身份,绑定四个 标识返回(t*f) 设twelve2=恒等式{ 设!t=3 设f=4 返回t*f }

F# 计算表达式中的类型推断错误 类型标识)=k x 成员返回x=Identity x let identity=new IdentityBuilder() 设三=恒等式3 设4=恒等式4 十二点= 身份,绑定三个 身份,绑定四个 标识返回(t*f) 设twelve2=恒等式{ 设!t=3 设f=4 返回t*f },f#,computation-expression,F#,Computation Expression,12个不会带来任何问题,但是12个给出了 FS0001:此表达式应具有类型 'Identity正如Szer在评论中所指出的,您需要为计算生成器方法使用元组参数。但是,使用curried版本进行管道化通常很方便,如您的示例中所示。因此,我通常要做的是创建一个模块,该模块以咖喱格式包含计算生成器所需的所有函数,然后在生成器中使用它们。这样,我可以根据场景使用计算表达式语法或管道语法 在您的情况下,看起来是这样的: type Identity<'T> = Identity of 'T t

12个
不会带来任何问题,但是
12个
给出了

FS0001:此表达式应具有类型
'Identity正如Szer在评论中所指出的,您需要为计算生成器方法使用元组参数。但是,使用curried版本进行管道化通常很方便,如您的示例中所示。因此,我通常要做的是创建一个模块,该模块以咖喱格式包含计算生成器所需的所有函数,然后在生成器中使用它们。这样,我可以根据场景使用计算表达式语法或管道语法

在您的情况下,看起来是这样的:

type Identity<'T> = Identity of 'T

type IdentityBuilder() =
    member __.Bind (Identity x) (k : 'a -> Identity<'b>) = k x
    member __.Return x = Identity x
let identity = new IdentityBuilder()

let three = Identity 3
let four = Identity 4
let twelve =
    identity.Bind three <| fun t ->
    identity.Bind four <| fun f ->
    identity.Return (t * f)
let twelve2 = identity {
    let! t = three
    let! f = four
    return t * f
}

CE构建器的
Bind
必须具有元组形式,而不是curry形式。只需切换到
Bind(x,k)
type Identity<'T> = Identity of 'T

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module Identity =
    let bind (f: 'T -> Identity<'U>) (Identity x) = f x

    let create x = Identity x

type IdentityBuilder() =
    member __.Bind (x, f) = Identity.bind f x
    member __.Return x = Identity.create x

let identity = new IdentityBuilder()

let three = Identity 3
let four = Identity 4

let twelve =
    three |> Identity.bind  (fun t ->
        four |> Identity.bind (fun f ->
            Identity.create (t * f)))

let twelve2 = identity {
    let! t = three
    let! f = four
    return t * f
}
let (>>=) f x = Identity.bind x f

let twelve3 = three >>= (fun t -> four >>= (fun f -> Identity.create (t * f)))