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

Mar*_* P. 0 haskell instance

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

 data Nat = Null | N Nat
Run Code Online (Sandbox Code Playgroud)

例如: 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
Run Code Online (Sandbox Code Playgroud)

但是当我在拥抱中尝试这个时它会给我一个错误("错误 - 控制堆栈溢出").

我不能继续下去.

(N (N Null)) :: Nat   
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

chi*_*chi 5

你没有涵盖所有案件.此外,您可以通过最后一次"捕获所有其余"案例来简化您的定义,如下所示:

instance Eq Nat where
    (==) Null   Null    = True 
    (==) (N xs) (N xs2) = xs == xs2
    (==) _      _       = False
Run Code Online (Sandbox Code Playgroud)

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

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


如果仍然出现堆栈溢出,这很可能是问题的Show情况下,在那里你可以定义无限递归,如威廉·Onsem上述指出.

你应该使用类似的东西

instance Show Nat where
   show Null = "Null"
   show (N x) = "(N " ++ show x ++ ")"
Run Code Online (Sandbox Code Playgroud)

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

data Nat = Null | N Nat deriving (Show, Eq, Ord)
Run Code Online (Sandbox Code Playgroud)

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