使用算术表达式的解析树,如何在Haskell中生成中缀表达式作为结果
这是树的定义:使用算术表达式的解析树,如何在Haskell中生成中缀表达式作为结果,haskell,tree,expression-trees,haskell-platform,Haskell,Tree,Expression Trees,Haskell Platform,这是树的定义:data tree=Leaf Char |节点(Char,tree,tree) 我想以以下形式编写一个函数treeToInfix: treeToInfix :: Tree -> String 以下是一些例子: treeToInfix (Node ('*', (Node ('+', (Leaf 'a'), (Leaf 'b'))), (Leaf 'c'))) -- => "(a+b)*c" treeToInfix (Node ('-', (Node ('+', (
data tree=Leaf Char |节点(Char,tree,tree)
我想以以下形式编写一个函数treeToInfix
:
treeToInfix :: Tree -> String
以下是一些例子:
treeToInfix (Node ('*', (Node ('+', (Leaf 'a'), (Leaf 'b'))), (Leaf 'c')))
-- => "(a+b)*c"
treeToInfix (Node ('-', (Node ('+', (Leaf 'a') ,(Leaf 'b'))), (Leaf 'c')))
-- => "a+b-c"
treeToInfix (Node ('-', (Leaf 'c'), (Node ('+', (Leaf 'a') ,(Leaf 'b')))))
-- => "c-(a+b)"
treeToInfix (Node ('*', (Node ('/', (Leaf 'a'), (Leaf 'b'))), (Node ('/', (Leaf 'c'), (Leaf 'd')))))
-- => "a/b*c/d"
treeToInfix (Node ('+', (Node ('-', (Leaf 'a'), (Node ('*', (Leaf 'b'), (Leaf 'c'))))), (Node ('/', (Leaf 'd'), (Leaf 'e')))))
-- => "a-b*c+d/e"
我需要关于这个程序的算法的帮助。好吧,如果你仔细想想,操作的每个阶段都需要:
这够帮忙吗?我尽量避免只给你代码,以防这是一个家庭作业问题。我还假设您理解递归,因为它是Haskell中的一项关键技能。如果你不懂递归,请告诉我,我会写更多。鉴于这看起来像是你的家庭作业,我只是给出一个大概的想法。每个运算符都有一个优先级(可能还有关联性)。这可以简单地表示为一个数字。因此,我们的想法是将上下文的关联性作为附加参数打印出来。因此,您的函数可能如下所示:
treeToInfix :: Tree -> String
treeToInfix tr = treeAux 0 tr
treeAux :: Int -> Tree -> String
treeAux prec (Node ("+",left,right)) =
-- TODO:
-- * let's say precedence of '+' is 5
-- * generate strings for children (with prec = 5)
-- * put "+" in between
-- * if prec > 5, put parantheses around the result
-- Similar for other cases
您甚至可以通过改变传递给递归调用的优先级来实现关联性。如果要删除不必要的括号,请参阅nominolo的答案。我建议您开始编写更简单的案例,然后在对简单案例满意后添加额外的优先级信息。