Donar $20 Donar $50 Donar $100 Donar mensualmente
 


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
[Haskell] Aplicación Parcial
Autor Mensaje
romysory2010 Sin conexión
Empleado de Fotocopiadora
rsc
**

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 28
Agradecimientos dados: 32
Agradecimientos: 9 en 3 posts
Registro en: Jan 2010
Mensaje: #1
[Haskell] Aplicación Parcial Dudas y recomendaciones Paradigmas de Programación
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"] ?
23-04-2014 16:08
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] romysory2010 recibio 1 Gracias por este post
Diesel (25-05-2014)
GnZ Sin conexión
Empleado del buffet
Sin estado :(
*

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 4
Agradecimientos dados: 0
Agradecimientos: 1 en 1 posts
Registro en: Aug 2011
Mensaje: #2
RE: [Haskell] Aplicación Parcial
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 !
23-04-2014 18:13
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] GnZ recibio 1 Gracias por este post
romysory2010 (24-04-2014)
Diego Pedro Sin conexión
Secretario de la SAE
que calor no?
******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 631
Agradecimientos dados: 23
Agradecimientos: 105 en 48 posts
Registro en: May 2011
Mensaje: #3
RE: [Haskell] Aplicación Parcial
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.
23-04-2014 22:34
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Diego Pedro recibio 1 Gracias por este post
romysory2010 (24-04-2014)
romysory2010 Sin conexión
Empleado de Fotocopiadora
rsc
**

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 28
Agradecimientos dados: 32
Agradecimientos: 9 en 3 posts
Registro en: Jan 2010
Mensaje: #4
RE: [Haskell] 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).
(Este mensaje fue modificado por última vez en: 24-04-2014 11:18 por romysory2010.)
24-04-2014 11:05
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Diego Pedro Sin conexión
Secretario de la SAE
que calor no?
******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 631
Agradecimientos dados: 23
Agradecimientos: 105 en 48 posts
Registro en: May 2011
Mensaje: #5
RE: [Haskell] Aplicación Parcial
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 =)
25-04-2014 00:00
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Diego Pedro recibio 1 Gracias por este post
romysory2010 (25-04-2014)
Diesel Sin conexión
Campeon del cubo Rubik
5to año loading
****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 124
Agradecimientos dados: 90
Agradecimientos: 257 en 23 posts
Registro en: Sep 2012
Mensaje: #6
RE: [Haskell] Aplicación 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!
(Este mensaje fue modificado por última vez en: 25-05-2014 02:21 por Diesel.)
25-05-2014 02:19
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Diego Pedro Sin conexión
Secretario de la SAE
que calor no?
******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 631
Agradecimientos dados: 23
Agradecimientos: 105 en 48 posts
Registro en: May 2011
Mensaje: #7
RE: [Haskell] Aplicación Parcial
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
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Diego Pedro recibio 1 Gracias por este post
Diesel (25-05-2014)
Diesel Sin conexión
Campeon del cubo Rubik
5to año loading
****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 124
Agradecimientos dados: 90
Agradecimientos: 257 en 23 posts
Registro en: Sep 2012
Mensaje: #8
RE: [Haskell] Aplicación Parcial
(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!!
25-05-2014 13:39
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
reLlene Sin conexión
Profesor del Modulo A
...
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 291
Agradecimientos dados: 313
Agradecimientos: 61 en 33 posts
Registro en: Aug 2012
Mensaje: #9
RE: [Haskell] Aplicación Parcial
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
25-05-2014 21:35
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] reLlene recibio 1 Gracias por este post
Diesel (26-05-2014)
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 1 invitado(s)



    This forum uses Lukasz Tkacz MyBB addons.