F#和#x27;s的自动泛化没有按预期工作

F#和#x27;s的自动泛化没有按预期工作,f#,type-inference,F#,Type Inference,考虑下面的f#代码 其中vl具有签名“a->”b->“a*”b,因此tem是“b->”a*”b 但是编译代码会产生错误消息: 错误FS0001此表达式应具有类型 “字符串” 但这里有一种类型 “int” 这是怎么回事?这是因为永远令人恐惧且令人困惑的价值限制 vl的签名确实是您所期望的。这是a的签名,不能是通用的 它不能是泛型的,因为它在语法上是一个值,而不是一个函数,这是值限制的本质。有关它的更多信息,请参阅 如果a是一个顶级绑定,那么可以通过显式地给它一个通用参数,如let a来解决这一问题

考虑下面的f#代码

其中vl具有签名“a->”b->“a*”b,因此tem是“b->”a*”b 但是编译代码会产生错误消息:

错误FS0001此表达式应具有类型 “字符串”
但这里有一种类型 “int”


这是怎么回事?

这是因为永远令人恐惧且令人困惑的价值限制

vl
的签名确实是您所期望的。这是
a
的签名,不能是通用的

它不能是泛型的,因为它在语法上是一个值,而不是一个函数,这是值限制的本质。有关它的更多信息,请参阅


如果
a
是一个顶级绑定,那么可以通过显式地给它一个通用参数,如
let a来解决这一问题。这是因为存在一个永远令人恐惧且令人费解的值限制

vl
的签名确实是您所期望的。这是
a
的签名,不能是通用的

它不能是泛型的,因为它在语法上是一个值,而不是一个函数,这是值限制的本质。有关它的更多信息,请参阅

如果
a
是一个顶级绑定,那么可以通过显式地给它一个通用参数,如
let a,来解决这个问题
let vl x= let tem y =(x,y) in tem in let a= vl 5 in Console.WriteLine((a "4",a 3))
let vl x = let tem y = (x,y) in tem in let a z = vl 5 z in (a "4", a 3)