総称テンプレート実装

関数テンプレートのインターフェイスは関数のインターフェイスによく似ています。 例えば、次の構文は動的ファイルにおいて list0_fold_left という名前の関数テンプレートのインターフェイスを宣言しています:

extern
fun{
a:t0p}{b:t0p
} list0_fold_left
  (xs: list0 b, f: (a, b) -<cloref1> a, init: a): a

ここで t0pt@ype の略記です。

もし同じインターフェイスが静的ファイルの中で宣言されていたら、 extern キーワードは削除するべきです。 関数テンプレートのインターフェイスを実装することは関数のインターフェイスを実装することと、 やはりよく似ています。 上記の list0_fold_left のインターフェイスは次のようなコードで実装することができます:

implement{a}{b} list0_fold_left (xs, f, init) = let // fun loop ( xs: list0 b, res: a ) : a = ( case+ xs of | list0_nil () => res | list0_cons (x, xs) => loop (xs, f (res, x)) ) (* end of [loop] *) // in loop (xs, init) end // end of [list0_fold_left]

implement キーワードの直後に、テンプレート引数を書かなければならないことに注意してください。 この引数は省略できません。 次の短かい例に示すように、テンプレート引数は連続して渡すこともできます:

extern fun {a,b:t0p}{c:t0p} app2 (f: (a, b) -<cloref1> c, x: a, y: b): c implement{a,b}{c} app2 (f, x, y) = f (x, y)

この章で示したスタイルのテンプレート実装は総称テンプレート実装と呼ばれます。 後の章で特殊テンプレート実装と呼ばれる異なるスタイルのテンプレート実装を紹介します。