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也有类似的问题:哦,看看这个。我很惊讶这个问题没有出现在我的搜索中。这是非常相似的