I had the following code snippet…
#light
open System
let ExeC =
printfn "c"
3
let ExeB b =
printfn "b"
2
let ExeA =
printfn "a"
1
printfn "Example %d " ExeA
printfn "Example %d " (ExeB 1)
printfn "Example %d " ExeC
Console.ReadLine()
With the output as follows…
c
a
Example 1
b
Example 2
Example 3
Initially the execution of the code seemed unusual… up to now I would have expected ExeC, ExeB & ExeA to all be functions, but a previous comment from Brian indicated that there was a difference.
StackOverflow to the rescue and I got some feedback from Tim Robinson explaining that ExeA & ExeC were not functions, but single values (with side effects). This would make sense. Tim went on to suggest that if I wanted ExeA & ExeC to be functions I should declare them slightly differently… like this…
#light
open System
let ExeC () =
printfn "c"
3
let ExeB b =
printfn "b"
2
let ExeA () =
printfn "a"
1
printfn "Example %d " (ExeA ())
printfn "Example %d " (ExeB 1)
printfn "Example %d " (ExeC ())
Which would give the following output, which is what I originally expected…
a
Example 1
b
Example 2
c
Example 3
To be honest, it seems like such a minute change in code to achieve such a different result. Ironically up to today I realize that ExeA & ExeC were value holders – even though I had read it in several places, because of the side effects, which seemed misleading.
If I now understand what is going on, then the following code…
#light
open System
let ExeC = lazy(printfn "c"; 3)
let ExeB (b) = lazy(printfn "b"; 2)
let ExeA = lazy(printfn "a"; 1)
printfn "Example %d " (ExeA ).Value
printfn "Example %d " (ExeB (1)).Value
printfn "Example %d " (ExeC ).Value
would be equivalent to what Tim showed me.