F#中的类型推断

时间:2011-12-03 19:58:06

标签: f# type-inference

在F#中,我的添加功能为什么不添加两个浮点数

let add a b = a+b

(add 3 4) //returns 7
(add 3.5 5.5) //error

还请解释类型推断如何在F#中起作用。

感谢。

4 个答案:

答案 0 :(得分:7)

你必须内联。

let inline add a b = a+b

问题是+是一个内联运算符,所以如果你的函数add不是内联的,那么它将采用int的默认重载。

看一下这个答案Use of `inline` in F#

当函数声明为内联时,类型推断将推断静态类型约束。

val inline add :
   ^a ->  ^b ->  ^c
    when ( ^a or  ^b) : (static member ( + ) :  ^a *  ^b ->  ^c)

所以现在a和b可以是用该签名实现静态成员(+)的任何类型。

答案 1 :(得分:2)

如果您只希望函数与浮点数一起使用,请使用类型注释。

let add (a:float) b = a + b //float -> float -> float

答案 2 :(得分:0)

在F#中,由于技术限制,类型推理系统在处理数字时只会输入int类型。 在Haskell中,add :: Num a => a -> a -> a因为类型类而起作用,这与.NET类不同。类型不适合F#。

请参阅http://en.wikibooks.org/wiki/F_Sharp_Programming/Basic_Concepts#Type_Inferencehttp://en.wikibooks.org/wiki/F_Sharp_Programming/Values_and_Functions

答案 3 :(得分:0)

我的两分钱。

实际上,如果您将执行顺序更改为,

let add a b = a+b

(add 3.5 5.5) //returns 9.0
(add 3 4) //error

您将看到F#确实添加了两个浮点数。 (这回答你的问题在F#为什么我的添加功能不添加两个花车)

请注意,在此片段中,F#将函数add type推断为float - >浮动 - >浮。

为什么F#在两种情况下推断函数类型的方式不同,即使你以完全相同的方式定义函数?

我认为在定义函数时,F#给函数赋予int类型。但在内部,F#仍然对该功能的“真实”类型保持灵活性。您调用该函数的第一个时间/行,编译器会看到您如何使用它,因此编译器可以理解您对函数类型的“意图”。并且编译器会相应地调整类型。

一旦编译器“认为”它获得了函数的“真实类型”,它就是它的本质。由于F#是静态类型的,你不能再使用不同类型的参数调用该函数。

话虽如此,我建议你试试这些片段。

let add a b = a + b

add "str" "ing"

它应该有用。

let add a b = a + b

add 5. 6.
add "str" "ing" // error, check the type

如果我错了,请纠正我。希望这会有所帮助。