odkken
odkken

Reputation: 339

Why do F# functions evaluate before they are called?

If I define a module as such:

module Module1
open System

let foo =
    Console.WriteLine("bar")

Then, in interactive do

#load "Library1.fs" //where the module is defined
open Module1

I see a

[Loading c:\users\jj\documents\visual studio 2015\Projects\Library1\Library1\Library1.fs] bar

Indicating that the foo function ran without me even calling it!

How/why does this happen? Is there any way to prevent it?

I'm aware that the return value of foo is whatever (Console.Writeline("bar")) evaluates to, and that there isn't any reason that can't be evaluated "immediately?" (when the module is loaded I guess?) - but is there a way to prevent it from happening? If my module functions alter the state of some other stuff, can I ensure that they do not evaluate until called?

Upvotes: 2

Views: 518

Answers (2)

ryachza
ryachza

Reputation: 4540

I believe let foo = x is essentially a static value that gets evaluated immediately, once. If you want a parameterless function, you would need let foo () = Console.WriteLine("bar"), using it as foo ().

If you don't want to have to use the parentheses when calling, something like type Test () = static member foo with get () = System.Console.WriteLine("bar"), using it as Test.foo should work.

Upvotes: 2

sepp2k
sepp2k

Reputation: 370112

Function bodies are evaluated when the function is called, just as you want. Your problem is that foo is not a function, it's a variable.

To make foo a function, you need to give it parameters. Since there are no meaningful parameters to give it, the unit value (()) would be the conventional parameter:

let foo () =
    Console.WriteLine("bar")

Accordingly a call of this function would look like foo ().

Upvotes: 16

Related Questions