中使用的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
看起来很直观的是,白色空间不间断的一串符号应该隐式表示一个块。实际上,并置的效用是创建这样一个块。
答案 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