答案 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
更多关于如何轻松搞定评估订单。)