使用类型类Ord的方法的无限循环

时间:2011-11-27 14:13:39

标签: haskell

我定义了一种数据类型:

Data Card = Card Int deriving (Show, Eq)

(我也定义了一个同义词:

Type Cards = [Card]

然后使其成为:

 instance Ord Card where
    x > y   |ix == iy   = False
            |ix == 0    = True
            |iy == 0    = False
            |otherwise  = (ix > iy)
        where 
            ix = label x
            iy = label y

然后当我输入:

 (Card x) > (Card y) :: x,y are Int 

它有效,但当我输入:

 [(Card x)] > [(Card y)] :: x,y are Int 

它进入循环。

为什么会这样?我该如何解决?

1 个答案:

答案 0 :(得分:9)

Ord的{​​{1}}个实例仅定义Card,但you need to define either <= or compare

  

最小完整定义:>compare

列表的<=实例根据基础数据类型Ord定义compare。默认情况下,comparecompare是相互定义的,因此如果您没有定义其中任何一个,它们在调用时不会终止。列表的其他<=操作(包括Ord)是根据>定义的,因此compare>上调用[Card]时不会终止