我仍在努力思考 F# 如何泛化(或不泛化)函数和类型,并且有一个案例困扰着我:
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
这里 min 具有泛型类型'a * 'a -> 'a (requires comparison)
,而 add 具有具体类型int * int -> int
,显然是从它在程序中的第一次使用中推断出来的。两者都以相同的方式声明和使用,那么为什么在概括上有所不同呢?
我知道在添加的情况下,可以通过声明内联函数来回避问题,这会导致它获得泛型类型定义,即'a * 'b -> 'c (requires member (+))
,但这并不能解释为什么在这种情况下需要这样做而不是其他。