我有一个安装模块,数据类型卡.我把它作为类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类的实例,为什么?
谢谢大家!有用!:)
缩进很重要.实例声明的主体需要缩进,否则它会将您的定义解释show为另一个顶级函数,这就是为什么Poker.show有效.
instance Show Card where
show card = ...
Run Code Online (Sandbox Code Playgroud)
Haskell中的一般缩进规则是,如果两个连续的行缩进相同,则它们是两个不同的定义,而如果一条线比之前的那条更加缩进,则认为它是前一个定义或表达式的一部分,在这种情况下你想要的是什么.
这导致无限循环的原因是,由于您没有show在类型类中提供实现,因此它使用间接调用的默认实现showsPrec.既然你没有提供那个,它使用调用的默认实现show.因此,你得到一个无限循环.几个类型类具有相互实现的默认实现,因此您只需实现它们的子集.