首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将算术运算与OCaml中的列表进行匹配

将算术运算与OCaml中的列表进行匹配
EN

Stack Overflow用户
提问于 2020-04-11 00:04:33
回答 1查看 151关注 0票数 0

我在OCaml中遇到了一个问题,我需要在列表列表上执行算术操作。作为参数,我传递列表列表,例如[[1;2;3]; [4;5;6]];,以及像这样的['+'; '*'; '-']字符列表。

这就是我到目前为止所知道的:

代码语言:javascript
运行
复制
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的新手,如果我错过了一些非常明显的东西,我很抱歉,任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2020-04-11 00:26:07

您可以并行映射两个列表,假设它们具有相同的长度

代码语言:javascript
运行
复制
 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]。例如,我们现在可以获取一个运算符列表和一个整数列表,并使用相应的运算符缩减每个列表:

代码语言:javascript
运行
复制
# map2 (fun op -> List.fold_left op 0) [(+); (-)] [[1;2;3]; [3;2;1]];;
- : int list = [6; -6]

我认为从这里开始,您可以填充空白处:)

我的建议是,不要试图用一个同时做所有事情的大函数来解决你的问题,试着做一些小问题,你可以咬的东西。这是函数式(和任何其他)编程的本质--编写小型的可组合函数。将任务拆分成多个小的子任务,分别求解,然后合并。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61144081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档