我还在努力理解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 (需要比较)
,而add具有具体类型int * int -> int
,显然是从程序中第一次使用中推导出来的。两者的声明和使用方式相同,那么为什么会存在归纳的差异呢?我了解到,在add的情况下,可以通过声明函数为inline来避免问题,这会导致它获得一个通用类型定义,即
'a * 'b -> 'c (需要成员(+))
,但这并不能解释为什么这种情况需要而另一种情况不需要。
+
和<
生成相同的签名? - Daniel