您好我正在尝试为这样定义的Haskell堆栈创建pop和push函数:
data mystack = Empty | Elem Char mystack deriving Show
如果我没有这个定义限制,我会像这样推送
push x mystack = (x:mystack)
并像这样弹出
pop mystack = head mystack
但是由于这个限制,我不知道如何实现这些功能。 你能给我一些提示怎么做吗? 我甚至不能自己编写带有该描述的Stack类型。
答案 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
相当于(:)
。我不会给你代码来完成这件事,因为为自己搞清楚是一半的乐趣!