estoy actualmente atascado en una pregunta del capítulo 7. IFPHHaskell: vago frente a la evaluación ávido de ordenación por inserción
Es Ejercicio 7.1.2 que dice:
"Una definición de sort
es tomar sort = foldr insert []
donde
insert x [] = [x]
insert x (y:ys) = if x <= y then x : y : ys else y : insert x ys
Give, en detalle, las secuencias de reducción de evaluación ansiosos y perezosos para la expresión sort [3,4,2,1]
, explicando en lo que difieren"
Ahora, comencé con la secuencia de reducción de evaluación entusiasta primero, que supongo que es más interna reducción.
Para mí esto rendimientos ...
sort [3,4,2,1]
=> foldr insert [] [3,4,2,1]
=> insert 3 (foldr insert [] [4,2,1])
=> insert 3 (insert 4 (foldr insert [] [2,1]
=> insert 3 (insert 4 (insert 2 (foldr insert [] [1])))
=> insert 3 (insert 4 (insert 2 (insert 1 (foldr [] []))))
=> insert 3 (insert 4 (insert 2 (insert 1 [])))
=> insert 3 (insert 4 (insert 2 [1]))
=> insert 3 (insert 4 (1 : insert 2 []))
=> insert 3 (insert 4 (1 : [2]))
=> insert 3 (1 : insert 4 [2])
=> insert 3 (1 : 2 : insert 4 [])
=> insert 3 (1 : 2 : [4])
=> insert 3 [1,2,4]
=> 1 : insert 3 [2,4]
=> 1 : 2 : insert 2 : [4]
=> 1 : 2 : 3 : [4]
=> [1,2,3,4]
¿Qué es la lista ordenada.
Ahora, para la evaluación perezosa, la única secuencia de reducción que puedo pensar es exactamente la misma que para la evaluación entusiasta. Claro, Haskell hace la evaluación más extrema a la izquierda para la evaluación perezosa: pero no creo que pueda operar en la mayor parte de la lista hasta que se completen los cálculos internos.
¿Este razonamiento es correcto? La intuición me dice que no.
Si alguien pudiera señalar cómo realizar la secuencia de reducción de evaluación lenta que sería genial.
Gracias
¿Qué es IFPH? Buscar en Google el texto de la cita solo muestra esta página. –
Introducción a la programación funcional usando Haskell por Richard Bird – Mark