2015-06-29 145 views
3

我明白Parsec模塊的parse功能,這需要一個規則的說法,錯誤信息,並輸入字符串:Parsec String()(String,String)是什麼意思?

parse rule text = Parsec.parse rule "(source)" text 

不過,我不明白的Parsec.Parsec含義,或者它是如何的不同。 Parsec.ParsecT。爲什麼自定義分析器的類型簽名使用這個名稱?

例如,在從this blogpost採取下面的代碼片段,

myParser :: Parsec.Parsec String() (String,String) 
myParser = do 
    letters <- Parsec.many1 Parsec.letter 
    Parsec.spaces 
    digits <- Parsec.many1 Parsec.digit 
    return (letters,digits) 

是什麼Parsec.Parsec()myParser的類型簽名是什麼意思?

+2

'ParsecT'和'Parsec'在'Text.Parsec.Prim'模塊中定義和解釋。看看[Hackage](http://hackage.haskell.org/package/parsec-3.1.9/docs/Text-Parsec-Prim.html)。 – Jubobs

回答

7

Parsec

parsec 3,和Parsec被定義並在Text.Parsec.Prim module解釋:

data ParsecT s u m a

ParsecT s u m a與流類型s,用戶狀態類型u解析器,基礎monad m和返回類型a

(流類型的實例是StringByteString,並Text。)

Parsec是一個簡單的版本的專門到Identity monad

type Parsec s u = ParsecT s u Identity

myParser前的簽名plained

再回到你的類型的簽名,在

myParser :: Parsec.Parsec String() (String,String) 
  • 流類型是String;
  • 用戶狀態只是空的元組(也稱爲「單元」);換句話說,myParser解析一些東西,但沒有跟蹤任何有用的狀態;
  • 結果類型是一對String s。

此外,類型簽名使用Parsec.Parsec(而不是簡單地Parsec),因爲,在the blogpost you link toText.Parsec導入qualified作爲Parsec

Parser類型同義詞

如果你所有的解析器有流類型String,不保留任何狀態的跟蹤,你可能想一些抽象的那parsec複雜了。在這種情況下,你應該使用Parser型代名詞,其Text.Parsec.String模塊定義爲

type Parser = Parsec String() 

舉例來說,有以下進口

import Text.Parsec.String (Parser) 

可以簡化myParser的類型簽名

myParser :: Parser (String, String) 
相關問題