Я пытаюсь написать синтаксический анализатор с использованием parsers
package с использованием 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
. Что я делаю неправильно/отсутствует здесь?
Ого, я удивлен, что «ApplicativeDo» не справился с этим довольно очевидным случаем! –
'ApplicativeDo' довольно глупый. Например. он не может обрабатывать оператор 'let' любого типа – luqui
У меня была аналогичная проблема: http://stackoverflow.com/questions/41210599/applicativedo-not-working-with-sequencing – danidiaz