Description
Pr´actica 8
Nota Importante:
Todos los ejercicios de esta pra´ctica son opcionales. Realice las implementaciones en los ficheros curry.ml, comp.ml y poli.ml.
Cuando se solicite la entrega de esta pra´ctica, cada alumno debera´ enviar u´nicamente estos ficheros.
Sea muy cuidadoso a la hora de crear los ficheros, y respete los nombres indicados.
Adema´s, estos ficheros deben compilar sin errores con las siguientes o´rdenes:
ocamlc -c curry.ml ocamlc -c comp.ml ocamlc -c poli.ml
Ejercicios:
1. (Ejercicio opcional) Curry y uncurry. Dada una funci´on f : X×Y → Z, podemos siempre considerar una funci´on g : X → (Y → Z) tal que f(x,y) = (g x)y.
A esta transformacio´n se le denomina “currificacio´n” (currying) y decimos que la funcio´n g es la forma “currificada” de la funci´on f (y que la funci´on f es la forma “descurrificada” de la funci´on g). A la transformacio´n inversa se le denomina “descurrificacio´n” (uncurrying).
Defina en un fichero curry.ml una funci´on
curry : ((’a * ’b) -> ’c) -> (’a -> (’b -> ’c))
de forma que para cualquier funcio´n f cuyo origen sea el producto cartesiano de dos tipos, curry f sea la forma currificada de f.
Y defina tambi´en la funci´on inversa
uncurry : (’a -> (’b -> ’c)) -> ((’a * ’b) -> ’c)
Una vez definidas estas dos funciones, prediga y compruebe (como en la pra´ctica 1) el resultado de compilar y ejecutar las siguientes frases en OCaml:
uncurry (+);; let sum = (uncurry (+));; sum 1;; sum (2,1);;
let g = curry (function p -> 2 * fst p + 3 * snd p);;
g (2,5);;
1
let h = g 2;; h 1, h 2, h 3;;
Escriba las respuestas como comentarios en el mismo fichero.
2. (Ejercicio opcional) Composici´on. Defina en un fichero comp.ml la forma currificada de la composicio´n de funciones:
comp : (’a -> ’b) -> (’c -> ’a) -> (’c -> ’b)
Una vez definida esta funcio´n, prediga y compruebe (como en la pr´actica 1) el resultado de compilar y ejecutar las siguientes frases en OCaml:
let f = let square x = x * x in comp square ((+) 1);; f 1, f 2, f 3;;
Escriba las respuestas como comentarios en el mismo fichero.
3. (Ejercicio opcional) Polimorfismo. Defina en un fichero poli.ml funciones con los siguientes tipos:
• f : 0a → 0a
• h : 0a ∗ 0b → 0a
• i : 0a ∗ 0b → 0b
• j : 0a → 0a list
¿Cua´ntas funciones se pueden escribir para cada uno de esos tipos? Escriba las respuestas como comentarios en el mismo fichero.
2
Reviews
There are no reviews yet.