gpt4 book ai didi

types - F# 使用柯里化(Currying)函数进行类型推断

转载 作者:行者123 更新时间:2023-12-01 09:36:20 25 4
gpt4 key购买 nike

我有以下代码

let bar foo baz = foo, baz 

let z = bar 3
let z1 = z 2

但是如果我注释掉最后一行 let z1 = z 2 我会得到一个错误

let z = bar 3
----^

stdin(78,5): error FS0030: Value restriction.
The value 'z' has been inferred to have generic type
val z : ('_a -> int * '_a)
Either make the arguments to 'z' explicit or, if you do not intend for it to be generic,
add a type annotation.

我完全不知道如何正确注释函数。

最佳答案

您在这里面临的是 F# 的一个方面,称为值限制。这实质上意味着,如果您定义的值在语法上不是函数,那么它就不能是通用的。

let bar foo baz = foo, baz

... 在语法上是一个函数(它显然有两个参数),因此它被推断为泛型。然而:

let z = bar 3

... 在语法上不是一个函数——它只是一个值 z 恰好是一个函数(因为这就是 bar 的类型所指示的)。所以,这不能通用。在您的代码段中,通用性受到下一行的限制:

let z1 = z 2

这将 z 的类型固定为 int -> int * int。如果你没有这一行,你可以自己修复类型:

let z : int -> int * int = bar 3

或者,您可以将其设为可以推断为通用的句法函数:

let z a = bar 3 a

有关更多信息,请搜索讨论 value restriction 的各种其他 SO 问题和答案。 .

关于types - F# 使用柯里化(Currying)函数进行类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27744198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com