parsing - OCaml 解析函数

标签 parsing functional-programming ocaml

这是来自解析器模块的函数。我无法理解一行代码

 let rec e1 tokens =
   match tokens with
    Tokenizer.IfTok :: tokens1 -> 
      let (testAST, tokens2) = e1 tokens1
      in
      (match tokens2 with
          Tokenizer.ThenTok :: tokens3 ->
            let (thenAST, tokens4) = e1 tokens3
            in
            (match tokens4 with
                Tokenizer.ElseTok :: tokens5 ->
                  let (elseAST, tokens6) = e1 tokens5 
                  in
                  (If(testAST, thenAST, elseAST), tokens6)
              | _ -> raise (Syntax ("e1: missing else.")))
        | _ -> raise (Syntax ("e1: missing then.")))
  | _ -> e2 tokens

and e2 tokens = ........

我不知道这条线是如何工作的
let (testAST, tokens2) = e1 tokens1 in

我知道它声明了一个作为元组的局部变量,但是值(testAST,tokens2)来自哪里?它似乎与 token 或 token 1没有任何关系。此行是否仅声明一个元组或它也调用该函数?谢谢!

最佳答案

是的,这一行确实声明了两个变量并调用了函数e1。 ,将变量绑定(bind)到函数调用的结果。

这种绑定(bind)变量的方式称为模式匹配。它基于函数返回类型的信息 e1 - 编译器知道它返回一个元组,然后它可能被分解为多个部分,这些部分绑定(bind)到两个新变量 testASTtokens2 .它是 FP 最强大的功能之一,它使您可以编写更易读、更灵活、更简洁的代码。

如果编译器知道该实体(模式)的结构(例如 Scala 中的案例类、Haskell 中的元组和列表、Erlang 中的记录等),它也可以在所有内容上完成(匹配)。模式匹配也可用于忽略与条件无关的结构的某些部分(例如,在 Haskell 中,如果您想选择三元组中的第二项,只需执行 selectSecond (_, a, _) = a ,其中 _ 是特殊符号忽略值)。

关于parsing - OCaml 解析函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13130843/

相关文章:

从子数组中获取单个项目的快速功能方法

c# - c# - 如何将函数传递给具有不同参数的函数并执行它

exception - 如何断言函数抛出异常?

java - 从身份验证后的 Web 获取 XML

parsing - 在用 Ocaml 编写的编译器中,在哪里/如何声明变量的唯一键?

functional-programming - Kotlin - 如何在列表中查找重复值的数量?

ocaml - (懒)Haskell 在 OCaml 中未定义/底部

c# - 是否可以从 .NET 调用 OCaml?

java - 在Java中解析管道分隔的字符串(管道可以转义)

javascript - Webkit 日期解析