gpt4 book ai didi

parsing - OCaml 解析函数

转载 作者:行者123 更新时间:2023-12-01 02:30:43 25 4
gpt4 key购买 nike

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

 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com