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)
问题是你已经定义(==)为自身递归.稍微简化一下你的定义,你有:
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)
代替.