对结果被丢弃的解析器使用 Applicative notation
Using Applicative notation for parsers whose result is discarded
我对重构 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
解析器?
您可以使用*>
和<*
来包含结果被丢弃的动作(但它们的效果是运行):
(*>) :: 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
我对重构 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
解析器?
您可以使用*>
和<*
来包含结果被丢弃的动作(但它们的效果是运行):
(*>) :: 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