2009-08-27 23 views
6

En la página de Wikipedia summation dice que la operación equivalente en Haskell es usar foldl. Mi pregunta es: ¿hay alguna razón por la que dice usar esto en lugar de suma? ¿Es uno más "purista" que el otro, o no hay una diferencia real?Notación de suma en Haskell

Respuesta

11

foldl es una función de reducción general tail-recursive. La recursividad es la forma habitual de pensar sobre la manipulación de listas de elementos en un lenguaje de programación funcional, y proporciona una alternativa a la iteración de bucle que a menudo es mucho más elegante. En el caso de una función de reducción como fold, la implementación recursiva de cola is very efficient. Como otros han explicado, sum es simplemente un conveniente mnemónico para foldl (+) 0 l.

Presumiblemente, su uso en la página wikipedia es para ilustrar el principio general de suma a través de la recursividad de la cola. Pero como la biblioteca Haskell Prelude contiene sum, que es más corta y más obvia de entender, debe usarla en su código.

Aquí hay un nice discussion de Haskell's fold funciones con ejemplos simples que vale la pena leer.

3

No veo dónde dice nada sobre Haskell o foldl en esa página de Wikipedia, pero sum en Haskell es solo un caso más específico de foldl. Se puede implementar de esta manera, por ejemplo:

sum l = foldl (+) 0 l 

que puede reducirse a:

sum = foldl (+) 0 
+0

Aah, ahora lo veo. Hice una búsqueda de 'foldl' pero la página de Wikipedia usa 'fold'. –

0

No hay ninguna diferencia. Esa página simplemente dice que sum se implementa usando foldl. Simplemente use sum siempre que necesite calcular la suma de una lista de números.

1

Según lo manifestado por los otros, no hay diferencia. Sin embargo, una sumatoria es más fácil de leer que un fold-call, así que iría por la suma si necesita un resumen.

2

Una cosa a tener en cuenta es que la suma puede ser más lenta de lo que desearía, así que considere usar foldl '.

0

El concepto de suma se puede extender a tipos no numéricos: todo lo que necesita es algo equivalente a una operación (+) y un valor cero. En otras palabras, necesita un monoid. Esto lleva a la función Haskell "mconcat", que devuelve la suma de una lista de valores de un tipo monoide. El "mconcat" predeterminado, por supuesto, se define en términos de "mappend", que es la operación más.