Reputation: 339
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
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
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