UTNianos

Versión completa: [Haskell] Aplicación Parcial
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Chicos, me pueden dar una mano para interpretar una Aplicación Parcial en funcional??

Digamos que según entendí aplicar parcialmente a una función es llamar a la función pero dandole una menor cantidad de parámetros que la que se definió, esto me da como resultado una nueva función con menos cantidad de parametros que la original.

El apunte da este ejemplo que no termino de entender

map :: (a -> b) -> [a] -> [b]
>map length ["Hola","mundo"]
[4,5]

(map length) ["Hola","mundo"]

"(map length)" es aplicar parcialmente una función? donde se genera una nueva función de este tipo "map length :: [[a]] -> [Int]"
donde recibe un unico parametro que es una lista ["Hola","mundo"] y devuelve una lista de enteros?

Es lo mismo que decir (map.length) ["Hola","mundo"] ?
Todo lo que decís es correcto,

Salvo lo último

"Es lo mismo que decir (map.length) ["Hola","mundo"] ?"

ahí estás usando el ".", que es el operador de composición... pero lo estás usando mal... Vos lo que querés hacer es aplicar parcialmente el Map usando el length, no componerlo con el length ..

Me da la sensación que entendiste bien el concepto de aplicación parcial, pero no el de composición, si querés un ejemplo de algo parecido con una composición podría ser algo así:

(map length . (filter (\e -> (length e) < 6))) ["hola", "palabraconmuchoscaracteres", "mundo"]

El ejemplo que te pegue a la lista original le filtra los elementos con 6 o más caracteres, y despues mapea esos elementos a sus tamaños... Tenés un map y un filter aplicados parcialmente, tenés una función lambda y tenés la composición del map con el filter....

La respuesta de esa llamada es la misma que en tu ejemplo [4, 5]

Espero haberte ayudado en algo..
saludos !
La idea de la aplicación parcial la tenes correcta, lo que falla es el ejemplo que propones. En la composición de funciones es clave si se quiere la aplicación parcial, porque lo que vos buscas es una función compleja que tenga un solo parámetro. Es decir

f x = h.g x

Caso práctico de como entra aplicación parcial en esto:

Ponele que queres sacar el primer elemento, de los primeros 6 de una lista. Tendrías que componer las funciones take y head, pero que pasa, take tiene 2 parámetros y head 1, por tanto no va matchear lo que se hace es lo siguiente:

funcionLoca x = (head . take 6) x

Es decir, a la función que tiene n paramétros, se le pasan como si fueran constantes (n-1) parámetros, y justamente esto es aplicación parcial.
Gracias chicos! me parece que ya estoy entendiendo =)

Entonces Diego

funcionLoca x = (head . take 6) x

Sería:

take 6 x que cumple con los dos parametros de take y me devuelve la "listaSeisElementos".

head listaSeisElementos, que cumple con el parámetro lista que debe recibir y me devuelve el primero de la lista de los 6 elementos.

Entonces digamos que con un solo parámetro, en este caso x, pude aplicar las dos funciones, head (de 1 parámetro) y take (de 2 parámetros).
Exacto, la idea de usar aplicación parcial, es que la composición de funciones no se limite a funciones que tengan la misma cantidad de parámetros y que además coincidan, porque se haría muy engorroso. Por lo tanto, como lo entendes vos está bien, la idea es "transformar" a todas las funciones a unas que fueran de 1 solo parametro, con ese artilugio llamado aplicacion parcial =)
(23-04-2014 16:08)romysory2010 escribió: [ -> ]Chicos, me pueden dar una mano para interpretar una Aplicación Parcial en funcional??

Digamos que según entendí aplicar parcialmente a una función es llamar a la función pero dandole una menor cantidad de parámetros que la que se definió, esto me da como resultado una nueva función con menos cantidad de parametros que la original.

El apunte da este ejemplo que no termino de entender

map :: (a -> b) -> [a] -> [b]
>map length ["Hola","mundo"]
[4,5]

(map length) ["Hola","mundo"]

"(map length)" es aplicar parcialmente una función? donde se genera una nueva función de este tipo "map length :: [[a]] -> [Int]"
donde recibe un unico parametro que es una lista ["Hola","mundo"] y devuelve una lista de enteros?

Es lo mismo que decir (map.length) ["Hola","mundo"] ?






