Haskell ApplicativeDo语言扩展,带有'Parsing',applicative仍在寻找Monad实例

Haskell ApplicativeDo语言扩展,带有'Parsing',applicative仍在寻找Monad实例,haskell,ghc,applicative,Haskell,Ghc,Applicative,我正在尝试使用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:**"

我正在尝试使用
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
{-#语言应用程序}
导入Text.Parser.Char(字符串,空格)
导入Text.Parser.Token(令牌解析,自然)
issueParser::令牌解析p=>p整数
ISSUSEPARSER=do
空间
字符串“**问题:*”
空间
“字符串”https://github.com字符串“github.com”
字符串“/commercialhaskell/stack/issues/”
自然的

GHC给我的错误是
无法从context:TokenParsing p
推断do语句产生的(Monad p)。这个错误消息是正确的,
TokenParsing
没有提供作为一个超类的
Monad
,但是它提供了
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
{-#语言应用程序}
导入Text.Parser.Char(字符串,空格)
导入Text.Parser.Token(令牌解析,自然)
issueParser::令牌解析p=>p整数
ISSUSEPARSER=do

_哇,我很惊讶地看到,
ApplicativeDo
没有处理这个相当明显的案例
ApplicativeDo
相当愚蠢。例如,它不能处理任何类型的
let
语句whatsoeverI也有类似的问题:哦,看看这个。我很惊讶这个问题没有出现在我的搜索中。这是非常相似的