2017-02-16 33 views
11

Я пытаюсь написать синтаксический анализатор с использованием parserspackage с использованием do. Вот пример:ApplicativeDo расширение языка с аппликацией `Parsing` все еще ищет экземпляр Monad

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

ответ

14

Выяснил это. Чтобы получить этот пример, чтобы работать на 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

+0

Ого, я удивлен, что «ApplicativeDo» не справился с этим довольно очевидным случаем! –

+0

'ApplicativeDo' довольно глупый. Например. он не может обрабатывать оператор 'let' любого типа – luqui

+0

У меня была аналогичная проблема: http://stackoverflow.com/questions/41210599/applicativedo-not-working-with-sequencing – danidiaz