OCAML : 두 세트의 모든 값의 순열? (자바에서 이것을 번역하는 방법)

StackOverflow https://stackoverflow.com/questions/1507496

  •  19-09-2019
  •  | 
  •  

문제

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);
     }
}
도움이 되었습니까?

해결책

만약에 xs 그리고 ys 두 개의 목록이면 직교 제품 (쌍 목록을 반환)을 다음과 같이 계산할 수 있습니다.

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

이 경우 당신의 xs 그리고 ys ~이다 IntSet.elements odp 그리고 IntSet.elements ftw

다른 팁

@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 또한 꼬리 재고입니다).

당신은 두 세트의 데카르트 제품을 찾고 있습니다.

이 질문이 요청되었습니다 스레드에서 OCAML 메일 링리스트에서. 이 답변은 제공됩니다 브라이언 상처: 을 위한

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
;;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top