我试图在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与这张图片之间的继承关系:
这让我认为Show
类型类约束已经被Integral
隐含了,但显然我有一些误解。
有人可以向我解释为什么Show
是必要的吗?
很抱歉,如果问题太愚蠢,我只是想学习。
答案 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
使用而明确给出。