Práctico 4, Ejericio 3)c)

Práctico 4, Ejericio 3)c)

de Nicolas Grosso San Roman -
Número de respuestas: 2

Hola!

Me surgió una duda sobre la composición de funciones al tratar de realizar esta parte. 

Desde la consola traté de ejecutar la instrucción: inorder.mkTree [algunos números], pero me daba error, ya que parece que mkTree está tomando como argumento a la lista antes de que se realice la composición. Sin embargo, me queda la duda de por qué esto no funciona.

Los tipos son:

inorder :: Tree a -> [a]

mkTree :: [a] -> Tree a

donde claramente los tipos coinciden para la composición. Luego, si primero aplicamos mkTree a la lista, esto nos da una "función" de solamente un tipo: Tree a. Entonces, por qué es que desde aquí no se puede aplicar la composición con inorder si los tipos aún coinciden?

Espero no haber confudido, gracias!


En respuesta a Nicolas Grosso San Roman

Re: Práctico 4, Ejericio 3)c)

de Marcos Viera - InCo -
Hola,

El problema es que si hacés:

inorder . mkTree [algunos números]

es equivalente a hacer:

inorder . (mkTree [algunos números])

por lo que estás intentando componer la función inorder, de tipo Tree a -> [a], con el resultado de hacer (mkTree [algunos números]), que tiene tipo Tree a.
Ahí no coinciden los tipos, porque la composición toma dos funciones, una b -> c y otra a -> b, y Tree a no tiene esa forma.

Lo que deberías hacer es:
(inorder . mkTree) [algunos números]

de manera de primero componer y luego aplicar la función compuesta a la lista de números.

Ahora espero yo no haberte confundido más :-)
Cualquier cosa volvé a consultar.

saludos