假设我有下面的元组列表。[("a", "b"); ("c", "d"); ("e", "f"); ("g", "h"); ("i", "j")]
. 我想通过取该列表中每个元组的第二个元素来创建一个子列表。换句话说,我想得到 ["a"; "d"; "f", "h"]
.
我试过 iter (fun (x,y) -> liste@[y]) old_list;;
但我得到了
Error: This expression has type (string * string) list
but an expression was expected of type unit
我必须使用递归函数吗?有什么变通办法吗?
的类型 List.iter
是 ('a -> unit) -> 'a list -> unit
. 换句话说,它返回单元,这在OCaml中是什么也不返回的方式(或者说没有什么有趣的东西)。
由于你希望你的函数返回一个结果,你不能使用 List.iter
. 相反,你想以某种方式转换列表中的每个元素。这样做的函数是 List.map
.
这里有一个函数,根据每个int是奇数还是偶数,将一个ints列表变成一个bool列表。
let is_even list = List.map (fun x -> x mod 2 = 0) list
它的工作原理是这样的:
# is_even [3;4;5;6;7];;
- : bool list = [false; true; false; true; false]
你想用不同的 fun
的表达式。
顺便说一下,你的结果并不是通常所说的原始列表的子列表。子列表是包含旧列表中一些元素的新列表。我想你可以称之为投影更准确。