• [^] # Re: Tous mes encouragements

    Posté par . En réponse à la dépêche MirageOS - un micro OS (unikernel) en OCaml. Évalué à 5. Dernière modification le 31 décembre 2021 à 00:23.

    Bon, quand on regarde en détail, je préfère

    int compare(a: T, b : T);

    (les fonctions façon LISP... pour compare et add dans cet exemple) à

    val compare : t -> t -> int

    C'est une question de point de vue, et je trouve la syntaxe OCaml bien plus cohérente quand on la regarde dans l'ensemble du langage.

    Une expression de la forme val e : t se lit « e est une valeur de type t », et je ne vois pas pourquoi il faudrait changer de forme, sous prétexte que la valeur compare est ici une fonction. Le : de OCaml c'est comme le epsilon (\epsilon) des mathématiciens, il signifie l'appartenance à un ensemble. Ici, c'est l'ensemble des fonctions des t vers les fonctions des t dans les int (ça se lit t -> (t -> int)), c'est une fonction qui renvoie une fonction. De même, la fonction successeur sur les entiers a pour type int -> int, c'est une fonction des int vers les int.

    En résumé, on a donc un nom pour la valeur, suivi du : (le epsilon des matheux, ou le est du français comme dans « Socrate est un homme ») puis enfin une expression qui appartient au langage des types.

    Cette dernière expression, on pourrait la réutiliser telle quelle dans le langage des types, pour définir par exemple un type paramétrique, comme ici :

    type 'a comparator = 'a -> 'a -> int

    Ici comparator est une fonction des types dans les types (un type paramétrique) et 'a est le nom de son paramètre. On peut alors réécrire la signature du début ainsi:

    (* la fonction `comparator` appliquée au type `t` *)
    val compare : t comparator (* t -> t -> int *)

    Il y a en fait 4 langages dans OCaml :

    • le langage des valeurs et expressions
    • le langage des types des expressions
    • le langage des modules
    • le langage des types de modules ou signatures

    Les deux derniers, dont tu préfères la syntaxe, ont « globalement » les même principe syntaxiques que les deux premiers qui semblent te désarçonner. Pourquoi ?

    Pour le foncteur Make, on aurait pu écrire sa signature ainsi :

    module Make : functor (S : ORDERED) -> sig ... end

    ce qui est la même syntaxe que pour compare, à part le mot clef functor (personnellement, je le trouve inutile et j'aurais préféré qu'il soit absent, je trouve qu'il alourdit sans raison l'écriture et la lecture).

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.