作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码
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/
我是一名优秀的程序员,十分优秀!