在F#中,我的添加功能为什么不添加两个浮点数
let add a b = a+b
(add 3 4) //returns 7
(add 3.5 5.5) //error
还请解释类型推断如何在F#中起作用。
感谢。
答案 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_Inference和http://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
如果我错了,请纠正我。希望这会有所帮助。