为什么ML语言(F#)与C语言(C#)相比有这么多不同的运算符?

为什么ML语言(F#)与C语言(C#)相比有这么多不同的运算符?,c#,syntax,f#,operators,ml,C#,Syntax,F#,Operators,Ml,看起来它的操作员要多几倍: vs 这仅仅是为了使语言看起来“简洁”或历史的ML根而付出的代价吗?我不确定查看MSDN中的两个列表是否一定能给出一个公平的比较。请注意,F#表列出了符号字符用作表达式一部分的任何内容-这包括字符串文字“、注释//、预处理器指令、引号、泛型语法和许多其他内容。另一方面,C#参考仅列出运算符(虽然也有一些关键词) 的确,F#的运算符比C#多几个,但我认为差别并不像你想象的那么大。最值得注意的是: 用于使用诸如>和|>等函数的运算符(以及这些函数的变体) 用于处理列

看起来它的操作员要多几倍:

vs


这仅仅是为了使语言看起来“简洁”或历史的ML根而付出的代价吗?

我不确定查看MSDN中的两个列表是否一定能给出一个公平的比较。请注意,F#表列出了符号字符用作表达式一部分的任何内容-这包括字符串文字
、注释
//
、预处理器指令
、引号、泛型语法和许多其他内容。另一方面,C#参考仅列出运算符(虽然也有一些关键词)

的确,F#的运算符比C#多几个,但我认为差别并不像你想象的那么大。最值得注意的是:

  • 用于使用诸如
    >
    |>
    等函数的运算符(以及这些函数的变体)
  • 用于处理列表的运算符,如
    (前置元素)和
    @
    (串联)
  • 用于处理可空值的运算符(许多运算符在某些方面带有
    ),尽管我认为这些运算符更像是实现LINQ互操作的变通方法,而不是F的基本运算符#

  • 对于可变的ref单元格,有一些运算符
    :=
    -我认为这些运算符主要是ML heritage,您并不经常需要它们


所以,我认为最主要的是F#只是有一些更多的数据类型,它们是函数编程的核心,它有用于处理它们的操作符(特别是函数和列表)。另一方面,C#列表中的一些东西(
typeof
sizeof
delegate
以及
+=
,这些都是F#中的函数,或者根本不需要这些函数)。

在我看来,你的问题只能由语言设计师来回答。我想作者是一位专攻计算机科学的数学家。)可能是因为设计师的语言思想给它增添了更多的色彩it@SonerGönül在这种情况下,你的评论可以是一个有根据的答案,关于运算符的数量纯粹是一个品味问题,而不是基于客观原因的问题。如果不是C#语言设计师,我可以有把握地说,它将运算符和k的数量降至最低我真的不知道米尔纳的数学学位会如何让唐·赛姆选择运算符
=?
来进行“大于等于的运算,其中右边是可为空的值”“。但不管怎样……操作符重载呢:它通常被认为是一种不好的做法还是被鼓励的做法?操作符重载是F#中的标准做法-与C#非常相似。这实际上是对OCaml的一个改进(在OCaml中,必须对浮点使用
+。
,对int使用
+
).根据我的经验,运算符重载在C#中使用得非常少,而例如,FParsec定义了很多新的运算符:……哦,我想你的意思是“运算符重载”,就像定义自定义类型的现有运算符的含义一样。这与C#的用法类似。FParsec使用“自定义运算符”-人们为特定于域的语言这样做(对这一点的看法各不相同——在我看来,这有时是有道理的,但需要非常小心地使用)。WRT FParsec我个人认为自定义运算符有帮助,但学习运算符的语义需要时间。对于我自己的项目,我确实喜欢定义私人运算符,但很少定义公共运算符。