F#多态类型

F#多态类型,f#,type-inference,polymorphism,F#,Type Inference,Polymorphism,正如人们在咖喱风格多态类型系统中所期望的那样,下面的方法可以很好地工作,例如,标识函数实际上是一个无限函数族,每个函数族对应一个“a->”a类型: let f x = x printfn "%A" (f 2) printfn "%A" (f 3.4) 但是当我们尝试做一些更复杂的事情时,它在第三行失败了,“这个表达式应该有int类型,但这里有float类型”: (但注释掉第二行会使第三行正常工作,正如预期的那样。) 先验地,我希望类型推断要么表现为咖喱风格,其中未指定的类型实际上是泛型,要么只

正如人们在咖喱风格多态类型系统中所期望的那样,下面的方法可以很好地工作,例如,标识函数实际上是一个无限函数族,每个函数族对应一个“a->”a类型:

let f x = x
printfn "%A" (f 2)
printfn "%A" (f 3.4)
但是当我们尝试做一些更复杂的事情时,它在第三行失败了,“这个表达式应该有int类型,但这里有float类型”:

(但注释掉第二行会使第三行正常工作,正如预期的那样。)


先验地,我希望类型推断要么表现为咖喱风格,其中未指定的类型实际上是泛型,要么只锁定函数的一个版本,但就我所见,它在第一种情况下执行前者,在第二种情况下执行后者。我猜在我没有意识到的行为背后有某种逻辑。我遗漏了什么?

这里有一个关于“帽子类型”的非标准问题。一些F#函数(如“string”)的类型基于静态优化约束或某些成员函数的存在。这些函数只能在“内联”函数中进行泛化,否则它们将根据使用情况采用单态类型,这就是这里发生的情况。

仅详细说明一下,这意味着
让内联f x=string x
将使第二个示例的行为与第一个示例类似。
let f x = string x
printfn "%A" (f 2)
printfn "%A" (f 3.4)