13

一些语言使用一元加运算符进行隐式转换,例如将字符串强制转换为数字(例如 Javascript)或将小数字类型转换为int(例如大多数基于 C 的语言),或者在重载运算符时使用。

由于一元加号主要用于这样的骇人听闻的目的,而且由于 F# 不执行自动加宽转换,我很惊讶 F# 包含一元加号。

令我惊讶的是 Haskell 没有一元加号运算符。由于 F# 设计受到 Haskell 的影响,我很好奇为什么决定 F# 需要一元加号,而 Haskell 显然不需要。

你能举一个在 F# 中可靠使用一元加号的例子吗?如果不能,为什么它完全包含在语言中?

4

4 回答 4

2

我将总结扩展评论。可能的原因(直到给出更权威的答案):

  1. 与 F# 派生的 OCaml 的一致性(如果您做错/不必要的事情,最好继续这样做,以便人们知道会发生什么:-))
  2. 重载(主要用于自定义类型)
  3. 一元否定的对称性
于 2011-11-03T17:08:13.670 回答
2

F# 有两个核心影响:

  1. OCaml,它最初与之兼容,以及
  2. 构建它的 CLR。

正如已经指出的那样,OCaml 有一个一元加运算符,所以从这个角度来看,F# 也有一个是很自然的。

至于 CLR……令我惊讶的是,公共语言规范没有指定任何语言要求以支持运算符重载。但是,在使用该机制时,它确实指定了语义和命名约定。尽管如此,F# 被允许选择不使用一元加号,就像 C# 和 VB 选择不支持重载复合赋值运算符(+=等)一样。

除了 F#(C#、VB 和 C++/CLI)之外,最常见的 .NET 语言确实允许它并且具有一元优势。所以从这个角度来看,F# 支持一元加运算符也是很自然的。

于 2011-11-03T23:09:35.237 回答
2

标准数学符号中有一个一元加号运算符。大多数编程语言都将标准数学符号作为算术表达式语法的原始影响和动机。

于 2015-01-31T17:00:43.953 回答
0

根据this “用于为一元加运算符声明重载”。

于 2011-11-03T21:33:12.113 回答