有人可以解释一下这个反转列表元素的 OCaml 函数是如何工作的吗?



我有一个OCaml函数,我从帖子中得到:Ocaml 中的列表反转

let rev_list l =
let rec rev_acc acc = function
| [] -> acc
| hd::tl -> rev_acc (hd::acc) tl
in 
rev_acc [] l

我对此进行了测试,它显然有效,但我不明白为什么。在 main 函数内部,当定义rev_acc时,它说它只接受参数acc。但是,当然后使用两个参数调用函数时。为什么允许我们这样做?

另外,为什么我们说let rec rev_acc acc = function,"=函数"是什么意思,为什么我们不使用匹配?我假设这与不必指定某些参数有关;我确实记得在课程的最后一部分关于这一点的一些事情,它只是简要地介绍了。和咖喱有什么关系吗?

对不起,如果这些是愚蠢的问题;我对函数式编程相当陌生,如果这还不明显的话。

任何帮助将不胜感激。谢谢。

Ocaml 有一个特殊的function语法,它采用隐式参数并自动将其插入到要遵循的匹配表达式中

程序中的rev_acc函数是使用function

定义的
let rec rev_acc acc = function
| [] -> acc
| hd::tl -> rev_acc (hd::acc) tl

这相当于

let rec rev_acc acc xs =
match xs with
| [] -> acc
| hd::tl -> rev_acc (hd::acc) tl 

上面,每个版本的rev_acc都接受两个参数

你是对的,rev_acc是一个接受一个参数的函数。但是它随后返回一个采用另一个参数的函数。所以当你写的时候

rev_acc [] l

实际发生的是

let unnamed_function = rev_acc []
in
unnamed_function l

最新更新