4

Set.Make(t) によって返される 2 つのセットがあります。2 つの値の可能なすべての組み合わせを生成したいと思います。これどうやってするの?

これはいくつかのペアを生成するために機能しますが、すべてではありません:

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

これはJavaでそれを行います:

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

3 に答える 3

6

@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も末尾再帰です)。

于 2009-10-02T18:32:29.440 に答える
5

xsとが 2 つのリストの場合ys、それらのデカルト積 (ペアのリストを返す) は次のように計算できます。

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

この場合、あなたのxsandysIntSet.elements odpandIntSet.elements ftw

于 2009-10-02T04:17:53.283 に答える
3

2セットのデカルト積を探しています。

この質問は、OCamlメーリングリストのスレッドで尋ねられました。この答えはBrianHurtによって提供されています:For

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
;;
于 2009-10-02T02:44:24.317 に答える