preguntilla.... me estoy enquilombando con aplicacion parcial.... (composicion de funciones lo sé)
"map length :: [[a]] -> [Int]"
¿no sería?
map length :: [a] -> [Int] ???
si la respuesta es SI entonces lo entendi, sino no.... porque miren yo lo veo/entiendo asi esto de aplicacion parcial.

funcionPiola ListaPalabras= map length ListaPalabras

funcionPiola:: [a]-> [Int]..... nose porque pero lo veo asi yo, con este ejemplo lo veo,o sea funcionPiola recibe solo 1 parametro, cuando map en realidad recibe 2 parametros (condicion y lista)

sin la funcionPiola me quedaria
map:: ([a]->int)->[a]->[int]
--------cond-----list---Rta_ints


gracias y saludos!
Al menos a mi no me quedo muy en claro lo que quisiste decir, así que trataré de responderte lo que entendí, de última repregunta si es que entendí mal.

La forma correcta de definir el tipo de map length es:

map length :: [[a]] -> [Int]

Porque al estar aplicado parcialmente map, te acota el dominio de lo que podés tomar. Es decir, map está definida como:

map :: (a -> b) -> [a] -> [b]

Vos acá ya tenes aplicado parcialmente tu primer parámetro, y como length está definido como length :: [a] -> Int, ahora tu dominio va a estar acotado, ya que map no puede recibir una lista con valores de tipo a dentro, sino tiene que recibir una lista de listas de tipo a, ya que map aplica tu función a cada elemento de la lista, por tanto para que funcione como length es tu función, cada uno de esos elementos va a tener que ser una lista de a. No se si me explico. Esto también es análogo con tu funciónLoca.

Con un ejemplo quizá es más claro, definiéndolo de la manera que vos lo planteaste

funcionPiola :: [a] -> [Int]

Podría recibir esto como parámetro [3,4,6] o [True,False,True]. Cuando hagas el map length, va a tirar error de tipado ya que no vas a poder hacer el length de 3 o de True. En el caso que vos te confundas por si le pasas una lista de este estilo: ["Hola","Que","Tal"], recorda que un string es una lista de caracteres por lo tanto estás usando [[a]], no [a].
(25-05-2014 02:48)Diego Pedro escribió: [ -> ]Al menos a mi no me quedo muy en claro lo que quisiste decir, así que trataré de responderte lo que entendí, de última repregunta si es que entendí mal.

La forma correcta de definir el tipo de map length es:

map length :: [[a]] -> [Int]

Porque al estar aplicado parcialmente map, te acota el dominio de lo que podés tomar. Es decir, map está definida como:

map :: (a -> b) -> [a] -> [b]

Vos acá ya tenes aplicado parcialmente tu primer parámetro, y como length está definido como length :: [a] -> Int, ahora tu dominio va a estar acotado, ya que map no puede recibir una lista con valores de tipo a dentro, sino tiene que recibir una lista de listas de tipo a, ya que map aplica tu función a cada elemento de la lista, por tanto para que funcione como length es tu función, cada uno de esos elementos va a tener que ser una lista de a. No se si me explico. Esto también es análogo con tu funciónLoca.

Con un ejemplo quizá es más claro, definiéndolo de la manera que vos lo planteaste

funcionPiola :: [a] -> [Int]

Podría recibir esto como parámetro [3,4,6] o [True,False,True]. Cuando hagas el map length, va a tirar error de tipado ya que no vas a poder hacer el length de 3 o de True. En el caso que vos te confundas por si le pasas una lista de este estilo: ["Hola","Que","Tal"], recorda que un string es una lista de caracteres por lo tanto estás usando [[a]], no [a].


genial ! ahi entendi con lo de lista de caracteres, que bobo no me di cuenta
ultima pregunta


funcionPiola ListaCosas= map length ListaCosas

funcionPiola:: [[a]]-> [Int]

¿esta funcionPiola entonces tiene aplicacion parcial verdad?

gracias!!
Diesel, no es que tiene aplicación parcial sino más bien que funcionPiola es una aplicación parcial de la función map length (lo que es lo mismo que decir queda evaluada parcialmente y representa una función).

De ahi en adelante podemos decir que esta técnica (aplicacion parcial) permite GENERAR nuevas funciones e interviene el concepto de evaluación diferida, pero esto creo seria ahondar en otra cuestión, bleh!yuk
URLs de referencia