¿Existe un expansor de ecuación para Haskell?Haskell: Equation Expander 1+ (1+ (1+ (1+ (...)))) = ∞
Algo así como foldr.com: 1+(1+(1+(1+(…))))=∞
Soy nuevo en Haskell Estoy teniendo problemas para entender por qué ciertas ecuaciones son más preferibles que otras. Creo que ayudaría si pudiera ver expandidas las ecuaciones.
Por ejemplo, encontré foldr
vs foldl
difíciles de entender al principio hasta que los vi expandirse.
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr k z xs = go xs
where
go [] = z
go (y:ys) = y `k` go ys
foldl :: (a -> b -> a) -> a -> [b] -> a
foldl f z0 xs0 = lgo z0 xs0
where
lgo z [] = z
lgo z (x:xs) = lgo (f z x) xs
De las definiciones puedo ver que foldr
se expande de esta manera:
foldr (+) 0 [1..1000000] -->
1 + (foldr (+) 0 [2..1000000]) -->
1 + (2 + (foldr (+) 0 [3..1000000])) -->
1 + (2 + (3 + (foldr (+) 0 [4..1000000]))) -->
1 + (2 + (3 + (4 + (foldr (+) 0 [5..1000000])))) -->
y foldl
expande como esto:
foldl (+) 0 [1..1000000] -->
foldl (+) (foldl (+) 0 [1]) [2..1000000]) -->
foldl (+) (foldl (+) (foldl (+) 0 [1])) [3..1000000]) -->
o de Haskell Wiki on foldr fold foldl':
let z1 = 0 + 1
in foldl (+) z1 [2..1000000] -->
let z1 = 0 + 1
z2 = z1 + 2
in foldl (+) z2 [3..1000000] -->
let z1 = 0 + 1
z2 = z1 + 2
z3 = z2 + 3
in foldl (+) z3 [4..1000000] -->
let z1 = 0 + 1
z2 = z1 + 2
z3 = z2 + 3
z4 = z3 + 4
in foldl (+) z4 [5..1000000] -->
Sin embargo, tengo problemas con ecuaciones más grandes para entender por qué las cosas funcionan de la manera que lo hacen en Haskell. Por ejemplo, la primera función de tamiz usa 1000 filtros, mientras que la segunda función de tamiz solo toma 24 para encontrar la prima 1001.
primes = sieve [2..]
where
sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]
primes = 2: 3: sieve (tail primes) [5,7..]
where
sieve (p:ps) xs = h ++ sieve ps [x | x <- t, rem x p /= 0]
-- or: filter ((/=0).(`rem`p)) t
where (h,~(_:t)) = span (< p*p) xs
he pasado un buen tiempo trabajando y ampliando con la mano. He llegado a entender cómo funciona. Sin embargo, una herramienta automatizada para expandir ciertas expresiones mejoraría en gran medida mi comprensión de Haskell.
Además creo que también podría servir para ayudar a preguntas que buscan optimizar el código Haskell:
- Optimizing Haskell Code
- Help optimize my haskell code - Calculate the sum of all the primes below two million
¿Existe una herramienta para expandir expresiones Haskell?
Creo que recuerdo en la lista de correo de Haskell Cafe algo que era casi lo que querías. Creo que se trataba de un nuevo tipo con una instancia num especial, pero mi memoria es confusa, no estoy seguro de poder encontrarla. –
+1 - Buena publicación. –