MEP 13: 0次元へのreduceのexpr化
- Created: 2023-02-18 11:52:03
MEP 7: 0次元へのreduce で0次元のreduceは変数になるようになった。 これは概念的にはその型の値を返すexprに見えるのだが、シンタックスはdef byしか無いので、0次元だけのケースを考えると不自然に見える。 例えばWeighted Median Filterの以下。
def i3 by reduce<wcumsum>.find_first_index(dim=0) |_, val| { i < val }
最初のindexを探すのは、普通に考えれば以下のように普通にletで使えて欲しい。
let i3 = reduce<wcumsum>.find_first_index(dim=0) |_, val| { i < val }
多次元のケースでは結果がテンソルになるのでdef byで特別扱いしているのは正当でもあるし必要な事でもあり、それとの一貫性で0次元も同様に書けるのは正しい。 だが、find_first_indexなどいかにも1次元に対して使うのが主な使い方のケースでは、あまり使わない多次元の事情に引っ張られるのも良くない気がする。
最終的には0次元になるケースでは以下のようなシンタックスシュガーも用意したい気もする。
let i3 = wcumsum.find_first_index |_, val| { i < val }
dimはいつも0だから不要に思う。そしてreduce<XXX>のシンタックスはこのケースでは大げさに見える。 単なるメソッド呼び出しと思う方が良さそうだし、sumとの一貫性も出てくるので、0次元はこうも書ける、というのが良い気がする。 (ただしts.sumはいつも全次元に対してreduceするので概念的にはreduce_allとでも呼ぶべき少し違うものではある)。
このシンタックスシュガーを本当に用意するかはおいといて、0次元のreduceはexprとしてもパースする方が初心者に抵抗が無い気がするので、そういうふうに変更したい。