对于parsec,<*相当于以下内容?

Enz*_*nzo 2 haskell parsec

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

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

p1 <* p2 = do { r1 <- p1; _ <- p2; return r1 }
Run Code Online (Sandbox Code Playgroud)

它似乎是用秒差距操作时*>>>是完全一样的,因为它们都扔掉第一分析器的结果呢?

Dan*_*ner 7

一般来说,当一种既有的情况ApplicativeMonad,它被认为是礼貌的那些情况下,在你建议的方式达成一致,至少在语义.在某些情况下,Applicative版本可能更有效(在某些情况下甚至渐近如此!),但对于parsec,至少情况并非如此; 来自消息来源:

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

  • 在病理学上,看看[containers-0.5.6.0]中的`Data.Sequence`中的`<*>`定义之间的区别(http://hackage.haskell.org/package/containers-0.5.6.0/docs/ src/Data-Sequence.html)与[containers-0.5.6.3](http://hackage.haskell.org/package/containers-0.5.6.3/docs/src/Data-Sequence.html).这很有趣. (2认同)