Подтвердить что ты не робот

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. Что я делаю неправильно/отсутствует здесь?

4b9b3361

Ответ 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