parsec-3.1.0(http://hackage.haskell.org/package/parsec-3.1.0) 适用于任何令牌类型。但是,像Text.Parsec.Char.satisfy这样的组合器只为Char数据类型定义。似乎没有更普遍的对应物可用。
我应该定义自己的版本还是错过了什么?
也许Haskell中有不同的解析器库允许:
答案 0 :(得分:4)
oneOf
,noneOf
和anyChar
的广义版本可以通过广义satisfy
构建,非常容易:
oneOfT :: (Eq t, Show t, Stream s m t) => [t] -> ParsecT s u m t
oneOfT ts = satisfyT (`elem` ts)
noneOfT :: (Eq t, Show t, Stream s m t) => [t] -> ParsecT s u m t
noneOfT ts = satisfyT (not . (`elem` ts))
anyT :: (Show t, Stream s m t) => ParsecT s u m t
anyT = satisfyT (const True)
satisfyT :: (Show t, Stream s m t) => (t -> Bool) -> ParsecT s u m t
satisfyT p = tokenPrim showTok nextPos testTok
where
showTok t = show t
testTok t = if p t then Just t else Nothing
nextPos p t s = -- however you update position for your token stream
似乎缺少这些概括,但你会注意到这些概括在这里对类型t
做出某些假设,这些假设对于某人的令牌类型可能不正确。它被假定为Show
和Eq
的一个实例,但我可以想象它们以除show
之外的其他方式显示的令牌类型,以及一类令牌中的成员资格可能通过==
和elem
以外的某种方法实现。
最后,一旦您的令牌类型不再是Char
,您选择表示位置并因此更新它的方式,在很大程度上取决于您对令牌和流的表示。
因此,我可以看到为什么不存在更通用的形式。