哈斯克尔数据"ErroR语言 Control stack overflow"



我是Haskell的新手,我正在编写我的第一个数据结构。

 data Nat = Null | N Nat

例如:5N (N (N (N (N Null))))

我必须从Show, Eq, Ord, Num, Enum创建实例

我已经写了Eq并且它有效。

instance Eq Nat where
    (==) Null Null = True 
    (==) (N Null) (N Null) = True
    (==) Null (N Null) = False
    (==) Null (N xs) = False
    (==) (N xs) (N xs2) = xs == xs2

但是当我在拥抱中尝试此操作时,它会给我一个错误("错误 - 控制堆栈溢出"(。

我不能继续。

(N (N Null)) :: Nat   

我错过了什么?

您没有涵盖所有情况。此外,您可以通过进行最后一个"捕获所有其余部分"情况来简化您的定义,如下所示:

instance Eq Nat where
    (==) Null   Null    = True 
    (==) (N xs) (N xs2) = xs == xs2
    (==) _      _       = False

不过,我不知道为什么你的代码会给你一个堆栈溢出。它可能会给你一个非详尽的匹配错误。

无论如何,请注意,Hugs 现在已经过时了——它已经 10+ 年没有更新了。您应该切换到 GHC 并使用ghci而不是拥抱。


如果您仍然遇到堆栈溢出,则问题很可能出在Show实例中,正如 Willem Van Onsem 在上面指出的那样,您可以在其中定义无限递归。

你应该使用类似的东西

instance Show Nat where
   show Null = "Null"
   show (N x) = "(N " ++ show x ++ ")"

顺便说一下,请注意,某些标准实例可以以正确的方式自动生成。例如

data Nat = Null | N Nat deriving (Show, Eq, Ord)

应该按预期工作。不过,自己定义这些是一个很好的学习练习。

最新更新