2011-01-22 109 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