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
補足として、インスタンス宣言で置き換えると、最初のペアではハングしないが、2 番目のペアではハングすることは興味深いことです。
*Main> (Monomial 1 [("x",2)]) > (Monomial (-1) [])
True
*Main> (Monomial 1 [("x",2)]) < (Monomial (-1) [])
/* Computation hangs here */
Eq instance
標準では、 が または のいずれか$compare$
であるという最小限の宣言が述べられていますが$(>=)$
。
ここで何が問題になる可能性がありますか?(>=) リストでは問題なく動作するようです。