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

What is the meaning of Parsec String () (String,String)?

我了解 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 的类型签名中是什么意思?

ParsecTParsec

parsec3中,ParsecTParsec的定义和解释在Text.Parsec.Prim module:

data ParsecT s u m a

ParsecT s u m a is a parser with stream type s, user state type u, underlying monad m and return type a.

(流类型示例为 StringByteStringText。)

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

type Parsec s u = ParsecT s u Identity

myParser的签名解释

回到你的类型签名,在

myParser :: Parsec.Parsec String () (String,String)
  • 流类型是String;
  • 用户状态就是空元组(也称为“单元”);换句话说,myParser 解析某些内容但不跟踪任何有用的状态;
  • 结果类型是一对String

此外,类型签名使用 Parsec.Parsec(而不是简单的 Parsec),因为在 the blogpost you link to, Text.Parsec is imported qualified 中作为 Parsec.

Parser类型同义词

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

type Parser = Parsec String ()

例如,使用以下导入

import Text.Parsec.String ( Parser )

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

myParser :: Parser (String, String)