I am trying to figure out how to define a function that works on multiple types of parameters (e.g. int and int64). As I understand it, function overloading is not possible in F# (certainly the compiler complains). Take for example the following function.
let sqrt_int = function
| n:int -> int (sqrt (float n))
| n:int64 -> int64 (sqrt (float n))
The compiler of course complains that the syntax is invalid (type constraints in pattern matching are not supported it seems), though I think this illustrates what I would like to achieve: a function that operates on several parameter types and returns a value of the according type. I have a feeling that this is possible in F# using some combination of generic types/type inference/pattern matching, but the syntax has eluded me. I've also tried using the :? operator (dynamic type tests) and when clauses in the pattern matching block, but this still produces all sorts errors.
As I am rather new to the language, I may very well be trying to do something impossible here, so please let me know if there is alternative solution.
Here's another way using runtime type checks...
Overloading is typically the bugaboo of type-inferenced languages (at least when, like F#, the type system isn't powerful enough to contain type-classes). There are a number of choices you have in F#:
For your particular example, I would probably just use method overloading:
Yes, this can be done. Take a look at this hubFS thread.
In this case, the solution would be:
Caveat: no compile-time type checking. I.e.
sqrt_int "blabla"
compiles fine but you'll get a FormatException at runtime.Not to take away from the correct answers already provided, but you can in fact use type constraints in pattern matching. The syntax is:
Or if you want to combine type checking and casting:
This works:
It uses static constraints and overloading, which makes a compile-time lookup on the type of the argument.
The static constraints are automatically generated in presence of an operator (operator
$
in this case) but it can always be written by hand:More about this here.