関数テンプレートのインターフェイスを特殊実装するというのは、 そのテンプレートの固定のインスタンスに実装を与えることです。 例えば、次のインターフェイスは eq_elt_elt という名前の関数テンプレートです:
型 T の等値性検査は型 T に依存するので、 eq_elt_elt の意味のある総称的な実装は存在しません。 2つの特殊テンプレート実装である インスタンス eq_elt_elt<int> と eq_elt_elt<double> を次に示します:implement eq_elt_elt<int> (x, y) = g0int_eq (x, y) implement eq_elt_elt<double> (x, y) = g0float_eq (x, y)
ここで、特殊テンプレート実装の典型的な使い方を見てみましょう。 次に定義する関数テンプレート listeq はリストの等式関数を実装しています:
fun{ a:t0p } listeq ( xs: list0 a , ys: list0 a ) : bool = ( case+ (xs, ys) of | (list0_cons (x, xs), list0_cons (y, ys)) => if eq_elt_elt<a> (x, y) then listeq (xs, ys) else false | (list0_nil (), list0_nil ()) => true | (_, _) => false ) (* end of [listeq] *)
比較のために、与えられた2つのリストが等しいか判定する関数テンプレート listeqf を次に実装します:
fun{ a:t0p } listeqf ( xs: list0 a , ys: list0 a , eq: (a, a) -> bool ) : bool = ( case+ (xs, ys) of | (list0_cons (x, xs), list0_cons (y, ys)) => if eq (x, y) then listeqf (xs, ys, eq) else false | (list0_nil (), list0_nil ()) => true | (_, _) => false ) (* end of [listeqf] *)
この章で示したコードとテストのための追加コードは オンライン から入手できます。