List 如何在ocaml中一次迭代两个列表?

List 如何在ocaml中一次迭代两个列表?,list,functional-programming,ocaml,fold,List,Functional Programming,Ocaml,Fold,假设我有以下两个列表: 设a=[1;2;3;4];; 设b=[1;3;5;7];; 我想要第三个列表,包含a和b的索引式和;即 设c=[2;5;8;11] 问题是如何仅使用List.fold_right、List.fold_left和/或List.map中的函数来实现这一点?(这是一个家庭作业问题,因此我不允许使用递归函数或@)。函数执行以下操作: let c = List.map2 (fun i j -> i+j) a b;; map2功能执行以下操作: let c = List.ma

假设我有以下两个列表: 设a=[1;2;3;4];; 设b=[1;3;5;7];; 我想要第三个列表,包含a和b的索引式和;即 设c=[2;5;8;11]


问题是如何仅使用List.fold_right、List.fold_left和/或List.map中的函数来实现这一点?(这是一个家庭作业问题,因此我不允许使用递归函数或@)。

函数执行以下操作:

let c = List.map2 (fun i j -> i+j) a b;;

map2
功能执行以下操作:

let c = List.map2 (fun i j -> i+j) a b;;

由于这是一个家庭作业问题,我们只能给出提示

假设您想使用
List.map
List.map
的类型是
('a->'b)->'a List->'b List
。换句话说,它只适用于一个列表。如果你想用它来解决你的问题,你必须找到自己的方法将两个列表合并成一个列表。您不能使用
List.map
来执行此操作,无论您如何组合列表,都可以为您进行添加。所以这看起来不太可能

现在假设您想使用
列表。向左折叠
List.fold\u left
的类型是
('a->'b->'a)->'a->'b List->'a
。折叠的好处在于,它允许您携带类型为
'a
的任意累积状态。它允许您在处理列表时对该累积状态执行任意修改


在我看来,你可以将你的一份清单视为这一累积状态的一部分,同时使用折叠处理另一份清单。

由于这是一个家庭作业问题,我们只能给出提示

假设您想使用
List.map
List.map
的类型是
('a->'b)->'a List->'b List
。换句话说,它只适用于一个列表。如果你想用它来解决你的问题,你必须找到自己的方法将两个列表合并成一个列表。您不能使用
List.map
来执行此操作,无论您如何组合列表,都可以为您进行添加。所以这看起来不太可能

现在假设您想使用
列表。向左折叠
List.fold\u left
的类型是
('a->'b->'a)->'a->'b List->'a
。折叠的好处在于,它允许您携带类型为
'a
的任意累积状态。它允许您在处理列表时对该累积状态执行任意修改

在我看来,当你用折叠处理另一个列表时,你可以将其中一个列表视为此累积状态的一部分。

(*用折叠左和@*)

(*带左折叠,不带@但修订*)

(*带左折叠,不带@*)

(*带右折叠*)

(*带地图*)

(*带mapi*)

(*带map2*)

(*带左折叠和@*)

(*带左折叠,不带@但修订*)

(*带左折叠,不带@*)

(*带右折叠*)

(*带地图*)

(*带mapi*)

(*带map2*)


你只是在陈述问题。你尝试过什么,为什么不奏效?你只是在陈述问题。您尝试了什么,为什么不起作用?另外,
map2
在相同长度的列表上工作,否则函数会引发异常这将是一个很好的答案,但map2不是我允许使用的函数之一。这是一个很好的观察结果,您需要为列表的不同长度制定计划。此外,
map2
适用于长度相同的列表,否则函数会引发异常这将是一个很好的答案,但map2不是我允许使用的函数之一。这是一个很好的观察结果,当列表长度不同时,您需要制定计划。
let (_,c)=
  List.fold_left( fun (iPos,la) ia ->
    (iPos-1,ia+List.nth b iPos::la) 
  ) (List.length b-1,[]) (List.rev a);;
let (_,c)=
  List.fold_left( fun (iPos,la) _ ->
    (iPos-1,List.nth a iPos+List.nth b iPos::la)  
  ) (List.length b-1,[]) a
let (_,c)=
  List.fold_right( fun ia (iPos,la) ->
    (iPos-1,ia+List.nth b iPos::la) 
  ) a (List.length b-1,[])  ;;
let c=
  let riPos=ref (-1) in
  List.map ( fun ia ->
    riPos := !riPos+1;
    ia+List.nth b !riPos
  ) a ;;
let c=
  List.mapi ( fun iPos ia ->
    ia+List.nth b iPos
  ) a ;;
let c=List.map2 (+) a b;;