Exercice 1 : Fonctions.
Le type des fonctions est un type paramétré, avec deux paramètres :
type ('dom,'im) funct = 'dom -> 'im
Par rapport à 'dom, à quelle catégorie de types paramétrés appartient le type des fonctions ? Par exemple, à quelle catégorie appartient 'dom -> int ?
Et par rapport à 'im, par exemple int -> 'dom ?
Donnez le code des fonctions map et comap. À quoi correspondent map et comap pour les fonctions ?
Exercice 2 : Promesses.
Lwt est une librairie permettant de gérer des calculs concurrents. Voici un extrait de l'API :
type 'result t
val return : 'value -> 'value t
val bind : 'value t -> ('value -> 'result t) -> 'result t
val (>>=) : 'value t -> ('value -> 'result t) -> 'result t
val map : ('value -> 'result) -> 'value t -> 'result t
val (>|=) : 'value t -> ('value -> 'result) -> 'result t
val async : (unit -> 'any t) -> unit
À quelle catégorie de type paramétrés appartient Lwt.t ? Pourquoi ?
On se donne :
type event
val mouse_event : unit -> event Lwt.t
val get_position : event -> int * int
Écrivez une promesse ayant pour résultat la position de la souris au prochain événement.
Écrivez une promesse qui à chaque événement souris, affiche en sortie standard la position de la souris, indéfiniment.
Exercice 3 : Comparateurs.
Voici l'interface d'un petit module tout simple qui rend de grands services.
type 'elt comparison = 'elt -> 'elt -> int
val int : int comparison
val float : float comparison
val bool : bool comparison
val string : string comparison
val pair : 'fst comparison * 'snd comparison -> ('fst * 'snd) comparison
val list : 'elt comparison -> 'elt list comparison
val comap : ('elt -> 'im) -> 'im comparison -> 'elt comparison
val inverse : 'elt comparison -> 'elt comparison
val min_by : 'elt comparison -> 'elt -> 'elt -> 'elt
val max_by : 'elt comparison -> 'elt -> 'elt -> 'elt
val (<|>) : 'elt comparison -> 'elt comparison -> 'elt comparison
À quelle catégorie appartient le type 'elt comparison ?
Écrivez des fonctions de comparaisons pour :
Soit le module suivant :
module Person : sig
type t
val get_name : t -> string
val age : t -> int
val id : t -> int
end
Donnez une fonction pour comparer deux personnes selon leur nom, et en cas d'égalité selon leur âge.
Programmez les fonctions inverse et comap.
Exercice 4 : synchronisation.
La librairie standard contient des modules pour manipuler des threads, mais plus bas-niveau que Lwt. Le module Event permet d'établir des communications synchronisées entre threads.
type t
val create : ('arg -> 'res) -> 'arg -> t
val join : t -> unit
val delay : float -> unit
type 'value channel
type 'value event
val new_channel : unit -> 'value channel
val sync : 'value event -> 'value
val send : 'value channel -> 'value -> unit event
val receive : 'value channel -> 'value event
val wrap : 'v event -> ('v -> 't) -> 't event
Écrire un programme créant deux threads. Le premier envoie au second les entiers de 10 à 1 , à une seconde d'intervalle. Le deuxième les affiche. Le programme termine quand les deux threads terminent.
À quelles catégories appartiennent les types channel et event ?
Quel autre nom pourrait-on donner à wrap ?