ジェネリクス
パラメトリック多相。関数や型を「型」でパラメータ化する仕組みだ。Vec<T> は T = String でも i32 でも何でも動く。1973年のMLで標準となり、Java 5(2004年)、C++のテンプレート(1990年代後半)、Rust、Go 1.18(2022年)で主流になった。
実装は二通りある。単相化(コンパイル時に具体的な型ごとにコピーを作る。Rust、C++、Go)と、型消去(実行時の版は一つで型情報を消す。Java、TypeScript)だ。単相化は実行が速いがバイナリが大きくなり、型消去はバイナリが小さい代わりに最適化の余地が少ない。境界付きジェネリクス fn sort<T: Ord> は、TがOrdトレイトを実装していることを要求する。ジェネリクスのジェネリクスである高階型(HKT)はHaskellやScalaにあるが、RustとGoにはない。Goは、13年にわたるGoチームの抵抗の末、1.18でようやくジェネリクスを加えた。