我最近开始学习使用Parsec来编写解析器。我想知道以下是否属实:
尽管<*
实现为(<*) = liftA2 const
,但与parsec一起使用时,它与以下内容相同:
p1 <* p2 = do { r1 <- p1; _ <- p2; return r1 }
似乎在使用parsec时,运算符*>
和>>
完全相同,因为它们都丢弃了第一个解析器的结果?
答案 0 :(得分:7)
通常,当某个类型包含Applicative
和Monad
的实例时,至少在语义上,这些实例会以您建议的方式达成一致,这被认为是礼貌的。在某些情况下,Applicative
版本可能更有效(在某些情况下甚至渐近如此!),但对于parsec,至少情况并非如此;来自消息来源:
instance Applicative.Applicative (ParsecT s u m) where
pure = return
(<*>) = ap -- TODO: Can this be optimized?