Mi è stata data la seguente domanda come parte di un incarico universitario. A causa del fatto che il modulo è molto corto, stiamo usando solo un sottoinsieme di Haskell, senza alcuno zucchero sintattico o scorciatoie idiomatiche .... Devo scrivere:
aggiungi xs ys: l'elenco formato unendo gli elenchi xs
e ys
, in quell'ordine
append (5:8:3:[]) (4:7:[]) => 5:8:3:4:7:[]
Capisco il concetto di come funziona foldr, ma sto solo iniziando con la programmazione funzionale. Sono riuscito a scrivere la seguente soluzione di lavoro (nascosta a beneficio degli altri della mia classe ...):
append = \xs -> \ys -> foldr (\x -> \y -> x:y) ys xs
Tuttavia, non posso proprio per la vita di me, spiega che diavolo sta succedendo!? L'ho scritto girando intorno all'interprete, ad esempio, la seguente riga:
foldr (\x -> \y -> x:y) [] (2:3:4:[])
che ha restituito [2:3:4]
, che mi ha indotto a provare,
foldr (\x -> \y -> x:y) (2:3:4:[]) (5:6:7:[])
che ha restituito [5,6,7,2,3,4]
quindi l'ho risolto da lì. Sono arrivato alla soluzione giusta attraverso il lavoro di congettura e un po 'di fortuna ...
Sto lavorando sulla seguente definizione di foldr:
foldr = \f -> \s -> \xs -> if null xs then
s
else
f (head xs) (foldr f s (tail xs) )
Qualcuno può aiutarmi con la mia corretta soluzione? Non riesco a capirlo ... Ho già setacciato il web, e ho anche letto alcuni thread di SE, come Come funziona foldr