Functional programming 如何创建在OCaml中反转int列表的函数?

Functional programming 如何创建在OCaml中反转int列表的函数?,functional-programming,ocaml,Functional Programming,Ocaml,我有一个类型列表: type intlist = Nil | Cons of int * intlist 现在我想写一个函数来反转列表。我真的不知道该怎么办。在课堂上,我们的教授在函数中定义了一个函数,我相信,但我没有解决方案。简单地说,一个人如何做到这一点?如果我们能保持代码的基本性,我将不胜感激,因为我对这方面还比较陌生 到目前为止,我只有 let reverse (l:intlist):intlist = match l with Nil -> Nil |Cons(a, Nil)

我有一个类型列表:

type intlist = Nil | Cons of int * intlist
现在我想写一个函数来反转列表。我真的不知道该怎么办。在课堂上,我们的教授在函数中定义了一个函数,我相信,但我没有解决方案。简单地说,一个人如何做到这一点?如果我们能保持代码的基本性,我将不胜感激,因为我对这方面还比较陌生

到目前为止,我只有

let reverse (l:intlist):intlist = 
match l with
Nil -> Nil
|Cons(a, Nil) -> Cons(a,Nil)

这就是我倾向于创建这类函数的方式,所以我写了一个简单的部分,这个部分可能不是我需要开始的。感谢您的帮助,谢谢

您确实需要一个helper函数,因为对于反转,您需要构建另一个列表,因此您需要一个递归到一个列表中的函数,同时构建另一个列表,即具有两个参数的列表。事实上,这个helper函数称为rev_append,它将一个列表的反向内容追加到另一个列表。但让我们尝试使用rev函数范围中定义的helper函数:

 let rev xs =
   let rec loop xs ys = match xs with
     | Nil -> ys
     | Cons (x,xs) -> loop xs (Cons (x,ys)) in
   loop xs Nil

所以,要反转一个列表,我们只需将列表中的每个元素放入另一个列表中。由于列表的行为类似于堆栈,所以我们可以免费获得反向列表。这就像河内塔,当你从一个列表塔中选取元素并将它们放到另一个列表塔中时,它们将以相反的顺序结束

您不必在函数中定义函数,您只需在顶层定义helper函数并从反向调用它即可。首先,保持语法简单。一旦一切正常,您仍然可以稍后将其作为本地函数。@Bergi Fair。有没有办法用一个函数来实现这一点?尝试使用一个包含两个参数的函数:一个用于当前列表前面已经反转的元素,另一个用于当前列表,即剩余的仍要反转的元素。否,我不认为有一种方法可以在不使用内置函数、不使用可变性的情况下使用单个函数来实现这一点,而不需要所有的硬东西。