Конечно, вы можете использовать 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 #-}