Haskell 使用自定义令牌数据类型解析C-3.1.0

Haskell 使用自定义令牌数据类型解析C-3.1.0,haskell,parsec,wavefront,Haskell,Parsec,Wavefront,parsec-3.1.0() 适用于任何令牌类型。但是,也有一些组合符,如Text.Parsec.Char.summit,它们仅为Char数据类型定义。似乎没有任何更通用的对应项可用 我应该定义自己的版本还是遗漏了什么 Haskell中可能有不同的解析器库,允许: 自定义令牌类型 自定义解析器状态(我需要解析有状态格式-Wavefront OBJ) 通用版的oneOf、noneOf和anyChar可以用一个通用版的满足,非常简单: oneOfT :: (Eq t, Show t, Stream

parsec-3.1.0() 适用于任何令牌类型。但是,也有一些组合符,如Text.Parsec.Char.summit,它们仅为Char数据类型定义。似乎没有任何更通用的对应项可用

我应该定义自己的版本还是遗漏了什么

Haskell中可能有不同的解析器库,允许:

  • 自定义令牌类型
  • 自定义解析器状态(我需要解析有状态格式-Wavefront OBJ)

通用版的
oneOf
noneOf
anyChar
可以用一个通用版的
满足
,非常简单:

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
,您选择如何表示位置并对其进行更新,这在很大程度上取决于您对令牌和流的表示


因此,我可以理解为什么不存在更一般化的表单。

您所命名的问题可以通过typeclass:>class Token a where>showTok::a->String>nextPosTok:::(此处适当的类型)>。。。最后,您总是可以
newtype
您的令牌类型并提供您自己的定义。@Tener-事实上,我就是这么做的-但是Parsec 3没有将nextPos函数放在流类型类中,也没有定义令牌类型类。