2011-02-01 72 views
1

看看Operator Precedence表,我很困惑lambda表达式适合所有这些。对表1至25(从最低到最高优先级)编号,我看到用于组成lambda表达式的两个密钥:fun是非关联6,而->是右关联8.也就是fun ... -> ...。这可能是我理解的第一个错误,因为我甚至不知道优先级是否在lambda表达式的主体中起作用(->的右侧)我只能想到在整个表达式中扮演角色的优先级,所以我会继续前往那里。根据此表,序列运算符;的优先级为4,比“运算符”的优先级低4。我相信说帮我理解lambda表达式优先

fun (x:int) -> x + 3 ; 2;; 

应相当于

((fun (x:int) -> (x + 3)) ; 2);; 

但它实际上相当于

(fun (x:int) -> (x + 3 ; 2));; 

我感谢澄清我的给出的优先规则的解释任何帮助所引用的表格与lambda表达式的实际优先规则!谢谢!

回答

4

MU

(如果您正在阅读的运算符优先级表,你已经失去了该表可能有错误,但谁在乎,不读表,而且不使用序列算(;)。如果你确实在lambda旁边使用了序列操作符,那么把lambda放在括号中,或者把每个lambda放在括号中。我总是触摸F#解析器的代码,我不知道;fun相对于->的相对优先级是,我甚至不知道->的优先级是什么(它在表达式中是not an operator(只在类型中,它确实是右关联的)......我不能想象任何满足ying回答这个问题或任何后续行动。除非你正在为F#编写你自己的解析器/编译器,否则你应该对此没有兴趣。这些不是你正在寻找的机器人。)

+0

哈哈,我知道桌子不好(和规范是没有太大的帮助)!但是我对使用序列操作符和深入理解优先规则都有很好的理由;)。看看F#解析器有没有什么帮助,或者会不熟悉fslex/fsyacc的人完全丢失?任何其他建议,以掌握优先规则?谢谢! – 2011-02-01 05:59:59