我试图在Haskell中定义一个称为“ Poly”的新类型,其中该类型是代表多项式表达式的“ Num”列表。 [1,2,3]对应于3x ^ 2 + 2x + 1,因此[4,5,6,0,0 ... 0]是与[4,5,6]相同的多项式。

我创建了一个名为“ chop”的帮助程序函数,以从列表末尾删除0,但是在比较两个列表时遇到了麻烦。为什么我在这里使用“实例”不起作用?

它可以编译,但是当您尝试比较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 - 如何在Haskell中将相等性比较(==)添加到新类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29929600/

10-09 03:14