问题 ApplicativeDo语言扩展与`Parsing` applicative仍在寻找Monad实例


我正在尝试使用。编写解析器 parsers   运用 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 作为一个超级类,它确实提供 Applicative 这意味着因为我打开了这个语言扩展,我应该可以使用 do 语法只是 Applicative。我在做错了什么/在这里失踪了?


10514
2018-02-16 21:35


起源



答案:


弄清楚了。要使此示例在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 bug来解决这个问题: https://ghc.haskell.org/trac/ghc/ticket/12666


14
2018-02-16 21:47



哇,我很惊讶地看到了 ApplicativeDo 没有处理这个相当明显的案件! - Joachim Breitner
ApplicativeDo 很蠢。例如。它无法处理 let 任何形式的陈述 - luqui
我遇到了类似的问题: stackoverflow.com/questions/41210599/... - danidiaz
哦,看那个。我很惊讶这个问题没有出现在我的搜索中。它非常相似 - Asa


答案:


弄清楚了。要使此示例在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 bug来解决这个问题: https://ghc.haskell.org/trac/ghc/ticket/12666


14
2018-02-16 21:47



哇,我很惊讶地看到了 ApplicativeDo 没有处理这个相当明显的案件! - Joachim Breitner
ApplicativeDo 很蠢。例如。它无法处理 let 任何形式的陈述 - luqui
我遇到了类似的问题: stackoverflow.com/questions/41210599/... - danidiaz
哦,看那个。我很惊讶这个问题没有出现在我的搜索中。它非常相似 - Asa