尝试为数据类型定义实例时无限循环

时间:2011-11-21 15:42:46

标签: haskell ghci

我有一个数据类型为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类的实例,为什么?


谢谢大家!有用! :)

1 个答案:

答案 0 :(得分:5)

缩进很重要。实例声明的主体需要缩进,否则它会将您show的定义解释为另一个顶级函数,这就是为什么{{1}工作。

Poker.show

Haskell中的一般缩进规则是,如果两个连续的行缩进相同,则它们是两个不同的定义,而如果一条线比之前的那条更加缩进,则认为它是前一个定义的一部分或表达式,在这种情况下你想要的。

这导致无限循环的原因是,由于您未在类型类中提供instance Show Card where show card = ... 的实现,因此它使用间接调用show的默认实现。既然你没有提供那个,它使用调用showsPrec的默认实现。因此,你得到一个无限循环。有几个类型的默认实现是相互实现的,所以你只需要实现它们的一个子集。