为Haskell堆栈编写pop和push函数
嗨,我正在尝试为定义如下的Haskell堆栈创建pop和push函数:为Haskell堆栈编写pop和push函数,haskell,stack,Haskell,Stack,嗨,我正在尝试为定义如下的Haskell堆栈创建pop和push函数: data mystack = Empty | Elem Char mystack deriving Show 如果我没有这个定义限制,我会这样推 push x mystack = (x:mystack) pop mystack = head mystack 像这样流行 push x mystack = (x:mystack) pop mystack = head mystack 但是由于这个限制,我不知道如何实现这
data mystack = Empty | Elem Char mystack deriving Show
如果我没有这个定义限制,我会这样推
push x mystack = (x:mystack)
pop mystack = head mystack
像这样流行
push x mystack = (x:mystack)
pop mystack = head mystack
但是由于这个限制,我不知道如何实现这些功能。
你能告诉我怎么做吗?
我自己甚至无法用这种描述来编写堆栈类型 提示:以下是如何使用内置列表实现堆栈操作:
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)
(:)xxs
是另一种书写x:xs
的方式
要单独使用
MyStack
类型执行此操作,请注意,您的Empty
实际上与[]
一样工作,Elem
相当于(:)
。我不会直接给你代码去做这件事,因为你自己搞清楚这件事有一半的乐趣 你肯定需要阅读你也需要检查你的标识符。data
关键字后面的令牌应该以大写字母开头:data MyStack=Empty | Elem Char MyStack deriving(Show)
ps,您可能没有意识到这一点,但实际上只是重新定义了内置列表MyStack
与[Char]
相同(与String
相同),只是具有不同名称的值构造函数。现在我可以编写像Elem'a'Elem'b'Empty这样的堆栈。我试着这样写推送函数:push x Empty=Element x
push x MyStack=Element x MyStack
它不起作用。那不应该是push x Empty=Elem x Empty
和push x MyStack=Elem x MyStack
?(另外,这两个等式中的第一个是多余的)如果您使用(:)
而不是中缀:
来表明:
只是一个数据构造函数,与Elem
相同,尽管语法有点不同,但这种关系可能会更加明显。谢谢您,您的提示确实帮了大忙。我终于明白了:)当我这样写函数时:push::Char->Stack->Stack push x Empty=(Element x Empty)push x Stack=(Element x Stack)
我得到这个输入的错误:push'a'Element'b'Empty
我得到这个输出Element'a'(Element'b'Empty)
对于这个输入push'a'(Element'b'Empty)
如何获得此输出:Element'a'Element'b'Empty
对于此输入:push'a'Element'b'Empty
再次感谢您的帮助。您的函数按其应有的方式运行。您需要在push
的第二个参数周围加括号。Haskell的语法就是这样设计的。