Description
Pr´actica 7
Nota Importante:
Realice las implementaciones de esta pr´actica en los ficheros mylist2.ml, y opcionalmente mylist3.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 mylist2.ml ocamlc -c mylist3.ml
Ejercicios:
1. Algunas de las definiciones originales del mo´dulo List de la librer´ıa est´andar de OCaml
(hd, tl, nth, init, map2, find, combine) consideran casos de error de ejecucio´n que llevan asociadas unas determinadas excepciones.
Y por otra parte, algunas de las definiciones originales del mo´dulo List (length, compare lengths, nth, rev, init, rev append, rev map, fold left, find, for all, exists, mem, filter, find all, partition) son recursivas terminales.
Copie el contenido del fichero mylist.ml elaborado durante la realizacio´n de la pra´ctica 6 a otro fichero con nombre mylist2.ml.
Perfeccione, cuando sea preciso, las definiciones contenidas en el fichero mylist2.ml, de forma que el comportamiento de cada funci´on sea exactamente el mismo que el de la correspondiente funcio´n en el m´odulo List. Es decir:
• En aquellas definiciones en las que hay casos de error de ejecucio´n, las excepciones asociadas deben ser exactamente las mismas que las correspondientes en el mo´dulo List.
• Y deben ser recursivas terminales todas aquellas funciones que los son en el m´odulo List.
Adema´s, en el caso de la funci´on compare lengths, debe cumplirse lo que dice el manual:
el c´alculo debe terminar despu´es de recorrer la lista ma´s corta.
2. (Ejercicio opcional) Implemente en otro fichero mylist3.ml lo siguiente:
• Una funcio´n remove: ’a -> ’a list -> ’a list, que “elimine la primera aparici´on, si la hay, de un valor en una lista”. As´ı, por ejemplo, remove 3 [2; 6; 3; 4; 3] deber´ıa ser la lista [2; 6; 4; 3] y remove 3 [1; 2; 4] deber´ıa ser [1; 2; 4].
• Una funci´on remove all: ’a -> ’a list -> ’a list, que “elimine todas las apariciones de un valor en una lista”. As´ı, por ejemplo, remove all 3 [2; 6; 3; 4; 3] deber´ıa ser la lista [2; 6; 4].
• Una funcio´n ldif: ’a list -> ’a list -> ’a list, de forma que ldif l1 l2 elimine de l1 todas las apariciones de todos aquellos valores que aparezcan en l2.
As´ı, por ejemplo, ldif [1;2;3;2;4] [2;3;3;5] deber´ıa ser la lista [1;4].
1
• Una funcio´n lprod: ’a list -> ’b list -> (’a * ’b) list, de forma que lprod l1 l2 calcule el “producto cartesiano” de l1 y l2. As´ı, por ejemplo, lprod [1;3;1;2] [’a’;’b’] deber´ıa ser la lista [(1,’a’); (1,’b’); (3,’a’); (3,’b’); (1,’a’); (1,’b’); (2,’a’); (2,’b’)].
• Una funcio´n divide: ’a list -> ’a list * ’a list, de forma que divide l devuelva un par de listas (l1,l2), donde l1 contiene los elementos de l que ocupan posicio´n impar y l2 los que ocupan posicio´n par. En ambos casos, los elementos de l1 y l2 deben mantener el mismo orden relativo que tienen en la lista original l. As´ı, por ejemplo, divide [’a’;’e’;’i’;’o’;’u’] deber´ıa ser el par ([’a’;’i’;’u’],[’e’;’o’]).
2
Reviews
There are no reviews yet.