这个功能:
hola :: (Integral a) => a -> String
hola 1 = "OK"
hola _ = "asdf"
工作良好 . 但是这一个:
hola :: (Num a) => a -> String
hola 1 = "OK"
hola _ = "asdf"
无法编译:“无法推断(方程式a)由字面”1“引起的”
我真的不明白 . 我正在阅读一个教程
“Integral也是一个数字类型类.Num包括所有数字,包括实数和整数,Integral只包括整数(整数) . 在这个类型类中是Int和Integer . ” http://learnyouahaskell.com/types-and-typeclasses
为什么我不能用Num?
2 回答
这是最近的更改proposed and accepted in September/October last year,在最新版本的基础包中,
Eq
和Show
不再是Num
的超类 . 自那次更改以来,没有新版本的语言报告已经发布,所以最近它还没有发布到许多教程或书籍中 ."Pattern matching"对数字文字是
(==)
的隐式应用程序,因此需要Eq
实例才能工作 . 现在不再能从Num
约束中推断出该实例,因此(相当新的:D)编译器仅使用Num
约束拒绝代码 .但
Integral
是Real
的子类,它有Ord
(因此Eq
)作为超类,因此可行 .正如丹尼尔菲舍尔所说,它曾经起作用,但它现在不起作用,因为
Num
和Eq
被拆分所以Num a
不再暗示Eq a
了 . 要修复代码,只需使Eq a
显式: