2011-02-01 69 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