我理解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
的类型签名中的含义是什么?
答案 0 :(得分:8)
ParsecT
和Parsec
在parsec
3中,Text.Parsec.Prim
module中定义并解释了ParsecT
和Parsec
:
data ParsecT s u m a
ParsecT s u m a
是一个解析器,其流类型为s
,用户状态类型为u
,基础monad为m
,返回类型为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
s。此外,类型签名使用Parsec.Parsec
(而不仅仅是Parsec
),因为在the blogpost you link to中,Text.Parsec
导入qualified为Parsec
}。
Parser
类型同义词如果您的所有解析器都有流类型String
并且没有跟踪任何状态,那么您可能希望将某些parsec
复杂性抽象出来。在这种情况下,您应该使用Parser
类型同义词,Text.Parsec.String
模块定义为
type Parser = Parsec String ()
例如,使用以下导入
import Text.Parsec.String ( Parser )
您可以将myParser
的类型签名简化为
myParser :: Parser (String, String)