我有一个数据类型为Card的已安装模块。我将它作为类Show的实例,但在ghci中出现了问题:
module Poker where
data Card = Card Int
...
instance Show Card where
show card = ...
...
我打开ghci并输入:
>:m + Poker
>Card 0
..
..
..
(Nothing) => I stop the execution
>Poker.show (Card 0)
> "Ace of Hearts"
看来我的数据类型不是Show类的实例,为什么?
谢谢大家!有用! :)
答案 0 :(得分:5)
缩进很重要。实例声明的主体需要缩进,否则它会将您show
的定义解释为另一个顶级函数,这就是为什么{{1}工作。
Poker.show
Haskell中的一般缩进规则是,如果两个连续的行缩进相同,则它们是两个不同的定义,而如果一条线比之前的那条更加缩进,则认为它是前一个定义的一部分或表达式,在这种情况下你想要的。
这导致无限循环的原因是,由于您未在类型类中提供instance Show Card where
show card = ...
的实现,因此它使用间接调用show
的默认实现。既然你没有提供那个,它使用调用showsPrec
的默认实现。因此,你得到一个无限循环。有几个类型的默认实现是相互实现的,所以你只需要实现它们的一个子集。