2010-12-19 81 views
4

以下工作正常,正如人们所期望的那样,在Curry风格的多态类型系统中,例如,身份功能实际上就是功能的无限系列,每种类型“A - >”一:F#多态类型

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) 

(但注释掉第二行使得三线工作,符合市场预期。)

先验的,我本来期望类型推论要么表现出未指定类型实际上是a的Curry风格通用的,或者只能锁定一个版本的函数,但据我所知,它在第一种情况下执行前者,在第二种情况下执行后者。我猜测这种行为背后有一些逻辑,我只是​​没有理解。我错过了什么?

回答

6

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

+6

只需要详细说明一下,这意味着'let inline f x = string x'将使第二个示例的行为与第一个示例类似。 – kvb 2010-12-19 16:45:17