UTNianos

Versión completa: [PdeP] Consulta - TP Funcional
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenos días compañeros, cómo andan? Espero que muy bien.

Tengo algunas consultas respecto de un enunciado de un trabajo practico, que no logro comprender cómo implementarlo.
El enunciado dice:

3. Combinaciones de máquinas: Las máquinas de la fábrica tienen la ventaja que se pueden interconectar mediante “cintas”, que permiten formar líneas de montaje. Implementar las siguientes cintas:

a. Cinta transportadora: Combina tres máquinas de forma tal que el resultado de una sea ingresado a la otra y a su vez, su resultado sea ingresado en la restante. Cada máquina puede afectar al producto que le llega alterándolo, agregándole cosas, combinándolo con otra cosa, etc.

Por ejemplo, la siguiente consulta:
> cintaTransportadora maquinaA maquinaB maquinaC
Devuelve una nueva máquina que primero procesará su entrada con maquinaA, dará un resultado, éste se procesará con maquinaB, dará un segundo resultado, y esto se procesará por maquinaC, dando el último resultado de la secuencia de máquinas.


Esta es mi función:

cintaTransportadora:: (Bidon -> Bidon) -> (Bidon -> Cajon -> Helado) -> (Helado -> Int -> Helado) -> Bidon -> Cajon -> Int -> Helado
cintaTransportadora dispenser batidora heladera (lts,temp) (fruta,peso) frio = heladera (batidora (dispenser (lts,temp)) (fruta,peso)) frio

Me devolvieron el TP diciendo que en realidad no debo definir la función estáticamente con esas 3 funciones como parámetros, sino que más bien, la función tiene que ser capaz de recibir cualquier máquina y actuar en consecuencia.

Mi pregunta es: cómo puedo armar un prototipo de función que me permita hacer esto? Porque en el caso que adjunté arriba, se ve en el prototipo que estos son los tipos de los parámetros de entrada y salida: (Bidon -> Bidon) -> (Bidon -> Cajon -> Helado) -> (Helado -> Int -> Helado) -> Bidon -> Cajon -> Int -> Helado

Estas son las máquinas que debo combinar:



type Helado = (String, Int, Float)
type Bidon = (Int, Int) -- (litros, temperatura)
type Cajon = (String, Int) -- (fruta, peso)

heladera:: Helado -> Int -> Helado
batidora:: Bidon -> Cajon -> Helado
exprimidora:: Cajon -> Cajon
mixturadora:: Helado -> Helado -> Helado
dispenser:: Bidon -> Bidon


Desde ya, muchas gracias!!!
Saludos!
Hola,

Lo que estás haciendo mal es que en vez de definir la función en forma genérica lo haces para un caso concreto, y eso no sirve ya que por como está definida su función mañana me cambia el tipo de una de las máquinas, entonces ya no sirve más tu función y deberías redefinirla, y mucho sentido no tendría eso.

Por lo tanto a lo que el punto va es que definas una función que pueda combinar 3 máquinas, donde cada máquina esta definida como una función, y vos te debes preguntar, que condición tiene que cumplirse (pista: pensá en composición de funciones) para hacer una función que justamente tome como dominio, la imagen de otra función.
Entiendo lo de la composición de funciones que lo apliqué en:

cintaTransportadora dispenser batidora heladera (lts,temp) (fruta,peso) frio = heladera (batidora (dispenser (lts,temp)) (fruta,peso)) frio

Lo que no logro comprender es cómo definir el prototipo de la función de forma genérica.
La función definida quedaría de la siguiente manera:

cintaTransportadora:: y acá cómo lo defino el prototipo?
cintaTransportadora maquinaC maquinaB maquinaA (lts,temp) (fruta,peso) frio = maquinaC (maquinaB (maquinaA (lts,temp)) (fruta,peso)) frio


Gracias!!!!
Me parece que no tenés muy en claro el concepto de composición de funciones, te recomiendo que lo repases y preguntes al profesor/ayudantes porque dudo que yo te pueda sacar la duda tan bien como ellos.

Pero te puedo ayudar con que, la idea de composición viene asociada a la aplicación parcial, lo cual permite "transformar" a las funciones de n parámetros en funciones de 1 parámetro. Por lo tanto en tu definición no tiene sentido pasarle los 3 parámetros, simplemente con pasarle el primer parámetro a aplicar, como la respuesta/imagen de dicha primera función va a ser el dominio de la próxima, sería redundante y erróneo (te va a romper) si le pasas mas parámetros.

Entonces te quedaría:

cintaTransportadora:: (a->b) -> (b->c) -> (c->d)

cintaTransportadora maquinaC maquinaB maquinaA paramInicial = (maquinaC . maquinaB . maquinaA) paramInicial
URLs de referencia