Jouons avec du (vrai) code OCaml

Ce billet a pour but de tester la coloration du code OCaml sur Aerie's Guard. En grandeur nature.


Certains d'entre vous ont expérimenté avec Haskell.

Certains d'entre vous ont expérimenté avec OCaml ou suivent des cours OCaml.

Peut-être que certains d'entre vous suivent des cours Caml-Light.

Quoiqu'il en soit, avant de me lancer dans le grand bain, j'essaye d'abord le petit bassin.

En OCaml un module peut être un module-fonction, c'est-à-dire qu'il peut être paramétrable par un (ou plusieurs) module-argument(s) d'un certain module-type(s).

Donc la 1ière chose que nous allons faire c'est déclarer un module-type.

Il s'agit du type des ensembles totalement ordonnés implémentés comme des arbres binaires de recherche.

Mais on ne précise pas s'ils sont mutables ou immutables (on le fera plus tard).

1
2
3
4
5
6
7
8
9
10
11
12
13
(* Totally ordered Sets *)
module type OrderedSet =
   sig
      type 'a set =
         'a non_empty_set option
      and 'a non_empty_set =
         private
         {mutable left: 'a set; item: 'a; mutable right: 'a set}
      val empty : 'a set
      val make : 'a set -> 'a -> 'a set -> 'a non_empty_set
      val with_left  : 'a non_empty_set -> 'a set -> 'a non_empty_set
      val with_right : 'a non_empty_set -> 'a set -> 'a non_empty_set
   end

La 2ième chose c'est que l'on veut 2 modules-valeurs de ce module-type.

On veut un module-argument pour les ensembles totalement ordonnés  immutables.

Spoiler Afficher/Masquer

On veut un module-argument pour les ensembles totalement ordonnés  mutables.

Spoiler Afficher/Masquer

La 3ième chose c'est que la récursion c'est compliqué. On peut se tromper et si on se trompe il faudra déboguer, soit parce que le calcul ne termine pas ou bien parce que la valeur retournée est incorrecte.

Déboguer c'est du temps perdu pour rien.

Alors on va régler le problème une fois pour toutes en encapsulant la récursion sur les ensembles totalement ordonnés.

Spoiler Afficher/Masquer

On veut une dernière chose :

Pouvoir créer des ensembles totalement ordonnés mutables ou immutables

Les équiper de toutes les opérations ensemblistes, à savoir e ∈ S, A ∪ B, A ∩ B, A ⊃ B, A - B, A = B, ∀ e ∈ S on a P(e), {e ∈ S, P(e)}

Que toutes ces opérations soient performantes, qu'elles utilisent le fait que les ensembles sont ordonnées. Par exemple il est hors de question d'ajouter les éléments de A un-par-un à l'ensemble B pour calculer A ∪ B. 

Spoiler Afficher/Masquer

Désormais, pour créer un module ensemble totalement ordonné immutable :

1
module PSet = MakeSet(PureOrderedSet)

Désormais, pour créer un module ensemble totalement ordonné mutable :

1
module MSet = MakeSet(MutableOrderedSet)

Les fonctions ont toutes le type approprié. Par exemple il est impossible de retirer un élément d'un ensemble vide parce que la fonction remove est du type :

1
val remove : 'a -> 'a non_empty_set -> 'a set

Réciproquement, lorsque l'on insère un élément dans un ensemble quelconque, on obtient forcément un ensemble non vide  :

1
val insert : 'a -> 'a set -> 'a non_empty_set
Laissez un commentaire

1 Commentaire

  • J'ai du mal à comprendre le fond de cet article, mais je constate que la coloration syntaxique marche bien, c'est déjà ça smile

    • Pourtant, dans la source finale il y a tout plein de object ... method ..., ça devrait t'être familier whistle

    • Tout ça c'est la forme, si je ne comprends pas l'intérêt du problème, je peux très bien reconnaître des structures de langage, ça ne m'aide pas pour autant wink

    • Ce code est une petite partie de mon projet MoonLib.

      Ne déroule que le dernier Spoiler.

      Que vois-tu :

      Il n'y a aucune boucle while ou for ou autre.

      Il n'y a aucun let rec c'est-à-dire qu'il n'y a pas de récursion.

      Mais alors, quel est le paradigme utilisé par ce code ?

      Ce que tu vois c'est la réalisation de ce qu'Alain Prouté décrit dans les 13 premières minutes de son intervention à la conférence Innovaxiom :

      Le paradigme utilisé n'est tout simplement pas présent dans la liste à droite de la page Wikipedia.

      à 12m45s. Alain Prouté prononce les mots "c'est exactement le langage des Catégories Bicartésiennes Fermées". Ça n'est pas véritablement de la programmation fonctionnelle au sens où ça n'est pas Turing-complet. Tu peux considérer ça comme un nouveau paradigme à ajouter à la page Wikipedia.

Laissez un commentaire

Vous devez être connecté pour commenter sur le Refuge. Identifiez-vous maintenant ou inscrivez-vous !