<* 是否等同于以下关于秒差距的内容?
is <* equivalent to the following with respect to parsec?
我最近开始学习使用 Parsec 来编写解析器。我想知道以下是否属实:
即使 <*
实现为 (<*) = liftA2 const
,当与 parsec 一起使用时,它是否与:
相同
p1 <* p2 = do { r1 <- p1; _ <- p2; return r1 }
似乎在使用 parsec 时,运算符 *>
和 >>
完全相同,因为它们都丢弃了第一个解析器的结果?
通常,当一个类型同时具有 Applicative
和 Monad
的实例时,这些实例至少在语义上同意您建议的方式被认为是礼貌的。在某些情况下,Applicative
版本可能更有效(在某些情况下甚至渐进地如此!),但至少对于 parsec 而言并非如此;来自来源:
instance Applicative.Applicative (ParsecT s u m) where
pure = return
(<*>) = ap -- TODO: Can this be optimized?
我最近开始学习使用 Parsec 来编写解析器。我想知道以下是否属实:
即使 <*
实现为 (<*) = liftA2 const
,当与 parsec 一起使用时,它是否与:
p1 <* p2 = do { r1 <- p1; _ <- p2; return r1 }
似乎在使用 parsec 时,运算符 *>
和 >>
完全相同,因为它们都丢弃了第一个解析器的结果?
通常,当一个类型同时具有 Applicative
和 Monad
的实例时,这些实例至少在语义上同意您建议的方式被认为是礼貌的。在某些情况下,Applicative
版本可能更有效(在某些情况下甚至渐进地如此!),但至少对于 parsec 而言并非如此;来自来源:
instance Applicative.Applicative (ParsecT s u m) where
pure = return
(<*>) = ap -- TODO: Can this be optimized?