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

Rei*_*ica 4 refactoring haskell 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
Run Code Online (Sandbox Code Playgroud)

我想把它变成这样的东西:

filePath :: GenParser Char st Info
filePath = Song <$> artist <*> album <*> track
Run Code Online (Sandbox Code Playgroud)

但正如你所看到的那样,它并不完整.我的问题:在这个重构版本中,我会插入optional (string "./")slash解析器吗?

Cac*_*tus 7

您可以使用*><*包含其结果被丢弃的操作(但运行它们的效果):

(*>) :: f a -> f b -> f b
(<*) :: f a -> f b -> f a
Run Code Online (Sandbox Code Playgroud)

filePath :: GenParser Char st Info
filePath = optional "./" *> Song <$> artist <*> slash *> album <*> slash *> track
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用`<$ :: Functor f => a - > fb - > fa`来保持最左边的"语义". (5认同)