嗨,我正在尝试为Haskell堆栈创建弹出和推送函数,如下所示:
data mystack = Empty | Elem Char mystack deriving Show
如果没有这个定义限制,我会像这样推
push x mystack = (x:mystack)
像这样流行
pop mystack = head mystack
但是由于这个限制,我不知道如何实现这些功能。
您能给我一些提示如何做这些吗?
我什至无法自己编写带有该描述的Stack类型。
最佳答案
提示:以下是使用内置列表实现堆栈操作的方式:
push :: a -> [a] -> ((),[a]) -- return a tuple containing a 'nothing' and a new stack
push elem stack = ((), (:) elem stack)
pop :: [a] -> (a, [a]) -- return a tuple containing the popped element and the new stack
pop [] = error "Can't pop from an empty stack!"
pop ((:) x stack) = (x, stack)
(:) x xs
是编写x:xs
的另一种方法。要针对自己的
MyStack
类型执行此操作,请注意,您的Empty
实际上就像[]
一样工作,并且Elem
等效于(:)
。我不会直接为您提供执行此操作的代码,因为亲自搞清楚是一半的乐趣!