haskell - <* 相对于秒差距相当于以下内容吗?

标签 haskell parsec

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

尽管<*实现为 (<*) = liftA2 const ,当与秒差距一起使用时,它是否等同于:

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

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

最佳答案

通常,当一个类型同时具有 ApplicativeMonad 的实例时,这些实例按照您建议的方式(至少在语义上)达成一致被认为是有礼貌的。在某些情况下,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/

相关文章:

haskell - haskell中树上的最大元素?

haskell - 为列表创建一个镜头(类似)

haskell - 为什么 Parsec 不使用 Control.Applicative 运算符

haskell - 秒差距输入错误

scala - 如何表达函数类型?

haskell - Haskell 图 SVG 文件的边距

haskell - 处理 haskell 元组的好函数和技术?

parsing - 使用 Haskell/Parsec 转换\"into "

parsing - Scala 解析器组合器与 Haskell 的 Parsec 相比如何?

parsing - 创建类型为 Parser a -> Parser b -> Parser (要么 a b)的解析器组合器