我正在尝试使用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
语法。我在这里做错了什么/遗漏了什么?
ApplicativeDo
没有处理这个相当明显的情况! - Joachim BreitnerApplicativeDo
非常愚蠢。例如,它无法处理任何类型的let
语句。 - luqui