我有一个OCaml函数,我从帖子中获得:List reversing in 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
," =功能"意思是,为什么我们不使用匹配?我假设这与不必指定某些论点有关;我确实在课程的最后部分记住了一些内容,这只是简单介绍的内容。是否与currying有关?
对不起,如果这些都是愚蠢的问题;如果不是很明显的话,我对函数式编程很陌生。
非常感谢任何帮助。感谢。
答案 0 :(得分:5)
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
的每个版本都接受两个参数
答案 1 :(得分:0)
你是对的,rev_acc是一个接受一个参数的函数。然后它返回一个带另一个参数的函数。所以当你写
rev_acc [] l
实际发生的是
let unnamed_function = rev_acc []
in
unnamed_function l