2016-10-28 6 views
4

コードをリファクタリングしてApplicativeインターフェイスを使用することについて質問があります。私はこのような何かにそれを回すしたい結果が破棄されたパーサーに適用記法を使用する

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

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

しかし、あなたが見ることができるように、それは完全なものではありません私はこのようなモナドのインタフェースを使用してパーサを持っていると仮定します。私の質問:このリファクタリングされたバージョンでは、どこにoptional (string "./")slashというパーサを挿入するのですか?

答えて

7

あなたはその結果が破棄されます(が、その効果が実行される)アクションを含めるように*><*を使用することができます。

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

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

を与えます。また、$ < '使用することができます::ファンクタF => a - > fb - > fa'を実行して、左端に「セマンティクス」を保持します。 – pigworker

関連する問題