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

opt*_*enk 2 haskell ghci

我有一个安装模块,数据类型卡.我把它作为类Show的实例,但是在ghci中出了点问题:

 module Poker where

 data Card = Card Int 

 ...

 instance Show Card where
 show card = ...

 ...
Run Code Online (Sandbox Code Playgroud)

我打开ghci并输入:

>:m + Poker
>Card 0
..
..
..
(Nothing) => I stop the execution
>Poker.show (Card 0)
> "Ace of Hearts"
Run Code Online (Sandbox Code Playgroud)

看来我的数据类型不是Show类的实例,为什么?


谢谢大家!有用!:)

ham*_*mar 5

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

instance Show Card where
    show card = ...
Run Code Online (Sandbox Code Playgroud)

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

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