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ù.
- 1. Versione Haskell di Idris! -notazione (notazione bang)
- 2. Sommatoria condizionale in PostgreSQL
- 3. Fibonacci serie - sommatoria ricorsivo
- 4. Come scrivere l'espressione di sommatoria in HTML?
- 5. Come vectorize doppia sommatoria in MATLAB
- 6. Sommatoria dell'array cummulativo usando OpenCL
- 7. Haskell è stato progettato per incoraggiare la notazione ungherese?
- 8. Ridurre la risoluzione dell'array attraverso sommatoria
- 9. Qual è il tipo di variabile in notazione qui in Haskell?
- 10. Notazione Slice in Scala?
- 11. Notazione Zed in LyX
- 12. Dezuccheraggio do-notazione per Monadi
- 13. Haskell: La notazione "fare" può essere utile in contesti diversi dalle monadi?
- 14. Equivalente alla notazione Haskell o alle espressioni di calcolo F # in Scala?
- 15. Notazione scientifica colorbar in matplotlib
- 16. R notazione scientifica in trame
- 17. Notazione bretelle ricce in PHP
- 18. Notazione di ellissi in C#?
- 19. lettura notazione scientifica in C
- 20. Corrispondenza fuori servizio in Haskell
- 21. Converti notazione scientifica in decimale in bash
- 22. Scala equivalente di do-la notazione di Haskell (ancora una volta)
- 23. Java int ... notazione array
- 24. matlab matrix notazione scientifica
- 25. jQuery Notazione array oggetto
- 26. notazione dot JavaScript
- 27. Transizione da infisso a notazione prefisso
- 28. Javascript se notazione breve
- 29. Notazione di probabilità
- 30. C e puntatore notazione
Aah, ora lo vedo. Avevo fatto una ricerca di "foldl" ma la pagina di Wikipedia utilizza "fold". –