[Ejercicio autoevaluación] [Definiciones y tipos algebraicos] [Pregunta 3]

[Ejercicio autoevaluación] [Definiciones y tipos algebraicos] [Pregunta 3]

de Hugo Sebastian Rodriguez Reyes -
Número de respuestas: 2

Estimados, tengo una duda en esta pregunta:

Dada la siguiente definición:

foo x = fst . foldr fun (Nothing,0)
 where  fun _ (Just x,i) = (Just x,i)
        fun y (Nothing,i) | x == y = (Just i,i+1)
                          | otherwise = (Nothing,i+1)
No entiendo por qué el resultado de evaluar foo 3 [1,2,4,5,3,3] da (Just 0).

Cuando corro el código a mano, empiezo con el foldr desde el último elemento de la lista, o sea que el primer pliegue es:

fun 3 (Nothing, 0), lo que devuelve (Just 0, 1).

Luego el segundo pliegue es:

fun 3 (Just 0, 1), y este patrón no está contemplado en el pattern matching de fun, porque entiendo que en el patrón 

fun _ (Just x, i), el valor de x es el mismo valor con que se llamó a foo (o sea, que es 3).

Alguien me puede explicar?

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: [Ejercicio autoevaluación] [Definiciones y tipos algebraicos] [Pregunta 3]

de Juan Pablo García Garland -
Hola.

La función  fun es total, está definida para todos los patrones.
En el caso fun _ (Just x, i), la  x es una variable (un patrón, que va a matchear con cualquier número) que luego se usa en el lado derecho.

Es cierto que como el nombre  x está en scope podría haberse usado en el cuerpo de  fun aún si no apareciera como pattern en la definición (haciendo en ese caso referencia al parámetro de foo). Eso es exactamente lo que pasa en el segundo patrón.

Las reglas de scoping funcionan de forma similar a como estamos acostumbrados si venimos de programar en lenguajes implerativos.
Al escribir:
fun y (Nothing,i) | x == y = (Just i,i+1)
                  | otherwise = (Nothing,i+1)
la  x está ligada por el parámetro de foo (que es la ocurrencia "más cercana").
Al escribir
fun _ (Just x,i) = (Just x,i)
la ocurrencia de  x del lado izquierdo es un ligador. La ocurrencia de  x del lado derecho hace referencia a él (y ahora es imposible referenciar al argumento de  foo ).


¿Se entiende?