使用递归反转 OCaml 中的列表

Reversing a list in OCaml with recursion

我正在寻找一种在 Ocaml 中反转列表的算法:

let rec reverseList list revList=
   match list with 
     | [] -> revList
     | h::t -> reverseList t revList@[h]

一个使用示例是:

let list = [1;2;3;4];;
reverseList list [];;

而且我想知道为什么会这样。据我了解,如果我们按照上面的定义反转 list,我们将查看函数调用:

reverseList [1;2;3;4] []
reverseList [2;3;4] [1]
reverseList [3;4] [1;2]
reverseList [4] [1;2;3]
reverseList [] [1;2;3;4]

这会 return [1;2;3;4]。但是,此代码有效。那么为什么它有效,为什么不是最后一行

| h::t -> reverseList t [h]@revList

我隐隐约约知道它与柯里化有关,但我不太了解。请帮忙!

表达式:

reverseList t revList@[h]

解析如下:

(reverseList t revlist) @ [h]

也就是说,它首先递归地反转尾部,然后将新元素添加到末尾。这确实有效(尽管它不是反转列表的有效方法。)

另请注意,revList 参数只是一个空列表。