rwa*_*ace 4 polymorphism f# type-inference
以下工作正常,正如人们在Curry风格的多态类型系统中所期望的那样,例如身份函数实际上是一个无限的函数族,每个类型一个'a - >'a:
let f x = x
printfn "%A" (f 2)
printfn "%A" (f 3.4)
Run Code Online (Sandbox Code Playgroud)
但是当我们尝试做一些更复杂的事情时,它在第三行失败了,"这个表达式应该有int类型但是这里有float类型":
let f x = string x
printfn "%A" (f 2)
printfn "%A" (f 3.4)
Run Code Online (Sandbox Code Playgroud)
(但是注释掉第二行会使第三行正常工作,正如预期的那样.)
先验,我希望类型推断能够表现出Curry风格,其中未指定的类型实际上是通用的,或者只锁定函数的一个版本,但据我所知,它在第一个执行前者案件和后者在第二种情况下.我猜这个行为背后有一些逻辑,我只是没有接受.我错过了什么?
这里有一个非标准的东西,有"帽子类型".一些F#函数(如'string')具有基于静态优化约束或某些成员函数存在的类型.这些只能在'内联'函数中推广,否则它们会根据用法采用单态类型,这就是这里发生的事情.