• [^] # Re: goto return cave

    Posté par . En réponse au journal Is return the new goto ?. Évalué à 4.

    Un petit bonus sur le returncomme fonction identité, les exceptions et les pointeurs. En fait, on peut bien trouver des return en OCaml, quand on quitte ce que l'on appelle la monade identité. Ce qui peut être le cas quand on travail avec des pointeurs à la places d'exceptions.

    La fonction int_of_string_opt a pour type string -> int option. Ce qui veut dire qu'elle prend une chaîne de caractères pour la convertir en int. Par contre, si c'est pas possible, au lieu de lever une exception, elle retourner l'équivalent OCaml d'un pointeur sur int (qui est le pointeur nul en cas d'échec). Et bien, on peut travailler avec ces pointeurs comme si c'était des int. Le tout c'est de lui dire comment si prendre pour travail avec un fonction qui attend un a et retourne un pointeur sur b, comment on s'y prend pour lier une valeur à une variable quand on travaille avec des pointeurs.

    let bind x f = match x with Some v -> f v | None -> None

    Si j'ai un pointeur valide je passe la valeur pointée à f, sinon je retourne toujours le pointeur nul.

    Ensuite, il faut dire comment on obtient un pointeur à partir d'un valeur donnée :

    let return x = Some x

    Enfin on peut écrire le code suivant :

    let foo s s' =
     let ios = int_of_string_opt in
     let (let*) = bind in
     let* x = ios s in
     let* y = ios s' in
     return (x + y)

    Fonction qui s'utilise ainsi :

    (* tout va bien on a un pointeur sur int *)
    foo "21" "21";;
    - : int option = Some 42
    (* on a un pointeur nul *)
     foo "a" "21";;
    - : int option = None

    C'est ainsi que les exceptions sont gérées en Rust via la monade d'erreurs. :-)

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