data Tree a = Tree a [Tree a]
Si noti che non si accettano alberi vuoti e che una foglia è un albero con una lista vuota di sottoalberi.operazione di haskell fold sull'albero
treeFold :: (a -> [b] -> b) -> Tree a -> b
treeFold f (Tree x s) = f x (map (treeFold f) s)
Date le informazioni di cui sopra, non capisco come la funzione di piegatura albero restituisce un risultato applicando ricorsivamente l'operazione di piegatura per sottoalberi, quindi applicando la funzione all'etichetta alla radice ed i risultati restituito dai sottoalberi.
Inoltre non capisco come la funzione di piegatura albero richieda solo un argomento anziché 2, quando viene passato come argomento alla funzione mappa e continua a essere compilato e eseguito correttamente.
Ad esempio, la funzione di dimensione albero seguente, conta i nodi dell'albero.
treeSize :: Tree a -> Int
treeSize = treeFold (\x ys -> 1 + sum ys)
Quindi lanciando Treesize albero dove tree = Tree 4 [Tree 1 [Tree 2 [], Tree 3 []]]
dà la dimensione dell'albero come 4.
Nella funzione dimensione albero sopra, la funzione di albero piega è anche passato un argomento invece di due. Inoltre, la x che viene passata alla funzione di piegatura dell'albero non viene utilizzata da nessuna parte, quindi perché ne hai bisogno lì. Rimuovendolo, il programma non viene compilato e viene visualizzato il seguente messaggio di errore.
Couldn't match type `a' with `[[Int] -> Int]'
`a' is a rigid type variable bound by
the type signature for treeSize :: Tree a -> Int
at treeFold.hs:15:1
In the first argument of `sum', namely `ys'
In the second argument of `(+)', namely `sum ys'
In the expression: 1 + sum ys
Qualsiasi aiuto sarebbe molto apprezzato.
[Perché la programmazione funzionale è importante] (http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf). –