F#多态类型

时间:2010-12-19 13:35:52

标签: f# type-inference polymorphism

以下工作正常,正如人们在库里风格多态类型系统中所期望的那样,例如,身份函数实际上是一个无限的函数族,每个类型一个'a - > “一个:

let f x = x
printfn "%A" (f 2)
printfn "%A" (f 3.4)

但是当我们尝试做一些更复杂的事情时,它在第三行失败了,“这个表达式应该是int类型但是这里有float类型”:

let f x = string x
printfn "%A" (f 2)
printfn "%A" (f 3.4)

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

先验,我希望类型推断能够表现出Curry风格,其中未指定的类型实际上是通用的,或者只锁定该函数的一个版本,但据我所知,它正在做前者在第一种情况下,后者在第二种情况下。我猜这个行为背后有一些逻辑,我只是​​没有接受。我错过了什么?

1 个答案:

答案 0 :(得分:6)

这里有一个非标准的东西,有“帽子类型”。一些F#函数(如'string')具有基于静态优化约束或某些成员函数存在的类型。这些只能在'内联'函数中推广,否则它们会根据用法采用单形类型,这就是这里发生的事情。