我定义了一种数据类型:
Data Card = Card Int deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)
(我也定义了一个类型同义词:
Type Cards = [Card]
Run Code Online (Sandbox Code Playgroud)
)
然后使它成为:
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
Run Code Online (Sandbox Code Playgroud)
然后当我输入:
(Card x) > (Card y) :: x,y are Int
Run Code Online (Sandbox Code Playgroud)
它工作,但当我输入:
[(Card x)] > [(Card y)] :: x,y are Int
Run Code Online (Sandbox Code Playgroud)
它进入循环.
为什么会这样?我如何解决它?
您的Ord实例Card仅用于定义>,但您需要定义<=或compare:
最小完整定义:
compare或者<=.
该Ord系列表实例定义compare的基础数据类型的方面compare.默认情况下compare,<=它们是相互定义的,因此如果您没有定义其中任何一个,它们在调用时不会终止.Ord列表(包括>)的其他操作是根据其定义的compare,因此>在调用它时为什么不终止[Card].