ToDo:
https://twitter.com/jmuk/status/775178305481740288
たぶん型付けるって話に2種類あって、
で、前者を mame さんが想定してて、むかいさんは後者を想定してるのではないかな、と思う。前者は正直 closure compiler とか程度のやつでも相当たすかると僕の感覚では思うし、後者は次元数てのは静的に決まるものでなく、モデルに保存されてたりするので「面白い話題がある領域では」と思うのもすごくよくわかる
後者は僕も不勉強なので確信は持てないのだけど、たぶんむかいさんの理解通り、あまり既存研究とかが多く無い(実用化されてるものを僕は知らない)領域なのではないかな、と思う。
C++でいうと、templateに型を与えたり定数値を与えたりはできるわけだけど、変数値ではあるものの、プログラムの実行中は値を変えない何か、を型パラメータにしたいのかな、と思う。僕が知ってる中で、これを不十分に実現してるふうを装えそうなものとしては、 D 言語の alias template が使えるかもしれないな、とか思う
import core.stdc.stdio;
import core.vararg;
int vector_dim3;
int vector_dim4;
template Vector(alias dim) {
class Vector {
this(...) {
assert(_arguments.length == dim);
v = new int[](dim);
for (int i = 0; i < dim; i++) {
v[i] = va_arg!int(_argptr);
}
}
int inner_product(Vector!(dim) o) {
int r = 0;
for (int i = 0; i < dim; i++) {
r += v[i] * o.v[i];
}
return r;
}
int[] v;
}
}
void main() {
vector_dim3 = 3;
vector_dim4 = 4;
auto v3_1 = new Vector!(vector_dim3)(1, 2, 3);
auto v3_2 = new Vector!(vector_dim3)(3, 2, 1);
printf("%d\n", v3_1.inner_product(v3_2)); // OK - 10
auto v4_1 = new Vector!(vector_dim4)(1, 2, 3, 4);
auto v4_2 = new Vector!(vector_dim4)(4, 3, 2, 1);
printf("%d\n", v4_1.inner_product(v4_2)); // OK - 20
// Not OK! (dimension mismatch) - statically checked
// printf("%d\n", v3_1.inner_product(v4_1));
// Not OK! (argument number mismatch) - runtime assertion failure
// auto v_err = new Vector!(vector_dim3)(1, 2);
}
(22:25)
| 前 | 2016年 9月 |
次 | ||||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | |
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。