(fun a -> ...) is just an anonymous function. F # differs from C # in that the functions are first class citizens, so when you associate an anonymous function with f , it will give f signature like val f : int -> int (since a output as int32 ), just like if you bound a normal named function, as in your second example. You can prove that they are semantically identical by running the examples in F # interactive.
Edit: anonymous functions even support shared files, which are usually output, but can be made explicit:
let f<'T> = (fun (x: 'T) -> x)
Edit 2: From the specification specification of F # 3.1 (found here) :
A value definition is considered a function definition if its immediate right side is an anonymous function, as in this example: let f = (fun w -> x + w)
Setting the obvious syntax error aside, this suggests that binding the value of a function (i.e. an anonymous function) to an identifier is literally equivalent to defining a normal function. It goes on to say that this equivalence is "the main product of functional programming," so you can be sure that this will not change in the future.
For general purposes, F # considers function definitions and function values ββ(i.e., delegation instances, anonymous functions) as equal at design time, but when it needs to raise the function definition to the function value, it will use the FSharpFunc delegate type as a compiled type. This applies to all functions of a higher order, for example, in Array, List, Seq, etc. arrays, since there is no real way to use the CIL method as a function value, as you can, with delegates. Everything else looks exactly as you would expect compiled C # or VB.NET - these are just delegates for which F # uses FSharpFunc.
Edit 3: I cannot add comments yet, but regarding Thomas's answer, the F # compiler does not know how to generalize the expression let h = (); fun a -> a let h = (); fun a -> a , but it will accept it if you add annotations like yourself, for example with the Nikon id example.
Edit 4: Here's a very rough picture of how F # compiles. Note that Thomasβs example, an expression of a sequence, as he called it, turns into FSharpFunc, whereas an equivalent function without (); becomes the actual CIL method. This is what the F # specification said above. Also, when you use the regular CIL method as a value, with a partial application or otherwise, the compiler will make FSharpFunc present it as a closure. 