【发布时间】:2011-06-08 21:26:04
【问题描述】:
我刚刚了解到 OCAML 必须有一个 . 后缀才能进行浮点运算。一个例子是3. +. 4.,它等于7.(浮点数)。但是,F# 以相同的方式处理浮点和整数运算,因此 3 + 4 (int) 和 3. + 4. (float) 都有效。
F# 将 + 自然分配给 int,因此 let add a b = a + b 的类型为 int -> int -> int。确实(+) 给了我val it : (int -> int -> int) = <fun:it@6-1>。
这导致以下顺序,我认为这很违反直觉:
> 3. + 4.;;
val it : float = 7.0
> (+);;
val it : (int -> int -> int) = <fun:it@8-2>
所以我的问题是:“重载”是由编译器中的特殊机制/案例完成的,还是语言范围内的事情,所以我可以定义一个名为 add 的函数(或其他任何东西)对整数有一个定义,对浮点数(或任何其他类型)有一个定义。
【问题讨论】:
-
@Daniel 编译时类型约束。很好,谢谢 :) 但是,问题仍然存在:这是在 F# 中完成的吗?
-
不确定我是否关注。泛型函数只能写成
inline,如果那是你要问的。