这个功能:
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
)作为超类,因此可行.
正如丹尼尔菲舍尔所说,它曾经起作用,但它现在不起作用,因为Num
它Eq
被拆分所以Num a
不再暗示Eq a
了.要修复你的代码,只需Eq a
明确:
hola :: (Num a, Eq a) => a -> String
hola 1 = "OK"
hola _ = "asdf"
Run Code Online (Sandbox Code Playgroud)