F# function is very different from normal CLR method because of currying support. For example function
let inc a = a + 1
Will have type Microsoft.FSharp.Core.FSharpFunc<int,int>
. It creates problems with C# interoperability. Functions must be designed specially to be easily called from C#.
What is the rationale behind this design? I believe that the reason is currying support. But currying can be implemented using closures. For example this code:
let add a b = a + b
let inc = add 1
can be easily transformed into this by the compiler:
let add a b = a + b
let inc = fun x -> add 1 + x
both add and inc in this case can be normal System.Func
objects. I believe that there is some interesting reasons behind this design decision.