2016-07-09 2 views
1

Je veux de sucre la notation suivante. Mais im pas sûr que je l'ai vu juste:de sucreing faire la notation

est:

quote = do 
    time  <- qtime 
    qcomma 
    ask   <- double 
    qcomma 
    bid   <- double 
    qcomma 
    askVolume <- double 
    qcomma 
    bidVolume <- double 
    endOfLine 
    return $ Quote time ask bid askVolume bidVolume 

Et

quote = Quote <$> (qtime <* qcomma) 
       <*> (double <* qcomma) 
       <*> (double <* qcomma) 
       <*> (double <* qcomma) 
       <*> (double <* endOfLine) 

équivalent à:

qtime >>= (\time -> qcomma) 
    >> double 
     >>= (\ ask -> qcomma) 
      >> double 
       >>= (\bid -> qcomma) 
        >> double 
         >>= (\askVolume -> qcomma) 
          >> double 
           >>= (\bidVolume -> endOfLine) 
            return (Quote time ask bid askVolume bidVolume) 

Toute aide est appréciée!

Répondre

6

La notation do desugars à imbriquées lambdas, parce que (par exemple) time est portée pour le reste du bloc do, pas seulement le premier appel à qcomma:

qtime >>= (
    \time -> qcomma 
     >> double 
     >>= (\ ask -> qcomma 
       >> double 
       >>= (\bid -> qcomma 
         >> double 
         >>= (\askVolume -> qcomma 
            >> double 
            >>= (\bidVolume -> endOfLine 
              return (Quote time ask bid askVolume bidVolume)))))) 

La version applicative pourrait avoir le même effet, mais n'est pas désuet à quoi que ce soit.

A partir de GHC 8, la notation dopourrait desugar au code si applicatif (ApplicativeDo est activé et) le compilateur peut déterminer que >>= n'est pas nécessaire et l'Applicative exemple plus général a la même signification.

+0

Il est impressionnant GHC serait «Applicative», mais pourquoi? il n'y a aucune garantie qu'il fonctionnera mieux, est-il? – MasterMastic

+1

Les monades appliquent un ordre d'opérations non requis par le code 'Applicative', ce qui a des implications pour la parallélisation. Laisser le compilateur décider si une instance Applicative disponible est appropriée pour une expression 'do' libère le programmeur de commuter inutilement vers une monade. – chepner

+0

ok beaucoup merci pour cela !! Ca a du sens!! – Devitect