2011-01-22 143 views
4

我在讀this,現在想知道:F#中的評估順序是什麼?F#評估的順序是什麼?

顯然;使效果以順序方式發生。但是,函數調用或應用程序,操作員評估順序等等呢?

我瞥了一眼F#規範,但沒有提到這一點。感謝您的任何見解!

回答

8

我發現了一些電子郵件,我們在那裏修復了實施以獲得嚴格的申請順序。代碼

open System 

let f a = 
    Console.WriteLine "app1"; 
    fun b -> 
     Console.WriteLine "app2"; 
     () 

(Console.WriteLine "f"; f) (Console.WriteLine "arg1") (Console.WriteLine "arg2") 

將打印「f」,「arg1」,「arg2」,「app1」,「app2」。然而這並沒有使其成爲規範。我會提交一個規格錯誤。

(所述spec的一些其它部分已經更明確的,例如


6.9.6評價方法應用

對於方法闡述應用中,表達的詳盡形式將或者EXPR .M(args)或M(args)。

  • (可選)expr和args按照從左到右的順序進行計算,成員在具有映射到相應參數值的形式參數的環境中進行評估。

  • 如果expr的計算結果爲null,則引發NullReferenceException。

  • 如果該方法是一個虛擬調度槽(即聲明爲抽象的方法),則根據expr值的調度映射選擇該成員的主體。


儘管如此,一些專家認爲,你會活得更長,更幸福的生活,如果你不依賴於評估順序。 :))

(也可能看到

http://blogs.msdn.com/ericlippert/archive/2009/11/19/always-write-a-spec-part-one.aspx

http://blogs.msdn.com/ericlippert/archive/2009/11/23/always-write-a-spec-part-two.aspx

以獲得更多關於它是多麼容易搞砸與評估順序。)

+1

嘿,謝謝。事實上,如果你編碼報價解釋器,我就會問這個問題。如果您想確保EXACT與未加引號的代碼相同,您需要知道F#評估順序。 – Stringer 2011-01-23 00:09:40