WIP: TypeScriptの型システムで行列乗算の安全性を保証する
code:ts
type Append<Elm, T extends unknown[]> = ((
arg: Elm,
...rest: T
) => void) extends ((...args: infer T2) => void)
? T2
: never;
type Vector<N extends number, T> = VectorRec<N, T, [], []>;
type VectorRec<Num, Elm, T extends unknown[], C extends unknown[]> = {
0: T;
1: VectorRec<Num, Elm, Append<Elm, T>, Append<unknown, C>>;
type Matrix<N extends number, M extends number, T> = Vector<N, Vector<M, T>>;
// Type-safe matrix multiplecation
function matmul<N extends number, M extends number, L extends number, T>
(mat1: Matrix<N, M, T>, mat2: Matrix<M, L, T>): Matrix<N, L, T> {
return null as any; // TODO: implement
}
const mat1: Matrix<2, 3, number> = [
];
const mat2: Matrix<3, 4, number> = [
];
WIP
実際にmatmulを呼び出すコードを書くと"Type instantiation is excessively deep and possibly infinite."というコンパイルエラーを起こす
matmulの実装
TODO: このページが完成することがあるなら元Qiita記事の恩恵が大きいので追加