Haskell 哈斯克尔数据“;错误-控制堆栈溢出“;

Haskell 哈斯克尔数据“;错误-控制堆栈溢出“;,haskell,instance,Haskell,Instance,我是Haskell的新手,正在编写我的第一个数据结构 data Nat = Null | N Nat 例如:5是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) =

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

 data Nat = Null | N Nat
例如:
5
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
但当我在hugs中尝试此操作时,它会给我一个错误(“错误控制堆栈溢出”)

我不能继续了

(N (N Null)) :: Nat   

我遗漏了什么?

您没有涵盖所有案例。此外,您还可以简化定义,制作最后一个“捕获所有剩余内容”案例,如下所示:

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

无论如何,请注意拥抱现在已经过时了——它已经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)

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

您并没有涵盖所有情况。此外,您还可以简化定义,制作最后一个“捕获所有剩余内容”案例,如下所示:

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

无论如何,请注意拥抱现在已经过时了——它已经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)

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

我认为这里的问题在于你的
节目。如果这是您的查询,您永远不会调用
(==)
。注:此外,dat Hugs基本上已经失效(自2006年iirc以来),因此您最好使用GHC。您还忘记了一个案例,其中
(nx)=Null
。感谢您的回答和时间!但在ghci中,它仍然是堆栈溢出请给出一个最小的工作示例:加载到编译器中的文本文件以及查询。我认为这里的问题在于您的
显示
。如果这是您的查询,您永远不会调用
(==)
。注:此外,dat Hugs基本上已经失效(自2006年iirc以来),因此您最好使用GHC。您还忘记了一个案例,其中
(nx)=Null
。感谢您的回答和时间!但在ghci中,仍然是堆栈溢出。请给出一个最简单的工作示例:加载到编译器中的文本文件以及查询。感谢您的回答和时间!但在ghci中,它仍然是堆栈溢出。>前奏曲Null->Stack Overflow这确实是我的表演方法。我忘了用标签了。我不知道哈斯克尔那么敏感。非常感谢。谢谢你的回答和时间!但在ghci中,它仍然是堆栈溢出。>前奏曲Null->Stack Overflow这确实是我的表演方法。我忘了用标签了。我不知道哈斯克尔那么敏感。非常感谢。