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

opt*_*enk 2 haskell

我定义了一种数据类型:

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)

它进入循环.

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

dav*_*420 9

您的Ord实例Card仅用于定义>,但您需要定义<=compare:

最小完整定义:compare或者<=.

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

  • 我个人建议定义`compare`.我不能真正说出原因,但感觉恰到好处. (3认同)
  • 如果不出意外,你不太可能错误地记住"必须定义`比较`"作为"必须定义`> =`"或"必须定义`>`". (2认同)
  • @DanBurton一个原因是,如果你定义'<=','=='并且所有缺失的不等式都可以沿着a == b = a <= b && b <= a的行定义,那么2个应用程序<=使用.如果定义比较,则所有(in)等式只能使用一个compare应用程序. (2认同)