Num vs Integral

时间:2012-10-07 11:46:16

标签: haskell

此功能:

hola :: (Integral a) => a -> String
hola 1 = "OK"
hola _ = "asdf"

工作正常。但是这一个:

hola :: (Num a) => a -> String
hola 1 = "OK"
hola _ = "asdf"

无法编译:"无法演绎(Eq a)字面上的文字`1'"

我真的不明白。我正在阅读一个教程,据说

  

" Integral也是一个数字类型类。 Num包括所有数字,包括实数和整数,Integral仅包括整数(整数)。在这个类型类中是Int和Integer。" http://learnyouahaskell.com/types-and-typeclasses

为什么我不能使用Num?

2 个答案:

答案 0 :(得分:30)

这是最近的更改proposed and accepted in September/October last year,在基本软件包的最新版本中,EqShow不再是Num的超类。自那次更改以来,没有发布语言报告的新版本,因此它尚未出现在报告中。而且由于它是最近的,它还没有进入许多教程或书籍。

对数字文字的“模式匹配”是(==)的隐式应用程序,因此需要Eq实例才能工作。现在不再能从Num约束中推断出该实例,因此(相当新的:D)编译器仅使用Num约束拒绝代码。

但是IntegralReal的子类,它有Ord(因而Eq)作为超类,因此可行。

答案 1 :(得分:7)

正如丹尼尔菲舍尔所说,它曾经起作用,但它现在不起作用,因为NumEq被分开,所以Num a不再暗示Eq a了。要修复代码,只需明确Eq a

hola :: (Num a, Eq a) => a -> String
hola 1 = "OK"
hola _ = "asdf"