2010-06-22 3 views
1

Я создаю функцию, которая объединяет тройные деревья списков, используя аккумулятор.Конкатенационные списки в тернарных деревьях

19 data Ttree t = Nil | Node3 t (Ttree t) (Ttree t) (Ttree t) 
20 
21 acc :: Ttree [a] -> [a] 
22 acc tree = acc' tree [] 
23 
24 acc' :: Ttree [a] -> [a] -> [a] 
25 acc' Nil rest = rest 
26 acc' (Node3 xs l m r) rest = 
27  xs $ acc' l $ acc' m $ acc' r rest 

Я получаю эту ошибку, используя ghc. Но я не вижу, как ожидаемый тип хз является -> Ь:

e6.hs:26:4: 
    Couldn't match expected type `a -> b' against inferred type `[a1]' 
    In the first argument of `($)', namely `xs' 

ответ

6

левая сторона из ($) должна быть функцией (т.е. типа a -> b), который xs явно не так. Помните, что определение ($) является

f $ x = f x 

это не подмен скобки в целом. Вероятно, вы хотите

acc' (Node3 xs l m r) rest = xs ++ (acc' l . acc' m . acc' r) rest 

вместо этого.

(Обратите внимание, что это не хвостовая рекурсия.)

0

Небольшое дополнение к ответу Кенни:

Prelude>: т ($)

($) :: (а - > b) -> a -> b

Смежные вопросы