为啥 F# 有一个一元加号运算符?

Posted

技术标签:

【中文标题】为啥 F# 有一个一元加号运算符?【英文标题】:Why does F# have a unary plus operator?为什么 F# 有一个一元加号运算符? 【发布时间】:2011-11-03 16:26:51 【问题描述】:

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

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

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

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

【问题讨论】:

Ocaml 有一个一元加号,名为(~+)。我也不知道它是干什么用的。 我认为所有语言都有它,但没有一个使用它。它存在对称性。 +1 不是 ((~+) 1),而是数字 1(由词法分析器解析)。 +(1) 返回-1 @PeterOlson: caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html -> 整数运算 F# 基于 OCaml,仅受 Haskell影响。如果OCaml有,那么F#就有,是很合理的。 【参考方案1】:

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

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

【讨论】:

同理,我们应该在语言中添加一元“是”运算符,使其与一元“非”(!)运算符对称。我们可以进一步证明包含“yes”运算符的合理性,因为当有人想要为自己的自定义类型重载它时,它会很有用。 ! 是取消引用,而不是 notnot 函数有一个积极的对应物,称为id @PeterOlson 我将其称为“确实”运算符。 “如果 x 确实等于三……” 我同意你的看法。由于我遇到的唯一重要用途是在 C 中,我想知道它是否只是大多数语言中的工件。 第 2 点和第 3 点的一个用例是复数,其中+i 看起来很自然地对应于-i,即使它实际上与i 相同。 【参考方案2】:

F# 有两个核心影响:

    最初兼容的 OCaml,以及 构建它的 CLR。​​

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

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

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

【讨论】:

"就像 C# 和 VB 选择不支持复合赋值" C# 支持复合赋值运算符。 ;-] 是的,但它们不遵循 CLI 规范。如果您在 C++/CLI 中定义 += 运算符,则在 C# 中使用 += 将不会调用它。在 F# 中它会。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

这就是~+ 的用途。它还说对于~-,所以这并不能真正回答我的问题。

以上是关于为啥 F# 有一个一元加号运算符?的主要内容,如果未能解决你的问题,请参考以下文章

为啥递增和递减是一元运算

JS中的一元操作符

JavaScript连载7-一元运算符赋值运算符逻辑运算符

为啥在 Ruby 中构建字符串时,铲子运算符 (<<) 优于加号 (+=)?

为啥加号运算符在 JavaScript 的正则表达式中不起作用? [复制]

为啥Java在使用“加号”运算符时会执行从双精度到整数的隐式类型转换? [复制]