我理解 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 中定义和解释:
(流类型的示例是 String
、 ByteString
和 Text
。)Parsec
只是一个专用于 ParsecT
monad 的 Identity
版本:
myParser
的签名解释
回到你的类型签名,在
myParser :: Parsec.Parsec String () (String,String)
String
; myParser
解析了一些东西,但不跟踪任何有用的状态; String
。 此外,类型签名使用
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)
关于haskell - Parsec String()(String,String)是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31115506/