【发布时间】:2012-05-05 18:28:37
【问题描述】:
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 的最小声明为$compare$ 或$(>=)$。
这里可能有什么问题? (>=) 在列表上似乎工作得很好。
【问题讨论】:
-
type Variable = String,对吗?如果你定义compare而不是(>=)会发生什么? -
它确实有效。谢谢。