为什么f#dot运算符具有如此低的优先级

时间:2014-06-25 15:10:58

标签: f# language-design operator-precedence

中使用的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

看起来很直观的是,白色空间不间断的一串符号应该隐式表示一个块。实际上,并置的效用是创建这样一个块。

2 个答案:

答案 0 :(得分:4)

a b.c被解析为a (b.c),而不是(a b).c。所以没有努力使其合理化 - 这根本不是真的。

答案 1 :(得分:0)

感谢所有回复的人。

我的特殊困惑源于将()视为调用操作符。作为一种热切的评估语言,F#没有或者不需要这样的东西。相反,这是一个表达式边界,如(expression)。特别是,()限制了无表达式,这是类型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