ATS には数多くの数値型があります。 関数テンプレートを用いると、数値演算においてコードの共有を向上させることができます。 例えば、持つ行列の乗法のジェネリックス実装に次のインターフェイスを与えることができます:
fun {a:t@ype} matrix_mul {p,q,r:int} ( p: int(p) , q: int(q) , r: int(r) , A: &matrix(a, p, q) , B: &matrix(a, q, r) , C: &matrix(a?, p, r) >> matrix(a, p, r) ) : void // end of [matrix_mul]
数に対するジェネリックス演算の具体的な例を見てみましょう。 次のコードは階乗関数の一般的な実装です:
// extern fun fact(n: int): int // implement fact(n) = if n > 0 then n * fact(n-1) else 1 // end of [fact] //
// extern fun factd(n: int): double implement factd(n) = if n > 0 then n * factd(n-1) else 1.0 // end of [factd] //
// extern fun{a:t@ype} gfact(n: int): a // implement {a}(*tmp*) gfact(n) = ( // if n > 0 then gmul_int_val<a>(n, gfact<a>(n-1)) else gnumber_int<a>(1) // ) (* end of [gfact] *) //
implement {a}(*tmp*) gfact(n) = let // overload * with gmul_int_val // in // if n > 0 then n * gfact<a>(n-1) else gnumber_int<a>(1) // end (* end of [gfact] *)
// staload _(*T*) = "{$LIBATSHWXI}/intinf/DATS/intinf_t.dats" staload _(*VT*) = "{$LIBATSHWXI}/intinf/DATS/intinf_vt.dats" // staload GINTINF = "{$LIBATSHWXI}/intinf/DATS/gintinf_t.dats" // typedef intinf = $GINTINF.intinf overload print with $GINTINF.print_intinf // val () = println! ("gfact<intinf>(100) = ", gfact<intinf>(100)) //
この章で紹介したコード全体とテストコードを含む gnumber.dats はオンラインから入手できます。