对结果被丢弃的解析器使用Applicative表示法

时间:2016-10-28 07:36:32

标签: haskell refactoring parsec applicative

我有一个关于重构Parsec代码以使用Applicative界面的问题。假设我有一个使用monadic接口的解析器,如下所示:

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解析器?

1 个答案:

答案 0 :(得分: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