我有一个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