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
的类型签名中是什么意思?
ParsecT
和 Parsec
在parsec
3中,ParsecT
和Parsec
的定义和解释在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
.
(流类型示例为 String
、ByteString
和 Text
。)
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)
我了解 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
的类型签名中是什么意思?
ParsecT
和 Parsec
在parsec
3中,ParsecT
和Parsec
的定义和解释在Text.Parsec.Prim
module:
data ParsecT s u m a
ParsecT s u m a
is a parser with stream types
, user state typeu
, underlying monadm
and return typea
.
(流类型示例为 String
、ByteString
和 Text
。)
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)