首页 文章

Num vs Integral

提问于
浏览
21

这个功能:

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 回答

  • 30

    这是最近的更改proposed and accepted in September/October last year,在最新版本的基础包中, EqShow 不再是 Num 的超类 . 自那次更改以来,没有新版本的语言报告已经发布,所以最近它还没有发布到许多教程或书籍中 .

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

    IntegralReal 的子类,它有 Ord (因此 Eq )作为超类,因此可行 .

  • 7

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

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

相关问题