형식 생성자에 인수가 없으므로 stdlib Set
은 다형성 일 수 없습니다. 그러나 펑터으로 임의의 집합에 임의의 세트에서 map
을 표현할 수 :
module MapSet (S1:Set.S) (S2:Set.S) = struct
let map f a = S1.fold (fun elt set -> S2.add (f elt) set) a S2.empty
end
사용법 : 당신이 볼 수 있듯이
module IntSet = Set.Make (struct type t = int let compare = compare end)
module StringSet = Set.Make (String)
module MapSI = MapSet (StringSet) (IntSet)
# IntSet.elements (MapSI.map String.length (StringSet.of_list ["a"; "zonk"; "blart"]));;
- : IntSet.elt list = [1; 4; 5]
, 그것은 간단하지만, 자세한와 'namey'입니다.
또 다른 대안은 변경 가능한 집합으로 ('a, unit) Hashtbl
을 사용하는 것입니다.이 집합은 후드에서 다형성 평등을 사용합니다 (모든 일반적인 단점이 있음).
let map_keys f tbl =
let new_tbl = Hashtbl.create (Hashtbl.length tbl) in
Hashtbl.iter (fun k v -> Hashtbl.replace new_tbl (f k) v) tbl;
new_tbl
가 Hashtbl
은 최악의 경우는 Set
가하는, 또는 효율적인 조합/DIFF/교차로 운영 보장 제공하지 않는 것을 염두해야합니다 : 당신은 쉽게 자신의 map
작업을 구현할 수 있습니다.
출처
2017-03-21 04:53:02
gsg
멋진 솔루션입니다. 한 가지 질문 : 'Hashtbl은 Set가하는 최악의 보장을 제공하지 않는다'는 것은 무엇을 의미합니까? –
'Set','mem','add' 등은 집합의 크기가 대수입니다. 'Hashtbl'의 최악의 경우는 O (n)입니다 만, 일어날 확률은 낮습니다. – gsg