• # Priorité des opérateurs

    Posté par . En réponse au message Haskell, problème de strictitude de do. Évalué à 4. Dernière modification le 18 décembre 2011 à 00:52.

    La ligne :

    displayCallback $= clear [ColorBuffer] >> flush
    
    

    Est analysée par le compilateur comme :
    (displayCallback $= clear [ColorBuffer]) >> flush
    
    

    Donc le flush a lieu dans l'action du main, pas dans le
    displayCallback qui survient plus tard. Donc le displayCallback effectue pleins de "clear [ColorBuffer]", sans jamais flush.

    À l'opposé :

    displayCallback $= do clear [ColorBuffer] ; flush
    
    

    Devient :
    displayCallback $= (clear [ColorBuffer] >> flush)
    
    

    Ce qui est vraisemblablement ce que tu veux vraiment faire.

    Cela vient du fait que $= est prioritaire sur >> dans la définition.

    Pour voir les priorités :

    Prelude> import Graphics.UI.GLUT
    Prelude Graphics.UI.GLUT> :info ($=)
    class HasSetter s where ($=) :: s a -> a -> IO ()
     -- Defined in Data.StateVar
    infixr 2 $=
    Prelude Graphics.UI.GLUT> :info (>>)
    class Monad m where
     ...
     (>>) :: m a -> m b -> m b
     ...
     -- Defined in GHC.Base
    infixl 1 >>
    Prelude Graphics.UI.GLUT>