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

时间:2018-05-16 21:33:36

标签: functional-programming ocaml

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

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

非常感谢任何帮助。感谢。

2 个答案:

答案 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