Ejercicio 7 Practico 2

Ejercicio 7 Practico 2

de Ignacio Cabrera -
Número de respuestas: 4

Buenas, no estoy entendiendo bien ni el tipo ni el comportamiento de la función, me lo podrían explicar? A mi entender esta función toma una lista de enteros xs y retorna lo que sería [length(take 4 xs), sum (drop 4 xs)] pero al parecer no es así...

En respuesta a Ignacio Cabrera

Re: Ejercicio 7 Practico 2

de Marcos Viera - InCo -
En realidad no hace exactamente lo que decís. Si mirás la definición:

rara2 = zipWith (.) [length, sum ] [drop 4, take 4]

la función zipWith junta los elementos de las listas en una lista aplicando la función (.), entonces el resultado de eso sería:

rara2 = [length . drop 4, sum . take 4]

por lo que rara2 no es una función, sino una lista de funciones.
Si analizás los tipos de cada una de las funciones que integra la lista y los unificás, ahí obtenés que rara2 es una lista de funciones que son de tipo [Int] -> Int. Entonces:

rara2 :: [[Int] -> Int]
En respuesta a Marcos Viera - InCo

Re: Ejercicio 7 Practico 2

de Rodrigo Alain De La Vega Rodriguez -
Buenas! Yo no entiendo como llegas a rara2 = [length . drop 4, sum . take 4]

Hasta ahora tengo esto:
rara2 :: [[Int] -> Int]
rara2 = zipWith (.) [length, sum] [drop 4, take 4]
-- al aplicar zip se obtiene [(length, drop 4),(sum, take 4)]
-- al aplicar map (uncarry (.)) de lo anterior se obtiene ???? <---- ACA ESTA MI PROBLEMA

Mirando la definición de zipWith tengo zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] por lo tanto supongo que si aplico una función f :: a -> b -> c a un tupla se (x, y) se supone que f tomaría a = x, b=y ? Porque si es asi entonces si puedo entender tu resultado. Sino no estaría llegando.

Gracias!
En respuesta a Rodrigo Alain De La Vega Rodriguez

Re: Ejercicio 7 Practico 2

de Marcos Viera - InCo -
Podés ver a zipWith de esta forma:
- dado zipWith f [x1,..,xn] [y1,..,yn]
- resulta en [f x1 y1, ..., f xn yn]
Por lo que:
zipWith (.) [length, sum] [drop 4, take 4] = [(.) length (drop 4), (.) sum (take 4)] = [length . drop 4, sum . take 4]

Ahora, si querés ver esta definición de zipWith:
- zipWith f xs ys = map (uncurry f) (zip xs ys)

tenés
zipWith (.) [length, sum] [drop 4, take 4]
= map (uncurry (.)) (zip [length, sum] [drop 4, take 4])
= map (uncurry (.)) [(length, drop 4), (sum, take 4)]
= [uncurry (.) (length, drop 4), uncurry (.) (sum, take 4)] -- dada la definición de map
= [length . drop 4, sum . take 4] -- dada la definición de uncurry (uncurry f (x,y) = f x y)

saludos