Haskell数据“错误 - 控制堆栈溢出”

时间:2017-11-11 09:52:10

标签: haskell instance

我是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   

我错过了什么?

1 个答案:

答案 0 :(得分:5)

您没有涵盖所有案件。此外,您可以通过制作最后一个"捕捉所有其余的"来简化您的定义。案例如下:

instance Eq Nat where
    (==) Null   Null    = True 
    (==) (N xs) (N xs2) = xs == xs2
    (==) _      _       = False
但是,我不知道你的代码为什么会给你一个堆栈溢出。它应该给你一个非详尽的匹配错误,可能。

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

如果你仍然遇到堆栈溢出,那么问题很可能就在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)

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