I'm still trying to wrap my head around how F# generalizes (or not) functions and types, and there's a case that's bugging me:
let min(a, b) = if a < b then a else b
let add(a, b) = a + b
let minInt = min(3, 4)
let minFloat = min(3.0, 4.0) // works!
let addInt = add(3, 5)
let addFloat = add(3.0, 5.0) // error: This expression was expected to have type
// int but here has type float
Here min has the generic type 'a * 'a -> 'a (requires comparison)
while add has a concrete type int * int -> int
, apparently inferred from its first use in the program. Both are declared and used in the same way, so why the difference in generalization?
I understand that in the case of add, the problem can be side-stepped by declaring the function inline, which causes it to get a generic type definition, i.e. 'a * 'b -> 'c (requires member (+))
, but that doesn't explain why this is needed in this case and not the other.