我在OCaml中遇到了一个问题,我需要在列表列表上执行算术操作。作为参数,我传递列表列表,例如[[1;2;3]; [4;5;6]];
,以及像这样的['+'; '*'; '-']
字符列表。
这就是我到目前为止所知道的:
let addition = List.map (List.fold_left ( + ) 0);;
let multiplication = List.map (List.fold_left ( * ) 0);;
let subtraction = List.map (List.fold_left ( - ) 0);;
let list = [[1;2;3]; [4;5;6]; [7;8;9]];;
let operators = ['+'; '*'; '-'];;
let rec rows l o =
match (l, o) with
([], []) -> []
(hd::tl, op::tlo) ->
(
match hd with
[] -> 0::(rows tl tlo)
h::t ->
这是缺少的部分,我不知道如何匹配第一个运算符与列表列表中的第一个列表,第二个运算符与第二个列表列表,依此类推,以及如何对列表中的元素执行操作。
我尝试使用List.iter
遍历每个运算符,但我对如何将运算符列表中的位置与列表列表进行匹配感到困惑。
对于给定的列表列表和给定的运算符,结果应该是[6; 120; -10]
。
我是OCaml的新手,如果我错过了一些非常明显的东西,我很抱歉,任何帮助都是非常感谢的。
发布于 2020-04-11 00:26:07
您可以并行映射两个列表,假设它们具有相同的长度
let rec map2 f xs ys = match xs,ys with
| [], [] -> []
| x :: xs, y :: ys -> f x y :: map2 f xs ys
| _ -> invalid_arg "map2: list length mismatch"
这个函数非常简单-给定函数f
和两个长度相等的列表[x1; ...; xM]
和[y1;...;yM]
,它构造一个新的列表,其中第i个元素是f xi yi
的结果,即[f x1 y1; ...; f xM yM]
。例如,我们现在可以获取一个运算符列表和一个整数列表,并使用相应的运算符缩减每个列表:
# map2 (fun op -> List.fold_left op 0) [(+); (-)] [[1;2;3]; [3;2;1]];;
- : int list = [6; -6]
我认为从这里开始,您可以填充空白处:)
我的建议是,不要试图用一个同时做所有事情的大函数来解决你的问题,试着做一些小问题,你可以咬的东西。这是函数式(和任何其他)编程的本质--编写小型的可组合函数。将任务拆分成多个小的子任务,分别求解,然后合并。
https://stackoverflow.com/questions/61144081
复制相似问题