Parsec String()(String,String)是什么意思?

时间:2015-06-29 12:17:36

标签: haskell parsec

我理解Parsec模块'parse函数,它接受规则参数,错误消息和输入字符串:

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的类型签名中的含义是什么?

1 个答案:

答案 0 :(得分:8)

ParsecTParsec

parsec 3中,Text.Parsec.Prim module中定义并解释了ParsecTParsec

  

data ParsecT s u m a

     

ParsecT s u m a是一个解析器,其流类型为s,用户状态类型为u,基础monad为m,返回类型为a

(流类型的示例包括StringByteStringText。)

Parsec只是ParsecT的一个版本,专门用于Identity monad

  

type Parsec s u = ParsecT s u Identity

myParser的签名解释

返回

中的类型签名
myParser :: Parsec.Parsec String () (String,String)
  • 流类型为String;
  • 用户状态只是空元组(也称为&#34; unit&#34;);换句话说,myParser解析一些东西,但没有跟踪任何有用的状态;
  • 结果类型是一对String s。

此外,类型签名使用Parsec.Parsec(而不仅仅是Parsec),因为在the blogpost you link to中,Text.Parsec导入qualifiedParsec }。

Parser类型同义词

如果您的所有解析器都有流类型String并且没有跟踪任何状态,那么您可能希望将某些parsec复杂性抽象出来。在这种情况下,您应该使用Parser类型同义词,Text.Parsec.String模块定义为

type Parser = Parsec String ()

例如,使用以下导入

import Text.Parsec.String ( Parser )

您可以将myParser的类型签名简化为

myParser :: Parser (String, String)