import Data.Function (on)
import Data.List (sort)
data Monomial = Monomial
{ m_coeff :: Coefficient
, m_powers :: [(Variable, Power)]
}
deriving ()
instance Ord Monomial where
(>=) = on (>=) m_powers
instance Eq Monomial where
(==) = on (==) m_powers
这是我的代码的摘录,缩减到主要大小。让我们尝试比较:
*Main> (Monomial 1 [("x",2)]) > (Monomial (-1) [])
/* Computation hangs here */
*Main> (Monomial 1 [("x",2)]) < (Monomial (-1) [])
/* Computation hangs here */
附带说明一下,有趣的是,如果我s/(>=)/(>)/g
在实例声明中替换,它不会挂在第一对上,但仍然会挂在第二对上:
*Main> (Monomial 1 [("x",2)]) > (Monomial (-1) [])
True
*Main> (Monomial 1 [("x",2)]) < (Monomial (-1) [])
/* Computation hangs here */
Eq instance
尽管标准规定了to be$compare$
或的最小声明$(>=)$
。
这里可能有什么问题?列表上的 (>=) 似乎工作得很好。