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

为什么在F#中重新定义了一些通用标准?,f#,F#,几天前我就开始了F#,我不明白为什么一些很长时间以来很常见的事情被重新定义了 例如,/*我的评论*/在几种语言中都很常见,几十年来一直如此;是否真的有理由使用(*我的评论*) 使用类型variablename定义变量(例如int i)也是很常见的,如果将类型保留在前面而不是后面,解析会更困难吗 类似地,在几乎所有的语言中都有=不平等;是将其更改为以避免与其他内容发生冲突,还是只是为了“与众不同” 使用 几天前我就开始了F#,我不明白为什么一些很长时间以来很常见的事情被重新定义了 例如,/*m

几天前我就开始了F#,我不明白为什么一些很长时间以来很常见的事情被重新定义了

  • 例如,
    /*我的评论*/
    在几种语言中都很常见,几十年来一直如此;是否真的有理由使用
    (*我的评论*)
  • 使用
    类型variablename
    定义变量(例如
    int i
    )也是很常见的,如果将类型保留在前面而不是后面,解析会更困难吗
  • 类似地,在几乎所有的语言中都有
    =不平等;是将其更改为
    以避免与其他内容发生冲突,还是只是为了“与众不同”
  • 使用
    
    几天前我就开始了F#,我不明白为什么一些很长时间以来很常见的事情被重新定义了

    • 例如,/*my comment*/在几种语言中很常见,几十年来一直如此;真的有理由同意我的评论吗
    F♯ 高度基于OCaml,OCaml基于Caml,标准ML基于ML,受ISWIM影响,ISWIM受ALGOL-60和LISP影响

    (*
    /
    *)
    是ML的注释语法。ML设计于20世纪70年代初。然而,使用括号表示注释更为古老,例如,Pascal使用了
    {*
    /
    *}
    ,Algol-68使用了
    {
    /
    }
    ,在这之前,将注释放在方程或证明旁边的括号中的时间要长得多

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

    • 使用'type variablename'定义变量,例如'int i'也是很常见的,如果将类型保留在之前而不是之后,解析会更困难吗
    让类型跟在名称后面也是很常见的,所以“common”并不是一个很好的理由。将类型放在名称之后有很多好处,例如,推断类型的语法变成“省略类型”,而大多数将类型放在名称之前的语言需要某种“伪类型”。例如,在Java和C语言中♯, 你必须说<代码> var fo< /COD>,在C++中代码>自动Foo<代码>,等等。 注意,许多现代语言都遵循这种语法,例如Swift、Julia以及Python的类型提示。更重要的是,Kotlin、Scala、TypeScript和Go都是C语法家族的成员,它们的类型在标识符之后

    还要注意,F#同时允许类型信息和解构语法。类型在标识符之后,解构在标识符之前。由于解构语法应该与模式匹配中的相同语法相匹配,因此语言设计者实际上没有选择,只能将类型信息放在标识符之后(否则,由于DU case可能与包含类型同名,因此会出现歧义,无法进行解析)。例如:

    type Age<'T> = Age of 'T
    let f (Age x) = x  // deconstruct
    let g (Age x: Age<int>) = x  // deconstruct + type info
    let h (x: Age<int>) = x  // only type info
    

    type age我相信其中大部分来自OCaml.F♯ 使用与它所基于的语言(OCaml、Caml、Standard ML等)相同的语法。他们为什么要重新定义这些标准?关于为什么类型放在名称后面,请参见“是”,但当该族♯ 属于我们设计的。那么,ML家族如何复制C家族的语法呢?说到起源。ML、Smalltalk、SQL、Prolog和C都是在70年代早期创建的。影响现代语言Clojure的Lisp创建于60年代初。因此,对于我们今天在2019年看到的所有编程范例,我们似乎都在70年代实现了。一个小小的更正:Haskell实际上使用了
    /=
    来解决不平等问题谢谢,修复了。我想我把它和Scala中的等式类型混淆了,后者使用了名为
    =”的泛型特征(类型构造函数)=[A,B]
    ,由于Scala的类型构造函数中缀语法,可以编写
    A=!=B