我想将postfix表达式转换为二叉树 . 我的函数将标记列表作为参数(字符串) .
每次我给函数任何输入时,调试器都会写一条消息:函数“add”中的非详尽模式 .
我的想法是:在令牌之后读取令牌并确定它是否是运算符或操作数 . 如果是操作数,请不要将任何节点保存到树中并将数字存储到堆栈中 . 否则,我创建一个带有运算符的节点,从堆栈中弹出符号,将它们设置为新节点的子节点,并将运算符推送到堆栈 .
如果字符串列表为空,则函数将打印二叉树 .
有人会向我解释,为什么函数会给出非详尽的模式错误,我该如何修复这个函数?
data Tree = Leaf String | Empty | Node Tree String Tree deriving (Show)
add :: Tree -> [String] -> [Tree] -> Tree
add (Node l v p) [] stack = (Node l v p)
add Empty (x:xs) []
| x `elem` ["*","-","+"] = add (Leaf x) xs [Leaf x]
| otherwise = add Empty xs [Leaf x]
add Empty (x:xs) (a:b:bs)
| x `elem` ["*","-","+"] = add (Node b x a) xs (Leaf x:a:b:bs)
| otherwise = add Empty xs (Leaf x:a:b:bs)
add (Leaf x) token (a:b:bs)
| x `elem` ["*","-","+"] = add (Node b x a) token (Leaf x:bs)
| otherwise = Leaf x
add (Node l v p) (x:xs) (a:b:bs)
| x `elem` ["*","-","+"] = add (Node b x a) xs (Leaf x:bs)
| otherwise = add (Node l v p) xs (Leaf x:a:b:bs)
parse :: String -> Tree
parse input = add Empty (words (toPostfix input)) []
1 回答
我已经设法通过简单的例子重现错误:
程序成功地将
Leaf "10"
添加到堆栈中,但无法将Leaf "1"
添加到堆栈中,因为使用以下args调用add
:但它与任何模式都不匹配,因为
add Empty (x:xs) (a:b:bs)
期望第三个参数有两个Tree
元素和一个列表 . 因此,需要将第三个参数与具有一个元素的列表匹配的模式 . 例如,添加:修复错误并打印以下内容:
希望它能帮助你继续完成任务,除非你已经解决了它:)