Parsec已经有一个satisfy
解析器,当将给定谓词应用于给定char时返回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的新手,并且我不太了解它。
答案 0 :(得分:4)
ParsecT
是Alternative
的实例,因此您可以使用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时,很可能会在属性或文本内容中找到它们)。