使用算术表达式的解析树,如何在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的答案。我建议您开始编写更简单的案例,然后在对简单案例满意后添加额外的优先级信息。