Nella pagina Wikipedia di summation si dice che l'operazione equivalente in Haskell è quella di utilizzare foldl. La mia domanda è: c'è qualche ragione per cui si dice di usare questo invece della somma ? Uno è più "purista" dell'altro o non c'è alcuna differenza reale?Notazione sommatoria in Haskell
risposta
foldl
è una funzione di riduzione tail-recursive generale. La ricorsione è il solito modo di pensare a manipolare liste di elementi in un linguaggio di programmazione funzionale e fornisce un'alternativa all'iterazione del ciclo che è spesso molto più elegante. Nel caso di una funzione di riduzione come fold
, l'implementazione coda-ricorsiva is very efficient. Come altri hanno spiegato, sum
è quindi solo un mnemonico conveniente per foldl (+) 0 l
.
Presumibilmente il suo uso nella pagina di Wikipedia è di illustrare il principio generale della sommatoria attraverso la ricorsione della coda. Ma dal momento che la libreria Haskell Prelude contiene sum
, che è più breve e più ovvio da comprendere, dovresti utilizzarlo nel tuo codice.
Ecco uno nice discussion delle funzioni fold
di Haskell con esempi semplici che vale la pena leggere.
Non vedo dove dice Haskell o foldl
su quella pagina di Wikipedia, ma sum
in Haskell è solo un caso più specifico di foldl
. Si può essere implementato in questo modo, per esempio:
sum l = foldl (+) 0 l
che può essere ridotto a:
sum = foldl (+) 0
Non v'è alcuna differenza. Quella pagina sta semplicemente dicendo che lo sum
è implementato usando foldl
. Basta usare sum
ogni volta che è necessario calcolare la somma di un elenco di numeri.
Come affermato dagli altri, non c'è differenza. Tuttavia, una chiamata di somma è più facile da leggere rispetto a una chiamata di piega, quindi andrei a chiedere la somma se hai bisogno di una somma.
Una cosa da notare è che la somma può essere più pigra di quanto si vorrebbe, quindi considera l'uso di foldl '.
Il concetto di sommatoria può essere esteso a tipi non numerici: tutto ciò che serve è qualcosa di equivalente a un'operazione (+) e un valore zero. In altre parole, è necessario un monoid. Questo porta alla funzione Haskell "mconcat", che restituisce la somma di un elenco di valori di un tipo monoid. Il "mconcat" predefinito è ovviamente definito in termini di "mappend" che è l'operazione più.
Aah, ora lo vedo. Avevo fatto una ricerca di "foldl" ma la pagina di Wikipedia utilizza "fold". –