Skip to main content

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