返回列表中的所有值的递归函数(在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
这是不太灵活,但可以说是速度更快,比返回一个列表:列出了可筛选,排序,存储...
你的问题是怎么样的困惑 - 你想要的功能它返回列表中的所有值。那么返回可变数量值的最简单方法是使用一个列表!你是否试图模仿Python生成器? OCaml没有类似于yield
的任何东西,而是通常通过将一个函数“传递”到该值(使用iter
,fold
或map
)来实现相同。
当前已写什么就相当于这在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.mem
和List.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中。
谢谢你的回应。我一直在考虑用两个函数分两步来完成,就像你所描述的那样,但是我的问题是逐个检索每个元素。我应该更具体些。我的主要功能是一个子集函数,在该函数中,我负责确定列表a是否是列表b的子集。我需要以一种多态的方式编写这个函数,但现在我只能弄清楚如何用一个int列表来完成它。 – Atticus 2011-01-13 11:03:47