具有“解析”应用程序的 ApplicativeDo 语言扩展仍在寻找 Monad 实例

ApplicativeDo language extension with `Parsing` applicative still looking for Monad instance

我正在尝试使用 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 作为超级 class,但它确实提供 Applicative,这意味着因为我启用了此语言扩展,所以我应该能够仅通过 Applicative 使用 do 语法。 wrong/missing 我在这里做什么?

想通了。要使此示例在 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