let rec elements list = match list with
| [] -> []
| h::t -> h; elements t;;
我需要在另一个我编写的函数中每次使用返回的每个元素,因此我需要逐个使用这些元素,但我无法解决这部分。任何帮助将不胜感激。
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) = []
这不是一个非常有用的函数。
然而,在尝试解决此问题之前,请了解 Objective 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 等于 b 中的任何元素,则返回 true(是成员)。List.for_all
接受一个返回布尔值的函数(在我们的情况下,刚刚定义的成员函数)和一个列表。它将该函数应用于列表中的每个元素。如果该函数对列表中的每个值都返回 true,则 for_all
返回 true。
所以我们所做的就是:对于 a 中的所有元素,检查它们是否是 b 的成员。如果您有兴趣自己编写这些函数,那么我建议阅读 list.ml 的源代码,它(假设 *nix)可能位于 /usr/local/lib/ocaml 或 /usr/lib/ocaml。
let subset a b = List.for_all (fun i -> List.mem i b) a
),同时还能对你已经写的代码进行建设性的评论。 - Victor Nicollet