así, esta es la definición de la función de filtro utilizando foldr:¿Estoy usando el razonamiento de sonido ecuacional sobre una definición de filtro en términos de foldr?
myFilter p xs = foldr step [] xs
where step x ys | p x = x : ys
| otherwise = ys
así por ejemplo digamos que tengo esta función:
myFilter odd [1,2,3,4]
por lo que será:
foldr step [] [1,2,3,4]
y esto será
step 1 (foldr step [] [2,3,4])
y esto será
step 1 (step 2 (foldr step [] [3,4]))
y esto será
step 1 (step 2 (step 3 (foldr step [] [4])))
y esto será
step 1 (step 2 (step 3 (step 4 (foldr step [] []))))
y foldr step [] []
es []
modo:
step 1 (step 2 (step 3 (step 4 [])))
ahora entraremos en la función step
.
aquí es la definición de step
dentro de la función myFilter
, desde arriba:
step x ys | p x = x : ys
| otherwise = ys
también, le recuerdo que p
es en realidad la función odd
en nuestro ejemplo. No
step 1 (step 2 (step 3 (step 4 [])))
y
x = 4
en el más interno step
y 4
es impar, así que volviendo ys
, que es []
:
así, una vez más, estamos aquí por lo que ahora tenemos esto:
step 1 (step 2 (step 3 []))
ahora, en el más interno step
, x = 3
y 3
es impar, por lo que volver x:ys
, que es 3 : []
, que es [3]
, y ahora tenemos:
step 1 (step 2 [3])
y ahora, en el interior step
, x = 2
y 2
no es extraño, por lo que volver ys
, que es [3]
, por lo que ahora vamos a obtener:
step 1 [3]
y ahora, x = 1
y 1
es impar, por lo que volver x : ys
, que es 1 : [3]
, que es [1,3]
.
Fin :-).
¿estoy en todos mis movimientos?
muchas gracias :-).
p.s. la definición de myFilter
es del libro Real World Haskell, en el capítulo 4.
gracias por eso. bueno, soy muy novato en Haskell, así que no sé todo el "backstage" de Haskell. solo necesitaba saber si es simplemente así. quizás en capítulos posteriores del libro, discutirán sobre lo que trataste de enseñarme aquí (que necesito leer más, para entenderlo) muchas gracias :-). – Elimelech
Creo que estás en el camino correcto. No llamaría esto "back-end" tanto como entender cómo funciona la evaluación perezosa. Para un caso simple como este, no importa, pero cuando veas que 'foldr' funciona en listas infinitas y' foldl' no, esto te ayudará a entender por qué. – Dan