Num vs Integral

use*_*613 22 haskell

这个功能:

hola :: (Integral a) => a -> String
hola 1 = "OK"
hola _ = "asdf"
Run Code Online (Sandbox Code Playgroud)

工作良好.但是这一个:

hola :: (Num a) => a -> String
hola 1 = "OK"
hola _ = "asdf"
Run Code Online (Sandbox Code Playgroud)

无法编译:"无法推断(方程式a)由字面"1"引起的"

我真的不明白.我正在阅读一个教程

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

为什么我不能使用Num?

Dan*_*her 31

这是最近在去年9月/ 10月提出并在最新版本的基础套件中被接受的最新变化,Eq并且Show不再是超类Num.自那次更改以来,没有发布语言报告的新版本,因此它尚未出现在报告中.而且由于它是最近的,它还没有进入许多教程或书籍.

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

但它Integral是一个子类Real,它具有Ord(并因此Eq)作为超类,因此可行.


npo*_*cop 7

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

hola :: (Num a, Eq a) => a -> String
hola 1 = "OK"
hola _ = "asdf"
Run Code Online (Sandbox Code Playgroud)