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扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。