La proprietà che fold ha è che è una funzione di ricorsività di lista, che è equivalente a tutte le altre funzioni di ricorsività dell'elenco, purché gli si forniscano i parametri corretti.
Ha questa proprietà, perché accetta come parametro, le funzioni che verranno applicate agli elementi nell'elenco.
Ad esempio, se abbiamo scritto una semplice funzione di somma:
sum [] = 0
sum (head:tail) = head + (sum tail)
allora potremmo effettivamente scrivere come una funzione di piegatura invece, passando l'operatore (+) che si vuole utilizzare per combinare la articoli:
sum list = foldl (+) 0 list
Quindi qualsiasi funzione che agisce in modo semplice e ricorsivo su un elenco può essere riscritta come una funzione di piegatura. Quell'equivalenza è la proprietà che detiene. Credo che chiami la proprietà universale, perché funziona su tutti gli di questi algoritmi ricorsivi a elenco lineare, senza eccezioni.
E come spiega, la ragione per cui questa proprietà è così utile è che, poiché è possibile dimostrare che tutti questi altri algoritmi sono effettivamente equivalenti alla piegatura, provando qualcosa sulla piega, lo dimostriamo anche per tutti gli altri algoritmi.
Personalmente ho trovato la funzione di piegatura difficile da capire, così a volte ho usato la mia che assomiglia a questo:
-- forall - A kind of for next loop
-- list is list of things to loop through
-- f is function to perform on each thing
-- c is the function which combines the results of f
-- e is the thing to combine to when the end of the list is reached
forall :: [a] -> (a->b) -> (b->b->b) -> b -> b
forall [] f c e = e
forall (x:xs) f c e = c (f x) (forall xs f c e)
(Questo è in realtà un po 'più potente di foldl perché ha la caratteristica supplementare di applicare la funzione f per ogni elemento nell'elenco.)
Beh nessuno ha dimostrato nulla della mia funzione. Ma questo non ha importanza, perché posso dimostrare che la mia funzione è di fatto una funzione duplice:
forall l f c e = foldl c e (map fn l)
e quindi tutte le cose che sono state rivelate su piega, sono anche dimostrato vero per la mia funzione forall, e tutti i suoi usi nel mio programma. (Nota non è necessario nemmeno considerare quale tipo di funzione c è fornita in ognuna delle diverse chiamate a forall e foldl, non importa!)
4 anni da quando ho chiesto, e solo stasera mi sono imbattuto in un articolo che parla di questo.Non so se risponderà pienamente alla mia domanda, ma è sicuramente correlata. Cerca questo URL per "proprietà universale": http://jeremykun.com/2013/04/16/categories-whats-the-point/ –
Funnily, quattro anni fa non sapevo nemmeno quale fosse una proprietà universale. Ora sto scrivendo quella serie di post sul blog. Che coincidenza ho attraversato questo mentre scrivevo un post più dettagliato sulle proprietà universali. Dovrebbe essere fatto nella prossima settimana. – JeremyKun
@Bean, felice di sentirlo! Non vedo l'ora di leggerlo. Perché anche se sto iniziando ad avere un sentore, sono ancora un * lungo * modo di affermare di comprendere profondamente quale sia una proprietà universale. –