これはML Advent Calendar 2017の15日目の記事です。 13日目の私の記事の続きになります。 本稿ではSMLのモジュール・シグネチャについて、より細かな機能を紹介いたします。 ファンクタ 先人の例であるOCmalでは、モジュールは第一級であり、関数や値と同等にモジュールを取り扱うことができます。 一方で、SMLのモジュールは第一級ではなく、モジュールがSMLコア(関数や式)とは切り離されて定義されています。 よって、モジュールを受け取ったり返したりするような関数をfun構文で作ることはできません。 しかしその代わりに、モジュールを受け取ったり返したりするために、SMLではモジュール専用のファンクタという機能が用意されています。 ファンクタを使うには、受け取るのと返すモジュールを記述します。1 例えば、実行時に単相のスタックを作るファンクタMakeMonoStackは以下