【发布时间】:2022-01-12 18:43:00
【问题描述】:
如何从一个列表创建一个元组列表,如下所示:
[1; 2; 4; 6] -> [(1, 2); (4, 6)]
我想使用函数List.fold_left 来完成它,因为我目前正在尝试学习但不知道如何...有办法吗?还是我应该这样?
这是一个不使用List.fold_left的工作代码:
let rec create_tuple acc l = match l with
| [] -> acc
| x :: y :: l' -> create_tuple (acc @ [(x, y)]) l'
| _ -> acc
【问题讨论】:
-
“或者我应该这样吗?”这是什么问题?做你想做的……除了老师之外,没有任何高级 OCaml 权威会责怪你在不使用
List.fold_left的情况下解决这个问题……? -
除了您的工作代码(
List.fold_left将面临同样的问题):请注意,您当前的代码对于长列表(二次时间)非常低效,因为列表连接所花费的时间与其左侧的长度。一次构建一个列表的常用技巧是添加新元素 ((x, y) :: acc) 而不是附加它们 (acc @ [ (x, y) ]),然后在最后反转整个累加器。 -
List.fold_left对列表中的第一个元素和一个累加器进行操作。您无法直接匹配列表中的第一个 和 第二个元素。关键是你使用的累加器。 -
我应该说我有点厌倦了你的问题,这些问题看起来都像学生问题,没有显示任何(或很少)以前的工作并且不清楚所问的内容。我通常对 SO 并不严厉,但你没有做任何努力让我想回答你,我认为任何人都不应该这样做,因为你的问题并不是关于 SO 的那种被接受的问题。请考虑一下您在问什么,您是如何问的,以及我们回答您所需的最小努力。
-
我总体上同意,但这里问题很明确且有道理。