我定义了一种数据类型:
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
它进入循环。
为什么会这样?我该如何解决?
答案 0 :(得分:9)
Ord
的{{1}}个实例仅定义Card
,但you need to define either <=
or compare
:
最小完整定义:
>
或compare
。
列表的<=
实例根据基础数据类型Ord
定义compare
。默认情况下,compare
和compare
是相互定义的,因此如果您没有定义其中任何一个,它们在调用时不会终止。列表的其他<=
操作(包括Ord
)是根据>
定义的,因此compare
在>
上调用[Card]
时不会终止