ApplicativeDo расширение языка с аппликацией `Parsing` все еще ищет экземпляр Monad
Я пытаюсь написать парсер, используя 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
. Что я делаю неправильно/отсутствует здесь?
Ответы
Ответ 1
Выяснил это. Чтобы этот пример работал на 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, чтобы решить эту проблему здесь: https://ghc.haskell.org/trac/ghc/ticket/12666