【问题标题】:Why do ML languages (F#) have so many different operators compared to C languages (C#)?与 C 语言 (C#) 相比,为什么 ML 语言 (F#) 有这么多不同的运算符?
【发布时间】:2015-06-04 16:33:33
【问题描述】:

看起来它有几个的运算符:

https://msdn.microsoft.com/en-us/library/dd233228.aspx

https://msdn.microsoft.com/en-us/library/6a71f45d.aspx

这仅仅是让语言看起来“简洁”或历史 ML 根源所付出的代价吗?

【问题讨论】:

  • 你的问题在我看来只有语言设计师才能回答。
  • 我希望作者是一位专攻计算机科学的数学家。 ;)
  • 可能是因为语言的设计者想增加更多内容
  • @SonerGönül 在这种情况下,您的评论可以是关于运营商数量纯粹是出于品味而不是基于客观原因的问题的有根据的答案。如果不是 C# 语言设计者,我可以肯定地说,它最大限度地减少了运算符和关键字的数量,以保持核心语言的简单和优雅。
  • 我真的不明白 Milner 的数学学位如何让 Don Syme 选择运算符 >=? 来表示“大于等于运算,其中右侧是可空值”。但无论如何......

标签: c# syntax f# operators ml


【解决方案1】:

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

确实,F# 比 C# 拥有更多的运算符,但我认为差异并不像您想象的那么大。最值得注意的是:

  • 使用 >>|> 等函数的运算符(以及这些函数的变体)
  • 使用::(前置元素)和@(连接)等列表的运算符
  • 用于处理可空值的运算符(许多运算符在某些方面使用 ?),尽管我认为这些更多是启用 LINQ 互操作的解决方法,而不是 F# 的基本运算符

  • 有一些可变引用单元 :=! 的运算符 - 我认为这些主要是 ML 遗产,您并不经常需要它们。

所以,我认为主要的一点是 F# 只是具有更多的数据类型,它们是函数式编程的核心,并且它具有用于处理它们的运算符(尤其是函数和列表)。另一方面,C# 列表中的一些内容(typeofsizeofdelegate+= 等要么是 F# 中的函数,要么根本不需要)。

【讨论】:

  • 运算符重载怎么样:这通常被认为是一种不好的做法还是受到鼓励?
  • 运算符重载是 F# 中的标准做法 - 与 C# 非常相似。这实际上是对 OCaml 的一项改进(您必须将 +. 用于浮点数,将 + 用于整数)。
  • 根据我的经验,运算符重载在 C# 中使用得非常少,而例如FParsec 定义了很多新的:quanttec.com/fparsec/reference/primitives.html#members.:62::62:..
  • 哦,我以为您的意思是“运算符重载”,就像为自定义类型定义现有运算符的含义一样。这与 C# 的用法类似。 FParsec 使用“自定义运算符” - 人们为特定领域的语言执行此操作(对此的看法各不相同 - IMO 有时 是有意义的,但需要非常小心地使用)。
  • WRT FParsec 我个人认为自定义运算符有帮助,但学习运算符的语义需要时间。对于我自己的项目,我确实喜欢定义私有运营商,但很少定义公共运营商。
猜你喜欢
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
相关资源
最近更新 更多