2016-10-28 2 views
4

J'ai une question sur le refactoring Parsec code pour utiliser l'interface Applicative. Supposons que j'ai un analyseur en utilisant l'interface monadique comme ceci:Utilisation de la notation Applicative pour les analyseurs dont le résultat est ignoré

filePath0 :: GenParser Char st Info 
filePath0 = do 
    optional (string "./") 
    r <- artist 
    slash 
    l <- album 
    slash 
    t <- track 
    return $ Song r l t 

Je voudrais en faire quelque chose comme ceci:

filePath :: GenParser Char st Info 
filePath = Song <$> artist <*> album <*> track 

Mais comme vous pouvez le voir est pas complète. Ma question: où, dans cette version refactorisée, j'insérerais optional (string "./") et slash parseurs?

Répondre

7

Vous pouvez utiliser *> et <* pour inclure des actions dont le résultat est mis au rebut (mais leur effet est exécuté):

(*>) :: f a -> f b -> f b 
(<*) :: f a -> f b -> f a 

donnant

filePath :: GenParser Char st Info 
filePath = optional "./" *> Song <$> artist <*> slash *> album <*> slash *> track 
+5

Vous pouvez également utiliser '<$ :: Functor f => a -> fb -> fa' garder "la sémantique" à l'extrême gauche. – pigworker