List 如何在ocaml中一次迭代两个列表?
假设我有以下两个列表: 设a=[1;2;3;4];; 设b=[1;3;5;7];; 我想要第三个列表,包含a和b的索引式和;即 设c=[2;5;8;11]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
问题是如何仅使用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;;