我正在做一个基本的Haskell练习,如下所示:定义了一个数据类型,其中声明Zero
为NaturalNumber
,并使用此构建了一系列数字(按名称打印,例如four
),直到ten
。
对于理解如何声明Eq
实例,我没有太多困难(除了没有得到语法的确切解释),但是我在声明所有我需要的Ord
实例方面遇到了麻烦 - 我需要能够构建整个数字集上的排序,以便如果我输入“ten > nine”或其他内容,我将获得True
。
现在,我有这段代码片段。前两行应该是正确的,因为我从练习本身复制了它们(正如我应该做的那样)。
instance Ord NaturalNumber where
compare Zero Zero = EQ
compare Zero (S Zero) = LT
compare (S Zero) Zero = GT
compare x (S x) = LT
前四行代码运行良好,但无法处理类似“compare four five”这样的情况,以及我输入最后一行代码compare four four = EQ
之类的任何类似情况:我会收到一个“conflicting definitions”的错误提示,可能是因为出现了两次x
。如果我改为输入compare two one = GT
,则会收到“pattern match(es) are overlapped”的警告,但它能正常工作。然而,如果我在实际的Haskell平台中输入compare one two
,也会得到结果GT
,因此显然有些问题。即使我添加了以下代码compare one two = LT
,这个问题仍然存在。
很明显,我无法通过手动编写所有可能需要的实例来完成Ord
实例的描述,即使我可以,这也将非常低效。
是否有人能够给我提供一些提示,以解决这个问题并完成排序机制的构建?
compare (S x) (S y) = compare x y
的东西。此外,您可以使用下划线_
来描述您不关心详细情况,例如compare (S _) Zero = …
表示您不关心第一个数字的大小,只要知道它大于等于1并且第二个数字为零即可。 - Jakob Runge