Exercice 1 : Yojson
La librairie Yojson permet de représenter des données issues du format json à l'aide du type suivant.
type json = [
| `Null
| `Bool of bool
| `Int of int
| `Float of float
| `String of string
| `Assoc of (string * json) list
| `List of json list
]
Considérons les données suivantes :
{ "books": [
{ "authors": [ "Minsky", "Madhavapeddy", "Hickey" ],
"title": "Real World OCaml",
"year": 2013
},
{ "authors": [ "Conchon", "Filliâtre" ],
"title": "Apprendre à programmer avec OCaml",
"year": 2014
}
],
"description": "A collection of must-read books",
"version": "0.1"
}
La représentation associée est alors :
let collection =
`Assoc [
( "books", `List [
`Assoc [
( "authors", `List [
`String "Minsky";
`String "Madhavapeddy";
`String "Hickey"
]
);
("title", `String "Real World OCaml");
("year", `Int 2013)
];
`Assoc [
("authors", `List [`String "Conchon"; `String "Filliâtre"]);
("title", `String "Apprendre à programmer avec OCaml");
("year", `Int 2014)
]
]
);
("description", `String "A collection of must-read books");
("version", `String "0.1")
]
Comment représenter les données suivantes avec le type json ?
{ "firstName": "John",
"lastName": "Doe",
"age": 25
"isMarried": false
"address": {
"street": "42, 42nd street",
"city": "Los Angeles",
"state": "CA"
}
"phones": [
{ "name": "home", "number": "123456789" }
{ "name": "cellphone", "number": "234567890" }
{ "name": "office", "number": "345678901" }
]
}
Pour des raisons pratiques, il est nécessaire de définir des fonctions permettant de récupérer facilement des valeurs qui nous intéressent dans des données json. On introduit les fonctions suivantes :
val member : string -> json -> json
val to_assoc : json -> (string * json) list
val to_int : json -> int
val to_number : json -> float
val to_string : json -> string
val to_list : json -> json list
val index : int -> json -> json
val to_option : (json -> 'value) -> (json -> 'value option)
Comment récupérer la liste des titres de livres dans collection ?
Comment récupérer la liste des auteurs du premier livre de la collection ?
Proposez un type pour encoder les livres en OCaml, et écrire une fonction prenant un livre au format json et le convertissant dans le type des livres.
Écrivez une fonction testant si une personne possède un numéro de téléphone portable.
Exercice 2 : Dictionnaire.
On peut créer une structure de dictionnaire dont les clés sont des chaînes de caractères ainsi :
module StringMap = Map.Make(String)
Le type de StringMap est alors :
module StringMap :
sig
type key : string
type 'any t
val empty : 'any t
val is_empty : 'any t -> bool
val add : key -> 'assoc -> 'assoc t -> 'assoc t
val mem : key -> 'assoc t -> bool
val find : key -> 'assoc t -> 'assoc
val map : ('assoc -> 'im) -> 'assoc t -> 'im t
val filter : (key -> 'assoc -> bool) -> 'assoc t -> 'assoc t
val fold : (key -> 'assoc -> 'state -> 'state) -> 'assoc t -> 'state -> 'state
val for_all : (key -> 'assoc -> bool) -> 'assoc t -> bool
end
Comment créer un dictionnaire avec les paires ( "one" ,1), ( "two" ,2), ( "three" ,3 ) ?
Plus généralement, comment transformer une liste de paires dont le premier élément est une chaîne de caractères en un dictionnaire ?
Et comment coder la fonction inverse, transformant un dictionnaire en une liste d'associations ?
Utilisez les dictionnaires pour écrire une fonction qui à une liste de chaînes de caractères, retourne la liste des chaînes tel que chaque chaîne apparait une seule fois.