取第二个元素的列表的子列表
Sub list of a list in taking the second element
假设我有以下元组列表[("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
。换句话说,它是 returns 单位,这是 OCaml 中 return 什么都没有(或者无论如何都没有什么有趣的)的方式。
由于您希望函数得到 return 结果,因此不能使用 List.iter
。相反,您想以某种方式转换列表的每个元素。执行此操作的函数是 List.map
.
这是一个根据每个整数是奇数还是偶数将整数列表更改为布尔列表的函数:
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
表达。
作为旁注,您的结果不是通常所说的原始列表的子列表。子列表是包含旧列表的一些元素的新列表。我认为你可以称它为投影更准确。
假设我有以下元组列表[("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
。换句话说,它是 returns 单位,这是 OCaml 中 return 什么都没有(或者无论如何都没有什么有趣的)的方式。
由于您希望函数得到 return 结果,因此不能使用 List.iter
。相反,您想以某种方式转换列表的每个元素。执行此操作的函数是 List.map
.
这是一个根据每个整数是奇数还是偶数将整数列表更改为布尔列表的函数:
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
表达。
作为旁注,您的结果不是通常所说的原始列表的子列表。子列表是包含旧列表的一些元素的新列表。我认为你可以称它为投影更准确。