为什么F#有一元加运算符?

时间:2011-11-03 16:26:51

标签: f# unary-operator

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

由于一元加号主要用于这样的hackish目的,而且由于F#没有执行自动加宽转换,我很惊讶F#包括一元加号。

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

你能举例说明F#中一元加的可靠用法吗?如果你不能,为什么它包含在语言中呢?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

F#有两个核心影响:

  1. 最初与之兼容的OCaml,
  2. 构建它的CLR。
  3. 正如已经指出的那样,OCaml有一个一元加运算符,所以从这个角度来看,F#自然也有一个。

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

    除了F#(C#,VB和C ++ / CLI)之外,最常见的.NET语言确实允许它并且有一元加号。因此,从这个角度来看,F#自然会支持一元加运算符。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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