我正在尝试使用。编写解析器 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
。我在做错了什么/在这里失踪了?
弄清楚了。要使此示例在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
弄清楚了。要使此示例在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