【问题标题】:OCaml: Permutation of every value in two sets? (how to translate this from Java)OCaml:两组中每个值的排列? (如何从 Java 翻译这个)
【发布时间】:2009-10-02 02:28:31
【问题描述】:

我有两个集合,由 Set.Make(t) 返回。我想生成两者中值的所有可能组合。我该怎么做?

这可以生成一些对,但不是全部:

List.combine (IntSet.elements odp) (IntSet.elements ftw)

这可以在 Java 中实现:

for (int i : ktr) {
     for (int m : mnx) {
       System.out.println(i + ", " + m);
     }
}

【问题讨论】:

    标签: java ocaml permutation


    【解决方案1】:

    将@David Crawshaw 的解决方案(尾递归)与@newacct 的解决方案(完全通用)结合起来:

    let cartesian_product xs ys =
      List.fold_left (fun acc x -> 
        List.fold_left (fun acc y -> 
          (x,y) :: acc) 
          acc ys) 
        [] xs
    
    let product = 
      cartesian_product (IntSet.elements odb) (IntSet.elements ftw)
    

    这将颠倒自然顺序。可以通过将List.rev 应用于结果来重新获得它(List.rev 也是尾递归的)。

    【讨论】:

    • this 不进行类型检查:错误:此表达式的类型为 'a -> ('b * 'a) list -> ('b * 'a) list 但此处与类型 ' 一起使用a -> ('b * 'a) 列表 -> 'a
    【解决方案2】:

    如果xsys 是两个列表,那么它们的笛卡尔积(返回对列表)可以计算如下:

    List.concat (List.map (fun x -> List.map (fun y -> (x, y))
                                             ys)
                          xs)
    

    在这种情况下,您的 xsysIntSet.elements odpIntSet.elements ftw

    【讨论】:

      【解决方案3】:

      您正在寻找两组的笛卡尔积。

      已在 OCaml 邮件列表中向 in a thread 提出此问题。这个答案由Brian Hurt提供:对于

      module TypeSet = Set.Make(Type);;

      创建,代表产品:

      module TypeType = struct
          type t = Type.t * Type.t;;
          let compare (x1, x2) (y1, y2) =
              let r = Type.compare x1 y1 in
              if r == 0 then
                  Type.compare x2 y2
              else
                  r
          ;;
      end;;
      
      module TypeTypeSet = Set.Make(TypeType);;
      

      然后生成产品:

      let cartesian_product s1 s2 =
          let f x y t = TypeTypeSet.add (x, y) t in
          let g x t = TypeSet.fold (f x) s2 t in
          TypeSet.fold g s1 TypeTypeSet.empty
      ;;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-18
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        • 2023-01-09
        相关资源
        最近更新 更多