FSharp Type Inference
When creating UDFs with F#, the flexible type inference might lead to function signatures that are not supported by Excel-DNA, or lead to unexpected results.
let MakeTwo x = 2
This doesn't work (the UDF doesn't get registered) since the inferred type is 'a -> int, so is generic over the argument. This is equivalent to the C# signature:
public int MakeTwo<T>(T input) = { return 2; }
However, the following, with explicit typing, does work:
let MakeTwo (x : float) = 2
This would apply to any function that is generic over its input. Another example is:
let AddString x y = x.ToString() + y.ToString()
which is of the type a' -> b' -> string and doesn't get exposed as an UDF either.
Adding explicit types removes the generic parameters:
let AddString (x:obj) (y:obj) = x.ToString() + y.ToString()
Even the simple example in the distribution can be a concern:
let Add x y = x + y
F# infers this function to be of the type int -> int -> int, and if called in Excel as =Add(2.5,3.5) then this function will return 7 not 6.
let Add (x:float) (y:float) = x + y