簡體   English   中英

Haskell - 將一個解析器與另一個解析器穿插

[英]Haskell - intersperse a parser with another one

我有兩個解析器parser1 :: Parser aparser2 :: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM