Class 运行时错误:由于使用‘/+/’;

Class 运行时错误:由于使用‘/+/’;,class,haskell,instance,newtype,Class,Haskell,Instance,Newtype,我编写了一个简单的类型:Stack和一个类类型Stacked,其中包含两个操作“加”和“减”的实例。它已编译,但运行时产生标题上的错误。 代码是: 我已尝试使用(堆叠a)=>。。。在实例中,但没有结果。 我做错了什么 顺便说一句,我知道我必须检查[],但在这种情况下,这并不重要。如果你看看可折叠的是如何定义和实例化的,你可能想这样编码 a类,其中 (/++/)::x->ax->ax pop::a x->a x 实例堆栈在哪里 (/++/)x(堆栈xs)=堆栈(x:xs) pop(堆栈[])=堆栈

我编写了一个简单的类型:
Stack
和一个类类型
Stacked
,其中包含两个操作“加”和“减”的实例。它已编译,但运行时产生标题上的错误。 代码是:

我已尝试使用(堆叠a)=>。。。在实例中,但没有结果。 我做错了什么


顺便说一句,我知道我必须检查[],但在这种情况下,这并不重要。如果你看看
可折叠的
是如何定义和实例化的,你可能想这样编码

a类,其中
(/++/)::x->ax->ax
pop::a x->a x
实例堆栈在哪里
(/++/)x(堆栈xs)=堆栈(x:xs)
pop(堆栈[])=堆栈[]
pop(堆栈x)=堆栈(尾部x)
这样就可以为任何类型实现
Stacked
type类,而不依赖于类型
Stack

也可以通过将
堆栈定义为

newtype Stack a = Stack [a] deriving (Show)
我们可以通过编写
Stack Int
而不是
Stack[Int]
来简单地使用它,这样
Stack
的实现(它在内部使用一个列表)就对用户隐藏了

对一元函数使用运算符不是很好,我只会使用普通函数

您应该明确地捕获空列表的情况,并且可能应该向type类添加一个类似于
isEmpty
的函数。

类型签名
(/++/)
(/++/)::a->Stack[a]->Stack[a]
,因此对于您的实例
Stack Stack a
,它意味着
(/++/)
具有类型
堆栈a->Stack[Stack a]->Stack[Stack a]
。您可能希望使用
(/++/):a->sa->sa
创建一个类
类。
newtype Stack a = Stack [a] deriving (Show)