我最近开始学习使用 Parsec 来编写解析器。我想知道以下内容是否属实:
尽管<*
实现为 (<*) = liftA2 const
,当与秒差距一起使用时,它是否等同于:
p1 <* p2 = do { r1 <- p1; _ <- p2; return r1 }
并且似乎在使用秒差距时运算符 *>
和>>
完全相同,因为它们都丢弃了第一个解析器的结果?
最佳答案
通常,当一个类型同时具有 Applicative
和 Monad
的实例时,这些实例按照您建议的方式(至少在语义上)达成一致被认为是有礼貌的。在某些情况下,Applicative
版本可能更高效(在某些情况下甚至渐近如此!),但对于秒差距来说至少情况并非如此;来源:
instance Applicative.Applicative (ParsecT s u m) where
pure = return
(<*>) = ap -- TODO: Can this be optimized?
关于haskell - <* 相对于秒差距相当于以下内容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28132712/