OCamlのSignature
Interface的なものらしい
外部からの可視性を制御する
↓ほぼGPT-4.iconの回答
シグネチャの定義
code:ml
module type STACK = sig
(* ここに関数や型の定義を記述 *)
end
code:ml
module type STACK = sig
type 'a stack
val empty : 'a stack
val push : 'a -> 'a stack -> 'a stack
val pop : 'a stack -> 'a stack
end
module ListStack : STACK = struct
type 'a stack = 'a list
let empty = []
let push x s = x :: s
let pop = function [] -> [] | _ :: xs -> xs
end
この例では、
STACKというシグネチャを定義し、
ListStackモジュールでそれを実装している
このシグネチャによって、スタックを抽象化している
「リストを使用している」という詳細を隠蔽している
sigの方に= 'a listが書かれていないのがポイントmrsekut.icon
匿名シグネチャを使ってモジュールを定義
code:ml
module SafeCounter : sig
(* ここに公開したい関数や型の定義を記述 *)
end = struct
(* ここに実際の実装を記述 *)
end
SafeCounterモジュールの内部実装はこの匿名シグネチャに従う必要があり、このシグネチャを通じてのみ外部からアクセス可能な関数や型が公開されます。
code:ml
module SafeCounter : sig
type t
val create : unit -> t
val increment : t -> t
val get_value : t -> int
end = struct
type t = int
let create () = 0
let increment x = x + 1
let get_value x = x
end
この例では、SafeCounterモジュールがtype t = intとしてカウンターの型を定義していますが、この型定義はモジュール外部からは見えません。これにより、カウンターの値を直接操作することができず、提供された関数を通じてのみ操作を行うことができます。
この方法でモジュールを定義することにより、モジュールのインターフェース(公開API)と実装を明確に区別できます。また、この構文を使用すると、モジュールの実装詳細を隠蔽しつつ、必要なインターフェースのみを外部に公開することが可能になります。