在Haskell中,Integral类型类意味着显示类型类吗?

时间:2017-01-28 12:42:09

标签: haskell typeclass

我正在尝试编译此代码。

symmetric [] = True
symmetric [_] = True
symmetric l
    | (head l) == (last l) = symmetric (tail (init l))
    | otherwise = False

isPalindrome :: Integral a => a -> Bool
isPalindrome n = symmetric (show n)

那段代码没有编译,我得的时间不长   错误消息说它无法推断(显示)。

Could not deduce (Show a) arising from a use of ‘show’
from the context (Integral a)
  bound by the type signature for
             isPalindrome :: Integral a => a -> Bool
  at 4.hs:7:17-39
Possible fix:
  add (Show a) to the context of
    the type signature for isPalindrome :: Integral a => a -> Bool
In the first argument of ‘symmetric’, namely ‘(show n)’
In the expression: symmetric (show n)
In an equation for ‘isPalindrome’:
    isPalindrome n = symmetric (show n)

改变这一行后它起作用了

isPalindrome :: Integral a => a -> Bool

isPalindrome :: (Show a, Integral a) => a -> Bool

所以我在想,因为Integral中的每个类型都在Show中,Haskell编译器应该能够从(Integral a)中推导出(Show a)。

1 个答案:

答案 0 :(得分:9)

  

所以我在想,因为Integral中的每个类型都在Show

Integral中的每个类型都不在Show中。由于

,在Haskell98中曾经是这种情况
class Show n => Num n

但是这种超类关系会阻止大量有用的数字类型(“无限精度数”,连续函数的全局结果等)。在现代Haskell中,类ShowIntegral完全没有关系,因此编译器无法推断出另一个。

然而,确实可以独立于实际Show类显示任何整数数字类型;使用showInt功能。

import Numeric (showInt)
isPalindrome :: Integral a => a -> Bool
isPalindrome n = symmetric $ showInt n []