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

时间:2018-07-23 13:45:24

标签: haskell parsec

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的新手,并且我不太了解它。

1 个答案:

答案 0 :(得分:4)

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时,很可能会在属性或文本内容中找到它们)。