• [^] # Re: Correctif

    Posté par (site web personnel) . En réponse au journal Compilateur et Monad Reader. Évalué à 3.

    Je vais passer pour un inculte, ...

    Mais non enfin, pourquoi donc?

    L'opérateur >|= est souvent défini comme map pour la monade, avec un order des arguments qui permet de le composer. Ainsi une définition possible est

    let map m f =
     bind m (fun x -> return (f x))
    let ( >|= ) f m =
     map f m

    Une manière classique, dans un contexte fonctionnel, de transformer une évaluation stricte en évaluation paresseuse est de la suspendre dans une fermeture, l'expression expr devient fun () -> expr. Ainsi l'opérateur de séquence qui en Haskell a la signature

    val ( >> ) : 'a t -> 'b t -> 'b t

    est plus communément définit en OCaml avec la signature

    val ( >> ) : 'a t -> (unit -> 'b t) -> 'b t

    qui permet d'implémenter effectivement la séquence – l'ordre des évaluations des arguments d'une fonction ou d'un opérateur n'est pas spécifié – sauf pour les raccourcis booléens, c'est la même convention que le C si je ne me trompe pas – de sorte que la première définition ne garantirait pas que la première valeur dans l'ordre de lecture soit effectivement calculée la seconde.

    On pourrait aussi bien choisir la signature

    val ( >> ) : 'a t -> 'b t lazy -> 'b t

    mais en pratique c'est la première option qui est retenue, sûrement parceque le code monadique contient beaucoup de fonctions anonymes, et que les suspensions de type fun () -> x s'y intègrent bien.