La aplicación canónica de length :: [a] -> Int
es:¿Cómo escribo una función de longitud de espacio constante en Haskell?
length [] = 0
length (x:xs) = 1 + length xs
que es muy bonito pero sufre de desbordamiento de pila, ya que utiliza el espacio lineal.
La versión recursiva de cola:
length xs = length' xs 0
where length' [] n = n
length' (x:xs) n = length xs (n + 1)
no sufren de este problema, pero no entiendo cómo esto puede funcionar en el espacio constante en un lenguaje vago.
¿No es el tiempo de ejecución la acumulación de numerosos (n + 1)
thunk mientras se mueve a través de la lista? ¿No debería funcionar esto Haskell para consumir O (n) espacio y conducir al desbordamiento de la pila?
(si importa, estoy usando GHC)
El código del interrogador realmente desborda la pila. En términos generales, en Haskell la recursividad de cola no hace ** ** lo que usted espera que haga, y las funciones recursivas de cola perezosas a menudo son errores. Vea aquí: http://www.haskell.org/haskellwiki/Foldr_Foldl_Foldl 'Regla de oro: haga que sea estricto como 'foldl'', o haga que se repita en un constructor como' foldr'. –
Aw, nueces. A Markdown no le gustan los apóstrofes al final de una URL, al parecer. Probemos de nuevo: http://www.haskell.org/haskellwiki/Foldr_Foldl_Foldl%27 –