MEP 24: mapのサポート
- Created: 2025-06-20 12:21:00
- Update: 2025-08-16 12:41
- Status: declined
モチベーション
rsumやreduceは値に縮約されてしまうが、次元通りのベクトルを返して欲しい場合もある。 例えばMLAAなどでは、右、左、上、下の4種類について似た演算を行うが、結果はそれぞれ別々に欲しい。
そこでreduceの他にmapが欲しい。
原理的にはreduceと同様に関数のmapとベクトルやテンソルに対するmapの2つがあるべきだが、 テンソルのmapは原理的には関数で同じ事が出来ること、テンソルのmapはtransで駄目なケースが今の所無い事からまずは関数のmapだけをサポートすれば良いだろう。
提案
rsumと類似したmapを提供する。また、同時にタプルがベクトルの時に、変数によるindexerを提供する。
let offset = [0, 3, 0, -3]
let v = map(0..<4) |i| {
dir(i)+offset(i)
}
vは4次元ベクトルとなる。
offsetをiで要素を取得している。
検討
仕様について議論が必要な事や検討すべき事柄。
タプルへの変数のインデクサ
リファレンス: 型の「タプルの型は静的に決まらないといけない」を参照。
上記リンクにあるように、タプルのインデクサは型を確定する必要があるので、これまで変数でのアクセスは提供していない。 だが、mapの時にはこれを使える必要があるだろう。
型が確定するためには、要素が全て同じタプルの時だけ使える機能となる。
同じタプルという概念でありながらホモジーニアスかどうかで出来る事が変わるのは複雑で分かりにくい仕様になる。
複数次元はなぜサポートしないか
v1.0.00現在、タプルのネストはサポートしていない。 だから結果が2次元になるタプルを返す事は出来ない。
結果をローカルテンソルにしてしまえばサポートは出来る。
だがローカルテンソルはなるべく使ってほしくない機能だし、用途を考えるとタプルとして結果が帰ってきてswizzle演算子でアクセス出来る方が自然。
rangeはパース時に確定する必要がある
タプル型は、コンパイル時に要素の数が確定している必要がある。 mapの次元で結果のタプルの次元が決まるので、このrangeはコンパイル時に確定している必要がある。
つまり変数などをrangeに使う事は出来ない。
見た目と違い制約が多いのは、仕様が良くないかもしれない。
この提案は却下とする
検討の結果、仕様が良くないと判断し、このMEPは却下(decline)とする。