为Haskell堆栈编写pop和push函数

时间:2013-03-02 14:23:45

标签: function haskell stack push pop

您好我正在尝试为这样定义的Haskell堆栈创建pop和push函数:

data mystack = Empty | Elem Char mystack deriving Show

如果我没有这个定义限制,我会像这样推送

push x mystack = (x:mystack)

并像这样弹出

pop mystack = head mystack

但是由于这个限制,我不知道如何实现这些功能。 你能给我一些提示怎么做吗? 我甚至不能自己编写带有该描述的Stack类型。

1 个答案:

答案 0 :(得分:8)

提示:以下是使用内置列表实现堆栈操作的方法:

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相当于(:)。我不会给你代码来完成这件事,因为为自己搞清楚是一半的乐趣!