nihaaaaaaaa(のヮッ☆)

2007-09-01

OCaml一人勉強会 - モジュール 18:58 OCaml一人勉強会 - モジュールを含むブックマーク

少し間が空きました。

さて OCaml では型や変数関数の定義を管理するための仕組みが備わっています。今時無い言語も珍しいですが。

まあなんていうか、普通にモジュールです。 C++ で言う名前空間に近いものです。

自分でモジュールを定義するには、以下のような構文を使います。

# module Hello = struct
    let say target = print_endline ("hello, " ^ target ^ "!")
  end;;
module Hello : sig val say : string -> unit end
# Hello.say "world";;
hello, world!
- : unit = ()
# open Hello;;
# say "ocaml";;
hello, ocaml!
- : unit = ()

使い方はこれまで標準ライブラリとかの例で使いまくってるのでもういいや。まあこういうものです。

ちなみに分割コンパイルの際にもモジュールが使われます。実装と定義(インターフェイス)を分けることが出来たりして中々良いものですが、めんどくさいので省略します。

省略はまずいだろ!適当にまとめると、

という感じです。

勿論対話式にインターフェイスを提供することもできます。

OCaml には型推論があるので、これまで変数関数引数等にわざわざ型を書くことはしませんでしたが、実は「明示的」に書く事もできます。

# let a : int = 5;;
val a : int = 5
# let f (x : int) (y : int) : int = x + y;;
val f : int -> int -> int = <fun>

勿論誤った型を書いた場合は叱られます。

# let a : double = 5;;
Characters 8-14:
  let a : double = 5;;
          ^^^^^^

通常なら型変数が使われるような多相的な関数引数を制限することも可能です。

# let f x = x;;
val f : 'a -> 'a = <fun>
# let f (x : int) : int = x;;
val f : int -> int = <fun>

モジュールで同じようなことをするためには、以下のような構文を使います。

module Hello : sig val say : string -> unit end = struct
    let say target = print_endline ("hello, " ^ target ^ "!")
  end;;

sig から end が定義ですね。まあややこしいのであまり書きたくはないです。

OCaml一人勉強会 - ファンク18:58 OCaml一人勉強会 - ファンクタを含むブックマーク

(まず始めに、 OCamlファンクタは他の言語でいう「関数オブジェクト」としてのファンクタではありません。注意。)

さて、ファンクタとはパラメータを取るモジュールのことです。多相型に似ているけれど少し違います。 C++テンプレートクラスに似ているかもしれません。

int 型の n という変数を持つモジュールを受け取り、引数に n 加算する関数 add を持つファンクタは以下のように書けます。

# module Add_n (N : sig val n : int end) = struct
    let add x = x + N.n;
  end;;
module Add_n :
  functor (N : sig val n : int end) -> sig val add : int -> int end
# module Add1 = Add_n (struct let n = 1 end);;
module Add1 : sig val add : int -> int end
# module Add2 = Add_n (struct let n = 2 end);;
module Add2 : sig val add : int -> int end
# Add1.add (Add2.add 3);;
- : int = 6

なんの意味もない例なうえにややこしいですね…

基本的に作るよりは使うことの多いものです。まあだから気にしない。

という事で次回は標準モジュールファンクタを利用しているコンテナ Set と Map を触ります。

Connection: close