WIP: TypeScriptの型システムで行列乗算の安全性を保証する
#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>>;
}C extends { length: Num } ? 0 : 1;
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> = [
1, 2, 3,
4, 5, 6
];
const mat2: Matrix<3, 4, number> = [
10, 20, 30, 40,
11, 12, 13, 14,
12, 13, 14, 15,
];
WIP
実際にmatmulを呼び出すコードを書くと"Type instantiation is excessively deep and possibly infinite."というコンパイルエラーを起こす
matmulの実装
もと:https://twitter.com/nwtgck/status/1136458154290470912
TODO: このページが完成することがあるなら元Qiita記事の恩恵が大きいので追加