2009-08-27 8 views
6

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

11

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.

3

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 
+0

Aah, ora lo vedo. Avevo fatto una ricerca di "foldl" ma la pagina di Wikipedia utilizza "fold". –

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.

1

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.

2

Una cosa da notare è che la somma può essere più pigra di quanto si vorrebbe, quindi considera l'uso di foldl '.

0

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ù.