I was very puzzled with some concept when learning F#. Here is some. Even I explain it here, you may be still confused, but it is ok, as you read on.
let t1 = 1 //fsi shows val t1 : int = 1 //think of it as (val t1) bind to (int = 1)
Based on the concept of other language, you think t1 is variable, and it is initialized or assigned with value 1. But here it should be understood as identifier t1 is bind to a value, the value is not function value, it is int 1. So what is the big deal of "identifier", "bind", "function value", and "value", we will see later. If you run the following expression in fsi
t1 //fsi shows val it: int =1
This is evaluation of expression "t1", the process is to bind value int 1 to unknown identifier. Let's read another example.
let t2() = 1 //fsi shows val t2 : unit -> int //here fsi should shows //val t2: unit -> int = <fun:it@91-2>
Here it means identifier t2 is bind to a value, the value is a function value, and the value is a function take unit type parameter and return a int type value. Here unit is similar the concept of "void" in other language. How do I prove my remark "here fsi should shows...", because we can find out what is the value of t2, by evaluating expression "t2" like below, it return the value of t2, here what I really means "the value that t2 is bind to "
t2 //val it : (unit -> int) = <fun:it@91-2>
t2(); //fsi shows val it : int = 1
The type description generated by fsi need some explanation.
t2(); int //int type int -> string //function type take one int input, return one string int -> string -> double // a function take one int, one string, return one double int * string -> double // a function take a (int, string) tuple , and return one double