使用折叠在Haskell中的二叉树上执行有序遍历

时间:2017-05-09 23:16:03

标签: haskell binary-tree fold

我试图在Haskell中使用fold的修改版本来实现有序遍历功能:

foldT :: (u -> u -> u) -> (a -> u) -> Tree a -> u
foldT f g (Tip a) = g a
foldT f g (Node l r) = f (foldT f g l) (foldT f g r)

但是我对如何实现这个功能感到困惑,我的尝试是:

inorderT :: Ord a => Tree a -> [a]
inorderT = foldT (\x l r -> l ++ x ++ r) []

非常感谢任何帮助!

错误讯息:

Couldn't match expected type ‘[a]’ with actual type ‘[a] -> [a]’
• In the first argument of ‘foldT’, namely
    ‘(\ x l r -> l ++ x ++ r)’
  In the expression: foldT (\ x l r -> l ++ x ++ r) []
  In an equation for ‘inorderT’:
      inorderT = foldT (\ x l r -> l ++ x ++ r) []
• Relevant bindings include
    inorderT :: Tree a -> [a]

1 个答案:

答案 0 :(得分:0)

我已经从foldT定义重建了树数据类型。看看它不是常用的Node a (Tree a) (Tree a)形式,因此您的(\x l r -> l ++ x ++ r)错误。

检查您的代码,然后看看这是否是您所需要的:

data Tree a = Tip a | Node (Tree a) (Tree a)

foldT :: (u -> u -> u) -> (a -> u) -> Tree a -> u
foldT f g (Tip a)    = g a
foldT f g (Node l r) = f (foldT f g l) (foldT f g r)

inorderT :: Tree a -> [a]
inorderT = foldT (\l r -> l ++ r) (\x -> [x])