gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:42:03 29 4
gpt4 key购买 nike

前几天刚入手F#,不明白为什么一些很常见的东西被重新定义了?

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

  • 我敢肯定还有其他几个。

    我不是在寻找关于更改是否好的“意见”,但我很想知道它们背后是否有一些具体的原因,例如简化解析等,因为我很想知道这些变化的好处大于不遵守普遍采用的公约的危害。

    最佳答案

    I have started F# a few days ago and I do not understand why some things which have been common for very long have been redefined?

    • for example /* my comment */ is common in several languages and has been like that since decades; was there really a reason to go with (* my comment *)?


    F♯高度基于OCaml,基于Caml,基于Standard ML,基于ML,受ISWIM影响,受ALGOL-60和LISP影响。
    (*/ *)是 ML 的注释语法。 ML 是在 1970 年代初设计的。但是,使用括号进行评论甚至更老,例如使用帕斯卡 {*/ *} , 使用 Algol-68 {/ } , 并且在等式或证明旁边的括号中加上注释在此之前已经完成了更长的时间。

    新话是一种相当新的语言,也使用 (*/ *) , 例如。

    • having variables defined with 'type variablename', such as 'int i' is also very common, would it have been harder to parse to leave the type before and not after?


    名称后面有类型也很常见,所以“常见”并不是一个很好的理由。将类型放在名称之后有一些好处,例如,推断类型的语法只是“省略类型”,而大多数将类型放在名称之前的语言都需要某种“伪类型”。例如。在 Java 和 C♯ 中,你必须说 var foo , 在 C++ auto foo , 等等。

    请注意,许多现代语言都遵循这种语法,例如Swift、Julia 以及 Python 的类型提示。更重要的是,Kotlin、Scala、TypeScript 和 Go,所有这些都直接属于 C 语法家族,在标识符之后具有类型。

    另请注意,F# 允许类型信息和解构语法。类型在标识符之后,解构在标识符之前。由于解构语法应该与模式匹配中的相同语法匹配,语言设计者实际上别无选择,只能将类型信息放在标识符之后(否则,由于 DU 案例可以与包含类型具有相同的名称,因此会产生歧义并且解析是不可能的)。例子:
    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

    • similarly, in almost all languages you have != for inequality; was changing it to <> to avoid the clash with something else, or just 'to be different'?


    再次, <>用于多种语言,其中一些使用非常广泛,例如 SQL,还有 Pascal 及其后继者(Modula-2、Oberon、Delphi)和所有 BASIC 语言,包括 MS 的 Visual Basic。使用 Algol-68 (现代实现使用 /= ,相等是 = ),Haskell 使用 /=像现代的 Algol-68 实现。 Mathematica 使用 =!= , Scala 也使用它来表示类型不相等(但使用 != 表示值)。 XPath、XSLT 和 XQuery 都使用 <> , 还有 ne .

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

    • using <- with mutables but = for immutable.. what is the reasoning behind it?


    绑定(bind)一个常量、不可变的“变量”(在数学意义上)和改变一个可变引用是两个根本不同的操作。从视觉上区分它们是有意义的。
    甚至在编程存在之前就已经被用来表示在数学中改变绑定(bind)。它也在 Smalltalk 中使用(当 从 ASCII 中删除时,他们将其替换为 := ,例如,Pascal 中也使用了它)。

    所以,简而言之,我会挑战你的问题的前提:F♯没有重新定义已经很常见的东西,它使用了已经存在很长时间的定义。

    请注意,其中很多都归结为熟悉程度。我个人将 BASIC、Pascal 和 Rexx 作为我的第一门语言,其次是 Smalltalk 和 Eiffel。在大学里,我们学习了 Python、Haskell 和 Java。我目前最喜欢的语言是 Ruby。

    当我第一次接触 Java 时,我觉得它非常奇怪,而且我仍然难以理解 C 风格的语法,尽管我目前几乎只阅读和编写 ECMAScript。

    关于f# - 为什么在 F# 中重新定义了一些通用标准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56206167/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com