2015-06-29 106 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) 
相关问题