UTNianos

Versión completa: [PdeP] Aplicación Parcial
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola compañeros! cómo están?

Les quería consultar sobre un tema que no logro entender: aplicación parcial.
Tomé un ejercicio como para ponerlo en práctica pero no tengo idea de cómo implementarlo:

3.1. Resolver la función del ejercicio 1.2 de esta guía esMultiploDe/2, utilizando aplicación parcial y composición

La función implementada "normalmente" es:

esMultiploDe :: Integer -> Integer -> Bool
esMultiploDe numeroA numeroB = numeroB `mod` numeroA == 0

Ahora bien, cómo puedo implementar la función para aplicar los conceptos?

Desde ya, muchas gracias!!
http://uqbar-wiki.org/index.php?title=Ap...3n_Parcial


La idea de la aplicación parcial es generar una nueva función a partir de fijarle ciertos parámetros a una función previa.

No quiero darte ejemplos con números para que no sea trivial aplicar la solución en tu ejercicio, así que el ejemplo va a ser medio pedorro. Pero imaginate una función "concatenar" que recibe dos cadenas y devuelve la concatenación de ambas:


concatenar unaFrase otraFrase = unaFrase ++ otraFrase


Puedo hacer una función "saludar" que reciba una única cadena como parámetro, y salude a eso:


saludar alguien = concatenar "Hola, " ++ alguien


(OK, podría no acordarme cómo se declaraban los strings en haskell, sepan disculpar mi óxido =) - ¡y corregirme!)

Pero como concatenar es una función que espera dos parámetros puedo evitar declarar ese "alguien" en mi función saludar:


saludar = concatenar "Hola, "


Haskell sabe que concatenar recibe dos parámetros, entonces, como saludar ya le prefija uno de esos dos, sabe que el tipo de saludar es el mismo que concatenar pero sin el primer parámetro (porque ya no es más un parámetro, lo tiene fijo).

Entonces saludar termina siendo una función que va de un único String a un String resultado, en lugar de ir de dos Strings a uno como hacía concatenar.


No se si fui del todo claro, repreguntá at will =)
Es lo que dijo desert...básicamente es cuando a un función no le pasas todos los parametros.

Por ejemplo si tenes la funcion suma que espera dos numeros A y B
y haces suma A
entonces tenes una nueva funcion "suma A" que espera recibir un numero B

No se si se entiende...yo lo entiendo así.
Compañeros, lo cierto es que leí 500 veces lo que me explicaron y no lo logro entender.
Quizá con un ejemplo particular lo pueda comprender.
Tengo el siguiente ejercicio:

4.6. Definir la función esMayorDeEdad, que dada una tupla de 2 elementos (persona, edad) me devuelva True si es mayor de 21 años y False en caso contrario. Por Ej:.
Main> esMayorDeEdad(juan,18)
False
Nota: Definir la función utilizando aplicación parcial y composición.


Yo la definí así:

esMayorDeEdad:: (String,Integer) -> Bool
esMayorDeEdad persona = snd(persona) > 21

O podría haberla defindio así:

esMayorDeEdad:: (String,Integer) -> Bool
esMayorDeEdad (nombre,edad) = edad > 21

Por último la defini así:

esMayorDeEdad:: (String,Integer) -> Bool
esMayorDeEdad persona = ((>21).snd)persona (Acá aplicando Composición)

Claramente en ninguno de los dos casos estos aplicando composición, y de más esta decir, aplicación parcial. No se me ocurre cómo podría implementarlo en este ejemplo.

Aplicación parcial es el único tema que me faltaría entender =(

Mil gracias por la ayuda!!!
Lee esto que explica bastante bien lo que es:

Utilizar la aplicación parcial de funciones (o llamar a las funciones con menos parámetros) es una forma sencilla de crear funciones al vuelo de forma que podamos pasarlas como parámetros a otras funciones o dotarlas con algunos datos

http://aprendehaskell.es/content/OrdenSuperior
Cuando la definís así:


esMayorDeEdad:: (String,Integer) -> Bool
esMayorDeEdad persona = ((>21).snd)persona


Estás aplicando parcialmente la función >.

> ("mayor") es una función que va de dos Ord a un Boolean. Por ejemplo, podríamos hacer "10 > 5" o "25 > 21" para obtener booleanos.

Cuando escribís "(>21)" lo que estás haciendo es aplicar parcialmente la función > : lo que obtenés no es un booleano, si no una función que recibe un único Ord (un número, por ejemplo) y te devuelve un booleano indicando si ese Ord es mayor a 21.

¿Se entiende?

El chiste es ese: tenías una función reee genérica, >, que te permitía comparar dos Ords. Y vos la aplicaste parcialmente, fijándole uno de sus dos parámetros, y entonces ahora tenés una nueva función (">21") que sabe decir si el único parámetro que recibe es mayor a 21 o no - o sea, es más específica que >.
Aaaaaaah, creo que ahora lo estoy entendiendo un poco mejor.

Lo voy a revisar de nuevo!!!

Mil gracias compañeros por la buena onda!!
Creo que el mayor problema con la aplicación parcial es que es un concepto tan simple que cuesta entender que está pasando algo grosísimo ahí...
URLs de referencia