返回列表中的所有值的递归函数(在OCaml中)

问题描述:

我需要一个函数,每次迭代都递归地返回(不打印)列表中的所有值。但是,每次我尝试编程时,我的函数都会返回一个列表。返回列表中的所有值的递归函数(在OCaml中)

let rec elements list = match list with 
| [] -> [] 
| h::t -> h; elements t;; 

我需要使用它在我写的另一个函数返回的每一次每一个元素,所以我需要在同一时间这些元素之一,但我不知道这部分了。任何帮助,将不胜感激。

你的功能等同于:

let rec elements list = 
    match list with 
    | [] -> [] 
    | h :: t -> elements t 

这是因为a ; b评估a(和丢弃结果),然后计算并返回b。很明显,这又相当于:

let elements (list : 'a list) = [] 

这不是一个非常有用的功能。

然而,在您尝试解决此问题之前,请理解目标Caml函数只能返回一个值。返回多个价值是不可能的。

有办法解决这个限制。一种解决方案是将所有希望返回的值打包成单个值:通常是元组或列表。所以,如果你需要返回元素的任意号码,你就会把它们捆绑在一起成一个列表并调用代码的过程,列出:

let my_function() = [ 1 ; 2; 3; 4 ] in (* Return four values *) 
List.iter print_int (my_function()) (* Print four values *) 

另一个不太常见的解决方案是提供的功能和调用它每个结果:

let my_function action = 
    action 1 ; 
    action 2 ; 
    action 3 ; 
    action 4 
in 
my_function print_int 

这是不太灵活,但可以说是速度更快,比返回一个列表:列出了可筛选,排序,存储...

+0

谢谢你的回应。我一直在考虑用两个函数分两步来完成,就像你所描述的那样,但是我的问题是逐个检索每个元素。我应该更具体些。我的主要功能是一个子集函数,在该函数中,我负责确定列表a是否是列表b的子集。我需要以一种多态的方式编写这个函数,但现在我只能弄清楚如何用一个int列表来完成它。 – Atticus 2011-01-13 11:03:47

你的问题是怎么样的困惑 - 你想要的功能它返回列表中的所有值。那么返回可变数量值的最简单方法是使用一个列表!你是否试图模仿Python生成器? OCaml没有类似于yield的任何东西,而是通常通过将一个函数“传递”到该值(使用iter,foldmap)来实现相同。

当前已写什么就相当于这在Python:

def elements(list): 
    if(len(list) == 0): 
     return [] 
    else: 
     list[0] 
     return elements(list[1:]) 

如果你正在试图做到这一点:

def elements(list): 
    if(len(list) > 0): 
     yield list[0] 
     # this part is pretty silly but elements returns a generator 
     for e in elements(list[1:]): 
      yield e 

for x in elements([1,2,3,4,5]): 
    dosomething(x) 

OCaml中的等价物会是这样的:

List.iter dosomething [1;2;3;4;5] 

如果您试图确定列表a是否是列表b的子集(正如我从您的评论),然后就可以采取的List.memList.for_all优点:

List.for_all (fun x -> List.mem x b) a 

fun x -> List.mem x b定义如果x的值等于在任意元素,则返回true(是)B的成员的功能。 List.for_all需要一个函数返回一个bool(在我们的例子中,我们刚才定义的成员函数)和一个列表。它将该函数应用于列表中的每个元素。如果该函数对列表中的每个值返回true,则for_all返回true。

所以我们所做的是:对于a中的所有元素,检查它们是否是b的成员。如果你对如何自己编写这些函数感兴趣,那么我建议阅读list.ml的源文件(假设* nix)可能位于/ usr/local/lib/ocaml或/ usr/lib/ocaml中。