如何向 Haskell 中的新类型添加相等比较 (==)

How to add equality comparisons (==) to a newtype in Haskell

我正在尝试在 Haskell 中定义一个名为 "Poly" 的新类型,其中类型是表示多项式表达式的 "Num" 的列表。 [1,2,3] 对应于 3x^2 + 2x + 1,因此 [4,5,6,0,0...0] 与 [4,5,6].[=12 是相同的多项式=]

我创建了一个名为 "chop" 的辅助函数来从列表末尾删除 0,但我在比较两个列表时遇到了问题。为什么我对 "instance" 的使用在这里不起作用?

它可以编译,但是当您尝试比较 Poly 的 2 个实例时,WinGHCi 挂起。

newtype Poly a = P [a]
x :: Num a => Poly a

chop :: (Eq a, Num a) => Poly a -> Poly a
chop (P l) = if (last l) == 0 then chop (P $ init l) else P l

instance (Num a, Eq a) => Eq (Poly a) where
    (==) m n = if (chop m) == (chop n) then True else False

问题是您已将 (==) 定义为对自身递归。稍微简化您的定义,您有:

m == n = chop m == chop n

这样计算:

m == n
-> { definition of (==) }
chop m == chop n
-> { definition of (==) }
chop (chop m) == chop (chop n)
-> { definition of (==) }
chop (chop (chop m)) == chop (chop (chop n))
-> { ... }

您不应将等式测试分派回多项式的等式测试,而应分派至列表的等式测试。例如,可以写

m == n = let P m' = chop m; P n' = chop n in m' == n'

相反。