我正在尝试在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必要?
对不起,如果问题太愚蠢,我只是想学习.
该图表已经过时了.在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的使用.
| 归档时间: |
|
| 查看次数: |
213 次 |
| 最近记录: |