Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the order of evaluation in F#?

I was reading this and now wonder: what is the evaluation order in F#?

Obviously ; makes effects happen in a sequential fashion. But what about things like function calls or applications, order of evaluation for operators, and the like.

I've glanced at the F# spec, but there is no mention of that. Thanks for any insight!

like image 511
Stringer Avatar asked Jan 22 '11 07:01

Stringer


People also ask

What is the order of evaluation?

Order of evaluation refers to the operator precedence and associativity rules according to which mathematical expressions are evaluated.

Is C evaluated left to right?

There is no concept of left-to-right or right-to-left evaluation in C, which is not to be confused with left-to-right and right-to-left associativity of operators: the expression f1() + f2() + f3() is parsed as (f1() + f2()) + f3() due to left-to-right associativity of operator+, but the function call to f3 may be ...

What is the correct order of evaluation of the expression in C?

C uses left associativity for evaluating expressions to break a tie between two operators having same precedence.


1 Answers

I found some emails where we fixed the implementation to have a rigid application order. The code

open System

let f a =
   Console.WriteLine "app1"; 
   fun b -> 
       Console.WriteLine "app2"; 
       ()

(Console.WriteLine "f"; f) (Console.WriteLine "arg1") (Console.WriteLine "arg2")

will print "f", "arg1", "arg2", "app1", "app2". However this didn't make it into the spec. I'll file a spec bug.

(Some other portions of the spec are already more explicit, e.g.


6.9.6 Evaluating Method Applications

For elaborated applications of methods, the elaborated form of the expression will be either expr.M(args) or M(args).

  • The (optional) expr and args are evaluated in left-to-right order and the body of the member is evaluated in an environment with formal parameters that are mapped to corresponding argument values.

  • If expr evaluates to null then NullReferenceException is raised.

  • If the method is a virtual dispatch slot (that is, a method that is declared abstract) then the body of the member is chosen according to the dispatch maps of the value of expr.


That said, some experts believe that you will live a longer, happier life if you do not rely on evaluation order. :) )

(Possibly see also

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

for more on how easy it is to screw things up with evaluation order.)

like image 167
Brian Avatar answered Sep 18 '22 22:09

Brian