types - F# 中的加法类型 (+)

标签 types f# ocaml inline

我刚刚了解到 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 的函数(或其他任何东西)对整数有一个定义,对浮点数(或任何其他类型)有一个定义。

最佳答案

简而言之,F# 有一个通过 inline 的临时重载机制。关键字和“静态成员约束”。内置数学运算符还有一些特殊的魔法,它神奇地假定类型 int没有其他限制。 (+)几乎是所有 F# 中最特别/最神奇的东西,因此它不能很好地介绍语言/类型系统。

一般来说,对于静态类型、类型推断的语言来说,“重载”是困难的。 F#在这里的选择非常务实。 OCaml 做了不同的、简单的、务实的事情(没有重载)。 Haskell 做了一个不同的、复杂但优雅的事情(类型类)。它们在语言/库设计空间中都是有些合理的点。

关于types - F# 中的加法类型 (+),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6285493/

相关文章:

ocaml - 如何检测正在运行的操作系统?

haskell - 手动推断类型 (\x y z -> (x y) z)

visual-studio-2012 - Windows 8.1 Pro VS 2012 上的 F# 编译错误

types - Impl Add 为类型别名元组 (f64, f64)

F# 查询表达式/选择运算符/更改结果中的列标题

sqlite - 使用 SQLProvider 和 SQLite 的 ResolutionPath 问题

ocaml - 一个简单的 OCaml 程序

oop - OCaml封装

c# - 检查对象是否为数字

haskell - Haskell 中的无限(最终周期性)HList