如何在Haskell中向newtype添加相等比较(==)

dma*_*man 2 haskell typeclass newtype

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

我已经创建了一个名为"chop"的辅助函数来从列表的末尾删除0,但是我在比较两个列表时遇到了麻烦.任何想法为什么我使用"实例"在这里不起作用?

它编译,但当你尝试比较2个Poly实例时,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
Run Code Online (Sandbox Code Playgroud)

Dan*_*ner 8

问题是你已经定义(==)为自身递归.稍微简化一下你的定义,你有:

m == n = chop m == chop n
Run Code Online (Sandbox Code Playgroud)

这样评估如下:

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))
-> { ... }
Run Code Online (Sandbox Code Playgroud)

您应该调度到列表的相等性,而不是将相等性测试重新发送回多项式的相等性测试.例如,有人可能会写

m == n = let P m' = chop m; P n' = chop n in m' == n'
Run Code Online (Sandbox Code Playgroud)

代替.