Programmation Fonctionnelle, TD7

Htmligure
Version & licenses
Creative Commons License

Programmation Fonctionnelle, TD7 : Yojson, Dictionnaire

Guyslain Naves

Exercice 1 : Yojson

La librairie Yojson permet de représenter des données issues du format json à l'aide du type suivant.

  1. type json = [
  2. | `Null
  3. | `Bool of bool
  4. | `Int of int
  5. | `Float of float
  6. | `String of string
  7. | `Assoc of (string * json) list
  8. | `List of json list
  9. ]

Considérons les données suivantes :

  1. { "books": [
  2. { "authors": [ "Minsky", "Madhavapeddy", "Hickey" ],
  3. "title": "Real World OCaml",
  4. "year": 2013
  5. },
  6. { "authors": [ "Conchon", "Filliâtre" ],
  7. "title": "Apprendre à programmer avec OCaml",
  8. "year": 2014
  9. }
  10. ],
  11. "description": "A collection of must-read books",
  12. "version": "0.1"
  13. }

La représentation associée est alors :

  1. let collection =
  2. `Assoc [
  3. ( "books", `List [
  4. `Assoc [
  5. ( "authors", `List [
  6. `String "Minsky";
  7. `String "Madhavapeddy";
  8. `String "Hickey"
  9. ]
  10. );
  11. ("title", `String "Real World OCaml");
  12. ("year", `Int 2013)
  13. ];
  14. `Assoc [
  15. ("authors", `List [`String "Conchon"; `String "Filliâtre"]);
  16. ("title", `String "Apprendre à programmer avec OCaml");
  17. ("year", `Int 2014)
  18. ]
  19. ]
  20. );
  21. ("description", `String "A collection of must-read books");
  22. ("version", `String "0.1")
  23. ]
  1. Comment représenter les données suivantes avec le type json ?

    1. { "firstName": "John",
    2. "lastName": "Doe",
    3. "age": 25
    4. "isMarried": false
    5. "address": {
    6. "street": "42, 42nd street",
    7. "city": "Los Angeles",
    8. "state": "CA"
    9. }
    10. "phones": [
    11. { "name": "home", "number": "123456789" }
    12. { "name": "cellphone", "number": "234567890" }
    13. { "name": "office", "number": "345678901" }
    14. ]
    15. }

    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 :

    1. (* From Yojson.Basic.Util *)
    2. val member : string -> json -> json (* json must be `Assoc l *)
    3. val to_assoc : json -> (string * json) list (* json must be `Assoc l *)
    4. val to_int : json -> int (* json must be `Int i *)
    5. val to_number : json -> float (* json must be `Float f *)
    6. val to_string : json -> string (* json must be `String s *)
    7. val to_list : json -> json list (* json must be `List l *)
    8. val index : int -> json -> json (* json must be `List l *)
    9. val to_option : (json -> 'value) -> (json -> 'value option)
  2. Comment récupérer la liste des titres de livres dans collection ?
  3. Comment récupérer la liste des auteurs du premier livre de la collection ?
  4. 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.
  5. É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 :

  1. module StringMap = Map.Make(String)

Le type de StringMap est alors :

  1. module StringMap :
  2. sig
  3. type key : string
  4. type 'any t

  5. val empty : 'any t
  6. val is_empty : 'any t -> bool
  7. val add : key -> 'assoc -> 'assoc t -> 'assoc t
  8. val mem : key -> 'assoc t -> bool
  9. val find : key -> 'assoc t -> 'assoc

  10. val map : ('assoc -> 'im) -> 'assoc t -> 'im t
  11. val filter : (key -> 'assoc -> bool) -> 'assoc t -> 'assoc t
  12. val fold : (key -> 'assoc -> 'state -> 'state) -> 'assoc t -> 'state -> 'state
  13. val for_all : (key -> 'assoc -> bool) -> 'assoc t -> bool
  14. end
  1. Comment créer un dictionnaire avec les paires ( "one" ,1), ( "two" ,2), ( "three" ,3 ) ?
  2. 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 ?
  3. Et comment coder la fonction inverse, transformant un dictionnaire en une liste d'associations ?
  4. 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.