F#的评估顺序是什么?

时间:2011-01-22 07:16:40

标签: f# operator-precedence

我正在阅读this,现在想知道:F#中的评估顺序是什么?

显然;会以连续的方式发生效果。但是,如函数调用或应用程序,运算符的评估顺序等等。

我已经看了F#规格,但没有提及。感谢您的任何见解!

1 个答案:

答案 0 :(得分: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。

  • 如果方法是虚拟调度槽(即,声明为abstract的方法),则根据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

更多关于如何轻松搞定评估订单。)