モジュールのアクセシビリティ管理を手抜きする

F# には、モジュール内の要素(型、関数)のアクセシビリティを指定するには、2つの方法があります。

  1. シグネチャファイルを使う
  2. 非公開要素毎に internal / private を指定する

シグネチャファイルは、型名のみ公開しメンバは隠すなど、柔軟にアクセシビリティを指定できます。しかし、実装とシグネチャが別ファイル、同期が大変、という辛さがあり、手軽には使えません。

また、非公開要素毎に internal / private を指定する方法は、要素数が多くなれば指定に手間がかかる、ファイルを見ただけでは公開メンバの一覧が分からない問題があります。

シグネチャファイルを使うまでもなく、手軽にアクセシビリティを制御したい場合は、こう書くと良いんじゃないかなぁと思います。

module Hoge

(* 公開したい型はここに定義する *)

module internal Impl =
  (* 実装に必要な関数、型をImplモジュールに押し込む *)

  let f x = ()

let f x = Impl.f x (* 実際に公開したい関数 *)