在Haskell中打印不大于10的整数的函数所必需的类型类约束?

IMK*_*IMK 1 haskell types

我正在尝试在Haskell中编写一个函数,该函数接受一个整数并仅在小于或等于10时才打印它.

在ghci中,执行如下编程的函数:

sayMeUntilTen :: (Integral a, Show a) => a -> String sayMeUntilTen x = if x <= 10 then show x else "Sorry, greater than 10"

作品.

但是,如果我不包含约束,则Show aghci会显示以下错误:

•无法从上下文中使用'show'推断出(显示a):

对类型签名进行积分a:sayMeUntilTen :: forall a.积分a => a - >字符串

可能的解决方法:将(显示一个)添加到类型签名的上下文中:sayMeUntilTen :: forall a.积分a => a - >字符串

我不明白为什么要添加Show a是必要的.是不是Integral像"子集" Show?寻找信息我发现这个网站:https://en.wikibooks.org/wiki/Haskell/Classes_and_types

它用这张图描述了Haskell中typeclases之间的继承关系:

在此输入图像描述

它让我认为Show类型类约束已经被Integral一个隐含了,但显然我有一些误解.

谁能向我解释为什么有Show必要?

对不起,如果问题太愚蠢,我只是想学习.

Mat*_*zyk 9

该图表已经过时了.在GHC 8.0.2(和7.4之后的任何一个?)

Prelude> :i Num
class Num a where
  (+) :: a -> a -> a
  (-) :: a -> a -> a
  (*) :: a -> a -> a
  negate :: a -> a
  abs :: a -> a
  signum :: a -> a
  fromInteger :: Integer -> a
  {-# MINIMAL (+), (*), abs, signum, fromInteger, (negate | (-)) #-}
    -- Defined in ‘GHC.Num’
instance Num Word -- Defined in ‘GHC.Num’
instance Num Integer -- Defined in ‘GHC.Num’
instance Num Int -- Defined in ‘GHC.Num’
instance Num Float -- Defined in ‘GHC.Float’
instance Num Double -- Defined in ‘GHC.Float’
Run Code Online (Sandbox Code Playgroud)

Integral不征收Show因此Show约束已明确给出,由于您show的使用.