haskell - ApplicativeDo 语言扩展 `Parsing` applicative 仍在寻找 Monad 实例

标签 haskell ghc applicative

我正在尝试使用 parsers 编写解析器package使用 do句法。这是一个例子:

{-# LANGUAGE ApplicativeDo #-}
import Text.Parser.Char (string, spaces)
import Text.Parser.Token (TokenParsing, natural)

issueParser :: TokenParsing p => p Integer
issueParser = do
  spaces
  string "**Issue:**"
  spaces
  string "https://github.com" <|> string "github.com"
  string "/commercialhaskell/stack/issues/"
  natural

GHC 给我的错误是 Could not deduce (Monad p) arising from a do statement from the context: TokenParsing p .此错误消息是正确的 TokenParsing不提供Monad作为一个父类(super class),但它确实提供了Applicative这意味着因为我打开了这个语言扩展,我应该可以使用 do只有 Applicative 的语法.我在这里做错了什么/错过了什么?

最佳答案

弄清楚了。要让这个示例在 ghc 8.0.2 上运行,您需要添加下划线生成器,如下所示:

{-# LANGUAGE ApplicativeDo #-}
import Text.Parser.Char (string, spaces)
import Text.Parser.Token (TokenParsing, natural)

issueParser :: TokenParsing p => p Integer
issueParser = do
  _ <- spaces
  _ <- string "**Issue:**"
  _ <- spaces
  _ <- string "https://github.com" <|> string "github.com"
  _ <- string "/commercialhaskell/stack/issues/"
  n <- natural
  pure n

这里已经有一个 ghc 错误来解决这个问题:https://ghc.haskell.org/trac/ghc/ticket/12666

关于haskell - ApplicativeDo 语言扩展 `Parsing` applicative 仍在寻找 Monad 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42285105/

相关文章:

haskell - 无法推断因使用 ‘>’ 而产生的 (Ord a0)

haskell - 有没有办法只将 Haskell 源代码编译为接口(interface)文件,而不是进一步编译?

haskell - 如何在 Haskell (GHC) 中启用死代码警告

haskell - Stream 成为可遍历的实例

haskell - 寻找与 liftA2 相关的 Haskell 函数,但其​​工作方式类似于 Alternative 中的 <|>

在 Haskell 中调试无限 Sum

haskell - 为什么显式写入类型 `Product Int` 适用于任何 `Num` 类型?

haskell - 泛型中的约束类型

haskell - 为多态模式同义词编写完整的编译指示?

list - 使用 Haskell 将列表拆分为长度为 2^0、2^1、...、2^N 的元组列表