【问题标题】:Help me understand lambda expression precedence帮我理解 lambda 表达式的优先级
【发布时间】:2011-02-01 05:11:27
【问题描述】:

查看Operator Precedence 表,我很困惑 lambda 表达式在哪里适合所有这些。将表编号为 1 到 25(从最低到最高优先级),我看到用于组成 lambda 表达式的两个关键标记:fun 是非关联 6,-> 是右关联 8。即,fun ... -> ... .这可能是我理解的第一个错误,因为我什至不确定优先级是否在 lambda 表达式的主体中起作用(-> 的右侧)我只能认为优先级在整个表达,所以我将继续前进。根据该表,序列运算符; 的优先级为4,低于fun“运算符”。我相信是这样说的

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

应该等价于

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

然而它实际上等价于

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

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

【问题讨论】:

    标签: f# operator-precedence


    【解决方案1】:

    (如果您正在阅读运算符优先级表,那么您已经迷路了。该表可能有错误,但是谁在乎,请不要阅读该表。并且不要使用顺序运算符(;)。如果您确实在 lambda 旁边使用了序列运算符,则将 lambda 放在括号中。或者只是将每个 lambda 放在括号中。我一直接触 F# 解析器的代码,我不知道相对优先级是什么; vs fun vs -> 是,我什至不知道 -> 具有优先级意味着什么(它是 not an operator 在表达式中(仅在类型中,它确实是右关联)...我无法想象对这个问题或任何后续问题的任何令人满意的答案。除非您正在为 F# 编写自己的解析器/编译器,否则您应该对此不感兴趣。这些不是您要寻找的机器人。 )

    【讨论】:

    • 哈哈,我知道这张桌子不好(而且规范也没什么帮助)!但我确实有很好的理由既使用序列运算符又深入理解优先规则;)。查看 F# 解析器是否会有所帮助,或者大多数不熟悉 fslex / fsyacc 的人会完全迷失吗?对于掌握优先规则还有其他建议吗?谢谢!
    • 另外,我不知道“MU”代表什么!
    • 正如您几乎猜到的那样,我对这一切都很感兴趣,因为我正在开发一个报价反编译器,作为更大的开源项目 Unquote (code.google.com/p/unquote) 的一部分。缺乏完整的优先级规范让我放慢了速度,这是我应该为使用 fsbugs@microsoft.com 提交规范错误吗?
    猜你喜欢
    • 1970-01-01
    • 2011-10-22
    • 2014-08-11
    • 1970-01-01
    • 2015-10-30
    • 2014-09-30
    • 1970-01-01
    • 2011-07-24
    • 2021-10-04
    相关资源
    最近更新 更多