作为 trifecta 的实验,我编写了以下简单函数:
filterParser :: (a -> Bool) -> Parser a -> Parser a
filterParser cond p = do
a <- p
if cond a
then return a
else unexpected "condition failed!"
这个想法是能够向解析器添加条件。例如(假设谓词prime
已经存在),您可以编写:
filterParser prime integer
创建一个只接受素数的解析器。
使用单次解析似乎没问题:
> parseString (filterParser (> 'm') letter) mempty "z"
> Success 'z
> parseString (filterParser (> 'm') letter) mempty "a"
> Failure (interactive):1:2: error: unexpected
> condition failed!
但是对于“很多”它不起作用 - 比较:
> parseString (many $ filterParser (> 'm') letter) mempty "zzz2"
> Success "zzz"
> parseString (many $ filterParser (> 'm') letter) mempty "zzza"
> Failure (interactive):1:5: error: unexpected
> condition failed!
我希望最后一个例子也能返回Success "zzz"
。调用unexpected
似乎使整个解析脱轨,这不是我想要的。