OCAML : 두 세트의 모든 값의 순열? (자바에서 이것을 번역하는 방법)
-
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
;;
제휴하지 않습니다 StackOverflow