2011-11-21 65 views
2

我有一個安裝了數據類型爲Card的模塊。我讓它類展會,但東西的情況下出問題的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" 

這似乎是我的數據類型是不是類展會的一個實例,爲什麼?


謝謝大家!有用! :)

+0

另外http://stackoverflow.com/questions/7863176/ – sdcvvc

回答

5

縮進事宜。實例聲明的主體需要縮進,否則它會將show的定義解釋爲另一個頂層函數,這就是Poker.show工作的原因。

instance Show Card where 
    show card = ... 

在Haskell一般縮進規則是,如果連續兩行縮進相同,它們是兩個不同的定義,而如果線比其前一個更縮進,它被認爲是部分前面的定義或表達式,這是你在這種情況下想要的。

導致無限循環的原因是由於您未在類型類中提供show的實現,因此它使用間接調用showsPrec的默認實現。既然你沒有提供那個,它使用默認的實現,調用show。因此,你會得到一個無限循環。幾個類型類別具有相互之間的默認實現,所以你只需要實現它們的一個子集。

+0

我的印象,從他和他提出的另一個問題是,這裏出現錯誤的縮進規則是縮減縮進規則。其他東西雖然很神祕。 – applicative

+0

@applicative:也許,但這與OP正在經歷的行爲一致。如果'show'沒有正確縮進,'Poker.show'會起作用,而'Prelude.show'會發散。因此,除非OP另有說明,否則我認爲認爲這是問題是合理的。 – hammar

+0

不,至少我不能得到那個結果; ghci只是宣佈想象中的新'show'含糊不清,並拒絕解釋該文件。如果我在問題模塊處於作用域時添加了有缺陷的'Show'實例,但在添加這些行之後重新加載,則無關緊要。 – applicative

相關問題