2017-05-09 1 views
-1

Je suis en train de mettre en œuvre un ordre en fonction traversal en utilisant une version modifiée de fois en Haskell:Faire un dans l'ordre traversal sur un arbre binaire en Haskell utilisant un pli

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) 

Mais je suis se coincer avec la façon de mettre en œuvre la fonction, ma tentative est:

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

Toute aide est grandement appréciée!

Messages d'erreur:

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

Quel message d'erreur obtenez-vous? Et que pensez-vous que le message d'erreur signifie? – luqui

+0

J'ai mis à jour ma question pour inclure le message d'erreur, il doit y avoir un problème avec les types mais je ne suis pas sûr de savoir comment l'aborder – newbie

+0

Maintenant, faites une supposition quant à ce que signifie le message d'erreur. Cela vous indique une section spécifique de votre code - qu'est-ce qui pourrait ne pas fonctionner? Postez votre estimation. (Montrer un effort comme ça vous aide à comprendre et à aimer les gens pour vous aider car il montre que vous y avez réfléchi) – luqui

Répondre

0

Je reconstruis le type de données d'arbre de la définition foldT. Vérifiez qu'il n'est pas dans le formulaire Node a (Tree a) (Tree a) couramment utilisé, de sorte que votre (\x l r -> l ++ x ++ r) est erroné.

Vérifiez votre code, et voir plus loin si c'est ce dont vous avez besoin:

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])