Haskell 哈斯克尔数据“;错误-控制堆栈溢出“;
我是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) =
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这确实是我的表演方法。我忘了用标签了。我不知道哈斯克尔那么敏感。非常感谢。