此功能:
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?
答案 0 :(得分:30)
这是最近的更改proposed and accepted in September/October last year,在基本软件包的最新版本中,Eq
和Show
不再是Num
的超类。自那次更改以来,没有发布语言报告的新版本,因此它尚未出现在报告中。而且由于它是最近的,它还没有进入许多教程或书籍。
对数字文字的“模式匹配”是(==)
的隐式应用程序,因此需要Eq
实例才能工作。现在不再能从Num
约束中推断出该实例,因此(相当新的:D)编译器仅使用Num
约束拒绝代码。
但是Integral
是Real
的子类,它有Ord
(因而Eq
)作为超类,因此可行。
答案 1 :(得分:7)
正如丹尼尔菲舍尔所说,它曾经起作用,但它现在不起作用,因为Num
和Eq
被分开,所以Num a
不再暗示Eq a
了。要修复代码,只需明确Eq a
:
hola :: (Num a, Eq a) => a -> String
hola 1 = "OK"
hola _ = "asdf"