如何向 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'
相反。
我正在尝试在 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'
相反。