読者です 読者をやめる 読者になる 読者になる

Array#mapの型がおかしくなる問題

最近だとkinabaさんがGenerics > Template なところで話題にされてたのが記憶に新しいところだと思うのですが、つまりそういう問題です。

配列は要素の型Tでパラメータ化された型であると考えることができて、ここでArrayとか書くことにすると、mapの返り値の型はArrayとか別の型になります。で、mapの定義はArrayの定義の中に書くので、Non-uniform typeのできあがり。そういうわけで、C++のtemplateの展開が止まらなくなるのと同様に型推論が止まらなくなるので、しかたなく同じ型に推論するしかない、という。

ちなみにC++でmapとか書くと、ちゃんとコンパイル止まりますが、これはmapメソッドの型がtemplateになってて、つまりメソッドの型が多相型になれるから。残念ながらMLの型推論には、メソッドの型(返り値やパラメータの型、メソッドの型それ自体)が多相型になれないルールがあるので、こういう推論はできません。

ちなみに対処法は、とりあえず有限回だけmapできるようにすることにして、Arrayだけじゃなくて、ArrayとかやっといてmapはArray1とかだんだん減って行くように推論しておけば十分じゃない?とか論文では書いたんですけど、今はそれじゃあ不十分だと思っています。

あとは、mapの型だけ手で書くという対処法はあります。が、これは非常にundocumentedな手法で型推論との整合性をなんとかしてるみたいで、良くわからないという。名大で何年か修行を積めば理解できるようになるかもしれません。