Haskell - 从前缀表达式

时间:2016-05-09 20:57:27

标签: haskell recursion tree fold postfix-notation

我想从前缀表示法创建算术二叉树。

我的树被定义为:

data Tree a = Leaf Int | Node Tree String Tree deriving (Show)

我想将其转换为算术二叉树,如下所示: arithmetic tree

为了从string中评估前缀表达式,我编写了这个函数:

evaluatePrefix:: String -> Int
evaluatePrefix expression = head (foldl foldingFunction [] (reverse (words  ( expression))) )
where   foldingFunction (x:y:ys) "*" = (x * y):ys  
        foldingFunction (x:y:ys) "+" = (x + y):ys  
        foldingFunction (x:y:ys) "-" = (x - y):ys  
        foldingFunction (x:y:ys) "/" = ( x `div` y):ys  
        foldingFunction xs numberString = read numberString:xs 

这基本上是来自wikipedia

的算法
Scan the given prefix expression from right to left
for each symbol
 {
  if operand then
    push onto stack
  if operator then
   {
    operand1=pop stack
    operand2=pop stack
    compute operand1 operator operand2
    push result onto stack
   }
 }
return top of stack as result

现在我想将前缀表达式转换为算术树,这样我就可以走树并以这种方式进行评估,或者将其转换为后缀或中缀。

我该怎么做?

我想到折叠时没有评估堆栈,而是创建节点,但我不知道如何在Haskell中表达它。

任何人都可以给我一个提示吗?

1 个答案:

答案 0 :(得分:4)

这里有一个提示 - 在你的foldingFunction方法中,第一个参数是一个数字列表。使用相同的方法,但这次第一个参数将是Tree值的列表。

当折叠功能遇到一个数字时,例如" 3",你想把Leaf 3推到堆栈上。

遇到像*这样的运营商时,您希望推送Node x "*" y xyTree的{​​{1}}值堆栈中的前两个值。