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

时间:2015-04-28 20:47:20

标签: haskell typeclass newtype

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

我已经创建了一个名为" chop"从列表末尾删除0,但我在比较两个列表时遇到问题。任何想法为什么我使用"实例"在这里不起作用?

它编译,但是当你尝试比较2个Poly实例时,WinGHCi会挂起。

JobModel model = new DefaultJobModel(); // You'll need to create this
panel.add(new JCheckBox(new JobAction(model, "Mowing", 10d)));

1 个答案:

答案 0 :(得分:8)

问题在于您已将(==)定义为自身递归。稍微简化一下你的定义,你有:

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'

代替。