• [^] # Re: Encore le type Null...

    Posté par . En réponse à la dépêche Dart va‐t‐il remplacer JavaScript comme langage dans les navigateurs ?. Évalué à 7.

    Une solution qui marche plutôt bien, mentionnée par Ontologia, est d'utiliser un type somme comme l'ont entre autres OCaml, SML, Haskell, Typed Racket, et comme on peut vaguement encoder dans un langage objet (mais c'est bof agréable, sauf en Scala), c'est-à-dire un type dont les valeurs peuvent être de plusieurs formes selon les cas:

     type 'a option =
     | None
     | Some of 'a
    
    

    Pour tout type 'a, une valeur de type 'a option est soit None, soit Some vv est de type 'a. Par exemple None et Some 3 sont de type int option. C'est un type, en gros, qui "ajoute une valeur par défaut" à n'importe quel type. Tu peux donc représenter une variable de type t qui peut être observée initialisée comme une référence mutable vers du t option : elle est mise à None au départ, et quand tu l'initialises tu mets Some truc. Toute partie du programme qui veut accéder à cette variable doit distinguer les deux cas possibles:

     match !la_variable with
     | None -> do_something "damn, pas encore initialisée !"
     | Some valeur -> do_something_else valeur
    
    

    Pour être agréable à utiliser, il faut une bibliothèque standard qui sait bien gérer les types options (Maybe en Haskell, Option en Scala il me semble). Les monades sont une abstraction qui permet de s'en servir en cachant la possibilité d'erreur (en gros on s'en sert comme si tout était défini, et si un des trucs n'est pas défini, le résultat du calcul est rendu indéfini).

    Bref, il faut un langage un peu riche pour que cette méthode soit vraiment agréable, mais c'est une bonne façon de sortir l'aspect "contient une valeur par défaut" des types de base : on a des types de base bien définis sans valeur par défaut, et seulement là où on en a besoin on utilise des valeurs de type option; en plus l'optionnalité est précisée dans les types donc on ne peut pas l'oublier (comme on oublie que quelque chose peut être NULL).