作为练习¹,我编写了一个仅使用char
解析器和Trifecta的字符串解析器:
import Text.Trifecta
import Control.Applicative ( pure )
stringParserWithChar :: String -> Parser Char
stringParserWithChar stringToParse =
foldr (\c otherParser -> otherParser >> char c) identityParser
$ reverse stringToParse
where identityParser = pure '?' -- ← This works but I think I can do better
解析器可以很好地完成它的工作:
parseString (stringParserWithChar "123") mempty "1234"
-- Yields: Success '3'
identityParser
然而,我对我申请的具体内容并不满意foldr
。必须为pure
.
我的第一个直觉是使用mempty
但Parser
不是幺半群。它是一个应用程序,但empty
构成一个不成功的解析器²。
相反,我正在寻找的是一个解析器,它在与其他解析器结合时作为中性元素工作。它应该什么都不做,即不推进光标并让下一个解析器使用该字符。
Trifecta 或其他库中是否有上述身份解析器?还是解析器不打算在 a 中使用fold
?
¹ 该练习来自Haskell Programming from first principle一书的解析器组合器章节。
² 正如cole 所指出的,Parser
是一个Alternative
,因此是一个幺半群。该empty
函数源于Alternative
, 而不是Parser
的应用实例。