我试图在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]
答案 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])