这个问题在这里已有答案:
我正在尝试在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之间的继承关系:
它让我认为 Show
类型约束已经被 Integral
暗示了,但显然我有一些误解 .
Could anyone explain to me why is Show necessary ?
对不起,如果问题太愚蠢,我只是想学习 .
1 回答
该图表已经过时了 . 在GHC 8.0.2(和7.4之后的任何一个?)
Integral
未强加Show
因此由于show
用法,必须明确给出Show
约束 .