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
Это выдержка из моего кода, сокращенного до основного размера. Давайте попробуем сравнения:Пользовательский экземпляр Ord зависает по спискам
*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
либо $compare$
, либо $(>=)$
.
В чем может быть проблема? (> =) по спискам, похоже, работает нормально.
'type Variable = String', справа? Что произойдет, если вы определите 'compare' вместо' (> =) '? – delnan
Это действительно работает. Спасибо. –