2

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


谢谢大家!有用!:)

4

1 回答 1

5

缩进很重要。实例声明的主体需要缩进,否则它会将您的定义解释show为另一个顶级函数,这就是Poker.show有效的原因。

instance Show Card where
    show card = ...

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

这导致无限循环的原因是,由于您没有show在类型类中提供实现,因此它使用间接调用的默认实现showsPrec。由于您也没有提供那个,它使用调用的默认实现show。因此,您会得到一个无限循环。几个类型类具有相互实现的默认实现,因此您只需实现它们的一个子集。

于 2011-11-21T15:49:04.383 回答