【问题标题】:Matching arithemtic operations with a list of lists in OCaml将算术运算与 OCaml 中的列表匹配
【发布时间】:2020-04-10 16:04:33
【问题描述】:

我在 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 的新手,如果我错过了一些非常明显的东西,我很抱歉,非常感谢任何帮助。

【问题讨论】:

  • 如果您是 OCaml 的新手,那么您应该查看这个更适合讨论的链接:discuss.ocaml.org

标签: list matrix iteration ocaml


【解决方案1】:

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

 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的结果,即@ 987654327@。例如,我们现在可以获取一个运算符列表和一个整数列表列表,并使用相应的运算符对每个列表进行归约:

# map2 (fun op -> List.fold_left op 0) [(+); (-)] [[1;2;3]; [3;2;1]];;
- : int list = [6; -6]

我想你可以从这里填空:)

我的建议是,不要试图用一个同时处理所有事情的大函数来解决你的问题,试着把问题分成小块,你可以咀嚼的小块。这是函数式(和任何其他)编程的本质——编写小的可组合函数。将任务拆分为小的子任务,解决每个子任务,然后合并。

【讨论】:

  • 我尝试了上面的代码,这很有意义,但是我在这部分中不断收到语法错误 x :: xs, y :: ys (->) f x y :: map2 f xs ys I put它在括号中。
  • 代码在语法和语义上绝对正确。要么你没有正确地复制粘贴它,要么你将它插入到另一个表达式的中间。尝试复制粘贴到这里try.ocamlpro.com 并且绝对不需要添加任何括号,它们没有意义。
  • 它在网站上确实有效,我可能遗漏了一些东西。谢谢。
猜你喜欢
  • 2017-11-19
  • 1970-01-01
  • 2021-11-05
  • 2019-03-04
  • 2020-07-16
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多