F#中求值的顺序是什么?

5
我正在阅读 这篇文章,现在想问:F#中的评估顺序是什么?
显然,;使效果以顺序方式发生。但是对于诸如函数调用或应用程序、运算符的求值顺序等,该怎么处理呢?
我浏览了F#规范,但没有提到这一点。感谢您提供任何见解!
1个回答

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"。但是这没有被纳入规范中。我会提交一个规范错误。

(规范的其他部分已经更加明确,例如:


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
嘿,谢谢。实际上我问这个问题是因为你编写了一个引号解释器。如果你想确保与未引用的代码完全相同的行为,你必须在某种程度上了解 F# 的求值顺序。 - elmattic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接