【问题标题】:How to apply a function in an iterable list如何在可迭代列表中应用函数
【发布时间】:2021-04-16 00:04:18
【问题描述】:

所以我是 OCaml 的新手,我在处理列表时遇到了一些问题。 我所拥有的是一个字符列表,如下所示:

let letters = [a;b;c;d]

我想知道如何迭代列表并应用一个函数,该函数将列表中两个字符的每个可能组合(do_someting char1 char2)作为参数,例如:a 和 b(do_something ab),a 和c .... d 和 b,d 和 c;永远不要重复相同的元素(a 和 a 或 c 和 c 不应该发生)。

【问题讨论】:

    标签: list function loops functional-programming ocaml


    【解决方案1】:

    OCaml 是一种函数式语言,因此我们想尝试将过程分解为尽可能多的函数式部分。

    第 1 步是“列出事物并产生所有组合”。我们不在乎之后会发生什么;我们只想知道所有这些组合。如果您希望每个组合只出现一次(即在您的示例中,(a, b) 会出现,但 (b, a) 不会出现),那么一个简单的递归定义就足够了。

    let rec ordered_pairs xs =
      match xs with
      | [] -> []
      | (x :: xs) -> List.append (List.map (fun y -> (x, y)) xs) (ordered_pairs xs)
    

    如果您想要反向重复((a, b) (b, a)),那么我们可以在最后添加它们。

    let swap (x, y) = (y, x)
    
    let all_ordered_pairs xs =
      let p = ordered_pairs xs in
      List.append p (List.map swap p)
    

    现在我们有了所有元组的列表。接下来会发生什么取决于你想要什么样的结果。您很可能正在查看内置 List module 中的某些内容。如果您想将该函数应用于每一对以产生副作用,List.iter 就可以了。如果您想将结果累积到一个新列表中,List.map 会这样做。如果您想应用一些操作来组合结果(例如,每个函数返回一个数字并且您想要数字的总和),那么 List.map 后跟 List.fold_left(或复合 List.fold_left_map)就可以了。

    当然,如果您刚刚开始,自己编写这些List 函数会很有启发性。它们中的每一个都是简单的一两行递归定义,对自己编写很有指导意义。

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 1970-01-01
      • 2014-03-13
      • 2021-02-25
      • 1970-01-01
      • 2018-03-19
      • 2020-11-20
      • 2022-01-09
      • 1970-01-01
      相关资源
      最近更新 更多