我正在阅读 这篇文章,现在想问:F#中的评估顺序是什么?
显然,
我浏览了F#规范,但没有提到这一点。感谢您提供任何见解!
显然,
;
使效果以顺序方式发生。但是对于诸如函数调用或应用程序、运算符的求值顺序等,该怎么处理呢?我浏览了F#规范,但没有提到这一点。感谢您提供任何见解!
;
使效果以顺序方式发生。但是对于诸如函数调用或应用程序、运算符的求值顺序等,该怎么处理呢?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"。但是这没有被纳入规范中。我会提交一个规范错误。
(规范的其他部分已经更加明确,例如:
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
了解更多有关如何通过评估顺序轻松搞砸事情的信息,请参考相关编程内容。