OCamlのSet.Sにmap関数はない

最近研究でOCamlのSetやMapを多用するんですが、Set.Sの中にmap関数はないんですね。
タプルの特定要素を取り出したり情報を付与したりするときにSet->Set変換する必要があるんですが、いちいちfoldするのが面倒……
Listなんかにはmap関数があるのであってもよさそうなものですが、よく考えるとこの関数、型として表現が難しい(というかできない)のですね。

Setはファンクターなので、例えばint型のSetなら(作れないですが)

int Set

ではなく

module IntSet = Set.Make  (struct    type t = int    let compare = compare   end)

といった感じになります。
要素の型や比較関数をまとめてストラクチャーとしてファンクターに与えることで、内部の型が固定されたストラクチャーが返されるわけです。

んで、ファンクターの内部では集合自体の型はt、要素の型はeltで表されてるわけです。例えば

empty : tadd : elt -> t -> t

といった具合です。(OCamlマニュアルより)
ところがここでmap関数を考えると、

map : (elt -> 'a) -> t -> 'a set(?)

といった具合で、出力が’aを要素とするSetになるわけですが、当然ファンクターはそんな型を知らないので定義できません。
with type構文とか使えないかなーと一瞬考えましたが、あれはSet.Sに型を与えてシグネチャを作るだけでしたね。全然関係ないです。

Continue reading
Newer posts