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

时间:2017-10-28 21:28:40

标签: 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 a,则ghci会显示以下错误:

  

•因使用'show'而无法推断(显示a)        从上下文来看:

     

积分a          由类型签名绑定:                     sayMeUntilTen :: forall a。积分a =&gt; a - &gt;串

     

可能的解决方法:          添加(显示a)到上下文            类型签名:              sayMeUntilTen :: forall a。积分a =&gt; a - &gt;串

我不明白为什么有必要添加Show a。 Isn&#t; t Integral喜欢&#34;子集&#34; Show的?寻找信息我找到了这个网站:https://en.wikibooks.org/wiki/Haskell/Classes_and_types

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

enter image description here

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

有人可以向我解释为什么Show是必要的吗?

很抱歉,如果问题太愚蠢,我只是想学习。

1 个答案:

答案 0 :(得分: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使用而明确给出。