Prueba 2017 ejercicio 2

Prueba 2017 ejercicio 2

de Maria Victoria Armand Ugon De Souza -
Número de respuestas: 1

Letra:

2. Dadas las siguientes definiciones: l1 = 1 : l2 + [3]

l2 = 2 : l1

¿Cu ́al de las siguientes afirmaciones es correcta?

(a) (last l1) retorna 3 usando evaluaci ́on por valor 

(b) (last l1) retorna 3 usando evaluaci ́on perezosa

(c) ((head ◦ tail ◦ tail ) l1 ) retorna 1 usando evaluaci ́on por valor 

(d) ((head ◦ tail ◦ tail ) l1 ) retorna 1 usando evaluaci ́on perezosa

respuesta (d)

Mi duda es porque la (b) no es correcta tambien ya que en la expresion:

last l1 = last (1:l2 ++[3])

El redex mas externo es last(...) y el ultimo elemento de la lista seria 3 entonces el resultado de last l1 = 3.

Que estoy haciendo mal?

En respuesta a Maria Victoria Armand Ugon De Souza

Re: Prueba 2017 ejercicio 2

de Germán Ferrari -

Hola.

Este ejercicio lo vimos en la consulta. Copio la respuesta acá así les queda para otros compañeros.

Para estos ejercicios sirve tener presente las definiciones de las funciones involucradas, por ejemplo en este caso podemos definir last como:

last [x         ] = x
last (_ : x : xs) = last (x : xs)

El problema que tenés en tu razonamiento es que para evaluar last necesariamente vas a tener que ir descartando elementos que están al principio de la lista que recibe como argumento hasta llegar al último, y en ese proceso vas a tener que ir reduciendo l2 y l1 sucesivamente. Eso hace nunca llegues a observar una lista con un solo elemento, que es el único caso en last produce algo, y por eso la llamada termina divergiendo.

Saludos,
Germán.