首页 文章

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

提问于
浏览
1

这个问题在这里已有答案:

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

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

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

作品 .

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

•无法从上下文中使用'show'得出(显示a):对类型签名的限制:sayMeUntilTen :: forall a . 积分a => a - >字符串可能的修复:将(显示a)添加到类型签名的上下文中:sayMeUntilTen :: forall a . 积分a => a - >字符串

我不明白为什么要添加 Show a . 是 Integral 不是"subset"的 Show ?寻找信息我找到了这个网站:https://en.wikibooks.org/wiki/Haskell/Classes_and_types

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

enter image description here

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

Could anyone explain to me why is Show necessary ?

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

1 回答

  • 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’
    

    Integral 未强加 Show 因此由于 show 用法,必须明确给出 Show 约束 .

相关问题