2011-01-22 19 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(引数)またはM(引数)。

  • (オプション)は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

ねえ、ありがとう。実際には引用符解釈プログラムをコーディングする場合にこれを尋ねていました。引用符で囲まれていないコードとまったく同じ動作を保証するには、F#の評価順序をある程度知っておく必要があります。 – Stringer

関連する問題