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)