为什么在F#中重新定义了一些通用标准?

时间:2019-05-19 08:47:28

标签: f#

几天前我已经开始使用F#,但我不明白为什么重新定义了一些很长时间以来很普遍的事情?

  • 例如/* my comment */在几种语言中很常见,几十年来一直如此。确实有理由选择(* my comment *)吗?
  • 具有用type variablename定义的变量,例如int i也是很常见的,难道很难解析将类型保留在变量之前和之后吗?
  • 类似地,在几乎所有语言中,您都有!=表示不平等;是将其更改为<>以避免与其他事物发生冲突,还是只是“与众不同”?
  • <-与可变项结合使用,但将=用于不可变的..其背后的原因是什么?

我敢肯定还有其他人。

我不是在寻找有关更改是否良好的“意见”,但我很想知道它们背后是否存在某些特定的推理,例如简化解析等,因为我很好奇看看这些变更的好处是否大于不遵循普遍采用的公约的危害。

1 个答案:

答案 0 :(得分:10)

  

几天前我已经开始使用F#,但我不明白为什么重新定义了一些很长时间以来很普遍的事情?

     
      
  • 例如/ *我的评论* /在几种语言中很常见,几十年来一直如此。 (*我的评论*)真的有理由吗?
  •   

F♯是高度基于OCaml的,而OCaml是基于Caml的,Caml是基于标准ML的,而标准ML是基于ML的,而ML受了ISWIM的影响,而ISWIM则受到了ALGOL-60和LISP的影响。

(* / *)是ML的注释语法。 ML是在1970年代初期设计的。但是,使用括号进行注释甚至更老,例如Pascal使用了{* / *},Algol-68使用了{ / },并且在等式或证明旁边加括号的注释已经做得很久了。 / p>

Newspeak是一种非常新的语言,例如,也使用(* / *)

  
      
  • 具有用'type variablename'定义的变量(例如'int i')也很常见,难于解析该类型是在类型之前还是之后都不保留?
  •   

让类型跟随名称也很常见,因此“ common”并不是一个很好的理由。在名称之后使用类型有很多优点,例如,推断类型的语法就变成了“省略类型”,而大多数将类型放在名称之前的语言则需要某种“伪类型”。例如。在Java和C♯中,您必须说var foo,在C ++ auto foo中,依此类推。

请注意,许多现代语言都遵循此语法,例如Swift,Julia以及Python的类型提示。更重要的是,全部位于C语法族中的Kotlin,Scala,TypeScript和Go的类型都在标识符后面。

  
      
  • 类似地,在几乎所有语言中,您都有!=表示不平等;是将其更改为<>以避免与其他事物发生冲突,还是只是为了“与众不同”?
  •   

同样,<>用于多种语言,其中一些语言使用非常广泛,例如SQL,Pascal及其后续语言(Modula-2,Oberon,Delphi)。 Algol-68使用(现代实现使用/=,相等性是=),Haskell像现代Algol-68实现一样使用/=。 Mathematica使用=!=,Scala还将其用于类型不等式(但将!=用于值)。

在许多主流语言中,平等和绑定很容易混淆(例如,在C ===中)。使它们明显不同是一个优势。 (在C语言中,某些编码标准要求 Yoda条件来防止常见错误。)

  
      
  • 将<-与可变项结合使用,但=表示不可变..其背后的原因是什么?
  •   

绑定一个常数,不可变的“变量”(在数学意义上)和使可变引用可变是两个根本不同的操作。在视觉上区分它们是有意义的。

自从在编程还没有出现之前就已经被用来表示数学绑定的突变。它也用在Smalltalk中(例如,从ASCII中删除时,他们将其替换为:=,例如Pascal中也使用了它)。

因此,简而言之,我想挑战您提出这个问题的前提:F♯并没有重新定义很长时间以来常见的事物,它使用了很长时间以来已经存在的已经存在的定义

请注意,这很大程度上取决于熟悉程度。我个人最初学习的语言是BASIC,Pascal和Rexx,随后是Smalltalk和Eiffel。在大学里,我们学习了Python,Haskell和Java。我目前最喜欢的语言是Ruby。

当我第一次遇到Java时,它对我来说令人难以置信,即使现在我几乎只读和写ECMAScript,我仍然难以克服C风格的语法。