考虑以下 Haskell 函数:
sign a
| a < 0 = (-1)
| a > 0 = 1
| otherwise = 0
当我将它加载到 ghci 中时,我希望:t sign
是:
sign :: (Num a, Ord a) => a -> Integer
相反,它推断为:
*Main> :t sign
sign :: (Num a1, Num a, Ord a1) => a1 -> a
同样,如果我询问 integer 的类型5
,我期望的Integer
是,但我得到了
*Main> :t 5
5 :: Num a => a
我对 Haskell 的类型有些不理解。问题是,如果我所知道的返回类型sign
只是它是类型类的一个实例Num
,那么我应该无法将它的返回值传递给这个函数:
double :: Integer -> Integer
double x = x * 2
也就是说,我的double
函数需要一个Integer
,而不仅仅是Num
.
然而,以下工作很好:
*Main> double (sign 5.5)
2
我对 Haskell 的类型系统有什么误解?