是< *相当于parsec的以下内容?

时间:2015-01-25 02:50:56

标签: haskell parsec

我最近开始学习使用Parsec来编写解析器。我想知道以下是否属实:

尽管<*实现为(<*) = liftA2 const,但与parsec一起使用时,它与以下内容相同:

p1 <* p2 = do { r1 <- p1; _ <- p2; return r1 }

似乎在使用parsec时,运算符*>>>完全相同,因为它们都丢弃了第一个解析器的结果?

1 个答案:

答案 0 :(得分:7)

通常,当某个类型包含ApplicativeMonad的实例时,至少在语义上,这些实例会以您建议的方式达成一致,这被认为是礼貌的。在某些情况下,Applicative版本可能更有效(在某些情况下甚至渐近如此!),但对于parsec,至少情况并非如此;来自消息来源:

instance Applicative.Applicative (ParsecT s u m) where
    pure = return
    (<*>) = ap -- TODO: Can this be optimized?