为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 但是由于这个限制,我不知道如何实现这

嗨,我正在尝试为定义如下的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
但是由于这个限制,我不知道如何实现这些功能。 你能告诉我怎么做吗?
我自己甚至无法用这种描述来编写堆栈类型

提示:以下是如何使用内置列表实现堆栈操作:

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的语法就是这样设计的。