Parsec:解析满足某个谓词的字符串

Parsec: parse string that satisfies some predicate

Parsec 已经有一个 satisfy 解析器,它在给定谓词 returns True 应用于给定字符时成功:

punctuationOrSymbol = satisfy isPunctuation <|> satisfy isSymbol

我怎样才能对整个字符串做类似的事情?我需要它,因为我想解析一个 URI,但前提是它是有效的。为此,我想利用 isURI function in network-uri package。类似于:

uri :: ParsecT s u m URI
uri = parseURI <$> satisfyForString isURI

我怀疑和token函数有关,但我是Haskell新手,一直没能看懂

ParsecTAlternative 的一个实例,所以你可以使用 guard 做这样的事情:

predicateP :: (a -> Bool) -> Parsec s u a -> Parsec s u a
predicateP pr p = do
   x <- p
   guard $ pr x
   return x

如果它已经在某个地方作为组合器存在,我不会感到惊讶,但我对 parsec 不是很熟悉。

现在只给了你一个应用谓词的方法;要将其应用于字符串,您必须首先获得您认为是或可能是 URL 的字符串。如何获得它取决于您的域(在解析 XML 时,您很可能会在属性或文本内容中找到它们)。