Práctico 3, Ejercicio 8

Re: Práctico 3, Ejercicio 8

de Marcos Viera - InCo -
Número de respuestas: 0
Hola,

El problema es que justamente las implementaciones son demasiado iguales, y en este caso el foldr no puede aprovechar la evaluación perezosa (o corto-circuito en términos de P1) del operador (||).
Recordemos que el comportamiento de foldr es: foldr f v [x1,x2,...,xn] ~>* f x1 (f x2 (... (f xn v)))
entonces en tu caso, como en tu f el resultado de la llamada recursiva lo ponés a la izquierda del ||, te quedaría algo como:
(((...||3==1))||(2==1)) || (1==1), donde tenés que resolver toda la subexpresión izquierda (que implica recorrer toda la lista) antes de saber que es True porque (1==1).

si en tu implementación definís:
f x res = x==a || res
entonces sí tendrías algo del estilo: (1==1) || ((2==1) || ((3==1) || ..))
que corta al encontrarse conque (1==1) es True.

saludos