2017-02-16 39 views
11

我試圖寫一個分析器使用parserspackage使用do語法。這裏是一個例子:ApplicativeDo語言擴展與`分析`應用仍然在尋找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給我的錯誤是​​。此錯誤消息是正確的,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