[英]Haskell - intersperse a parser with another one
我有兩個解析器parser1 :: Parser a
和parser2 :: Parser a
。
我現在想分析的列表a
s的點綴他們parser2
所需的簽名是這樣的
interspersedParser :: Parser b -> Parser a -> Parser [a]
例如,如果Parser a
解析'a'
字符, Parser b
解析'b'
字符,則interspersedParser
應該解析
""
"a"
"aba"
"ababa"
...
我正在使用兆秒差距。 是否已經有一些行為像這樣的組合器,我目前無法找到?
在 parsec 中有一個sepBy
解析器可以做到這一點。 megaparsec 中似乎也提供了相同的解析器: https ://hackage.haskell.org/package/megaparsec-4.4.0/docs/Text-Megaparsec-Combinator.html
當然,您可以使用sepBy
,但這不僅僅是:
interspersedParser sepP thingP = (:) <$> thingP <*> many (sepP *> thingP)
編輯:哦,這至少需要一件事。 你也想要空的,所以在最后貼一個<|> pure []
。
事實上,這基本上是如何sepBy1
(的變體sepBy
需要至少一個)被實現:
-- | @sepBy p sep@ parses /zero/ or more occurrences of @p@, separated
-- by @sep@. Returns a list of values returned by @p@.
--
-- > commaSep p = p `sepBy` comma
sepBy :: Alternative m => m a -> m sep -> m [a]
sepBy p sep = sepBy1 p sep <|> pure []
{-# INLINE sepBy #-}
-- | @sepBy1 p sep@ parses /one/ or more occurrences of @p@, separated
-- by @sep@. Returns a list of values returned by @p@.
sepBy1 :: Alternative m => m a -> m sep -> m [a]
sepBy1 p sep = (:) <$> p <*> many (sep *> p)
{-# INLINE sepBy1 #-}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.