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

最佳答案

ParsecTParsecparsec 3 中,ParsecTParsec Text.Parsec.Prim module 中定义和解释:

(流类型的示例是 StringByteStringText 。)Parsec 只是一个专用于 ParsecT monadIdentity 版本:
myParser 的签名解释
回到你的类型签名,在

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

  • 此外,类型签名使用 Parsec.Parsec (而不仅仅是 Parsec ),因为在 the blogpost you link to 中, Text.Parsec 被导入 qualified 作为 ParsecParser 类型同义词
    如果您所有的解析器都具有流类型 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/

    10-11 03:57