【问题标题】:Why does f# dot operator have such a low precedence为什么 f# 点运算符的优先级如此之低
【发布时间】:2014-06-25 15:10:58
【问题描述】:

中使用的 F# 的成员选择点 (.) 运算符的优先级
System.Console.WriteLine("test")

的优先级低于 [space],因此以下

ignore System.Console.WriteLine("test")

必须明确写成

ignore (System.Console.WriteLine("test"))

虽然这将是来自并列符号概念的直觉。在使用过 CoffeeScript 之后,我可以体会到直观的优先级是如何帮助整理代码的。

是否正在努力使这种混乱合理化,也许是一些类似于早期“轻量级”语法的东西?

==============

经审查,罪魁祸首不是“。”运算符,但调用运算符“()”,如“f()”。所以,给定:

  type C() = class end

那么下面的直观语法就失败了:

  printfn "%A" C()    <-- syntax error FS0597

并且必须这样写(按照文档的规定):

  printfn "%A" (C())    <-- OK

一串未被空格分隔的符号应该隐含地表示一个块,这似乎很直观。其实并列的用处就是创建这样一个块。

【问题讨论】:

  • |&gt; 运算符在大多数情况下没有帮助吗?
  • @Mau 是的;在这种情况下,它将是&lt;|(方向性很重要 - '将评估提供给 -g 函数')。但是,这样的语法拐杖应该不是必需的。

标签: f# language-design operator-precedence


【解决方案1】:

a b.c 被解析为a (b.c),而不是(a b).c。因此,没有任何努力将其合理化——这根本不是真的。

【讨论】:

  • 参见spec 的第 4.4.2 节,符号运算符和模式/表达式构造的优先级。点运算符具有第三高的优先级,仅次于类型或函数参数的高优先级应用。
  • OP 声明的反例:let double x = x * 2;; double "test".Length.
  • MSDN 的优先级图表颠倒了(从最低到最高):)。尽管如此,我还是很惊讶这样的事情不起作用:ignore System.Console.WriteLine("test") ;;并且需要写:ignore (System.Console.WriteLine("test")) ;;
  • @George 它没有。 f(x) 的绑定比 f x 更强,但链 g f x (= (g f) x) 仍需要被括号或较低优先级的运算符(如 &lt;OP)打破,这样稍微不那么人为的例子可能会读作 @987654331 @
  • @kaefer 谢谢。不幸的是,我可以使用更多的细节。 :)。但是,我根据一些见解修改了我的问题。
【解决方案2】:

感谢所有回复的人。

我的特别困惑源于将() 视为调用运算符。作为一种热切的评估语言,F# 没有也不需要这样的东西。相反,这是一个表达式边界,如(expression)。特别是,() 限制了 nothing 表达式,它是类型 unit 的唯一值。因此,() 是一个值的规定,而不是解决相关函数的方向(尽管这是由于 F# 的热切评估而向函数提供参数时的实际结果。)

结果如下表达式

ignore System.Console.WriteLine("test")

实际上呈现三个不同的值,

ignore      System.Console.WriteLine       ("test")

根据从左到右的优先评估顺序或 F# 进行解释(然后允许部分函数应用和其他可能)

(  ignore     System.Console.WriteLine  )  ("test")

...但是(ignore expr) 的结果将是unit,它不需要参数。因此,语法错误(强类型,是的!)。因此,需要一个表达式边界。特别是,

   ignore  (  System.Console.WriteLine     ("test")  )

   ignore (System.Console.WriteLine "test")

   ignore <| System.Console.WriteLine "test"

   System.Console.WriteLine "test" |> ignore

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2018-06-21
    相关资源
    最近更新 更多