嗨,我正在尝试为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等效于(:)。我不会直接为您提供执行此操作的代码,因为亲自搞清楚是一半的乐趣!

10-08 14:31