应用程序语言扩展与“解析”可应用程序仍在寻找Monad实例。

11

我正在尝试使用package中的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

我收到的错误信息是在上下文中,由于do语句而产生无法推断出(Monad p)的情况:TokenParsing p。这个错误信息是正确的,因为TokenParsing没有提供Monad作为超类,但是它确实提供了Applicative,这意味着因为我已经打开了这个语言扩展,我应该能够只使用Applicative来使用do语法。我在这里做错了什么/遗漏了什么?

1个回答

14

问题已解决。要让这个示例在 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


哇,我很惊讶地发现ApplicativeDo没有处理这个相当明显的情况! - Joachim Breitner
ApplicativeDo非常愚蠢。例如,它无法处理任何类型的let语句。 - luqui
我有一个类似的问题:https://dev59.com/pp3ha4cB1Zd3GeqPUnSb - danidiaz
哦,看看这个。我很惊讶这个问题没有出现在我的搜索结果中。它非常相似。 - Asa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接