Island Life

< Redditの舞台裏 | らむ太の失敗 >

2010/05/08

静的型がうらやましいとき

「静的型の方が簡潔に書ける場合がある」「いやそれは動的型では悪いスタイルでは」 みたいなやりとりなんだけども。

この、「戻り値の型によって多相化できる」っていうのは静的型の 強力なところだと思う。結局、動的型よりも純粋に利用できる情報量が多い わけだから。

でも、動的型でどうしても出来ないかというとそうでもなくて、 その多相関数がランタイムに実際に呼ばれる際はその関数がどう 使われるかがわかっていることが多いわけだから、 caller側のコンテキストをcallee側で参照してディスパッチできれば 同じようなことが出来る可能性はある。 WiLiKi:Scheme:ExplicitMonadなんかはそのひとつの例と言えるかも。

ちょっとややこしいのは、たとえば返り値がそのまま多相の引数を取る関数に 渡されていたりすると、直接のcaller自身にはほんとにどの型を 扱ってるのかわからないこと。静的型ならコンパイル時に どんどん辿って行って型をつけてくれるか、つけきれなければエラーに なるんだけれども。

この「わからないこともある」っていうのがある限り、 いつでも汎用的に使える手にはならないんだよな>戻り値の型でディスパッチ。

戻り値の型がわからなかったらとりあえず可能性のある計算をする promiseの集合を返して、いざ型がわかったところで必要なものだけ計算する、 とかやったら動的型でもいけるかも。でもlazyになっちゃうから eagerな処理系にそのまま入れるのは難しそうだ。

Tags: Programming, Language

Past comment(s)

とおる。 (2010/05/09 10:05:41):

Perl だと、関数が array context で評価されているか、を返す wantarray っていう手続きがあったりします。ただ、関数が評価される「コンテキスト」っていう概念はしばらく Perl を使ってないと分からなかったですけど。

shiro (2010/05/10 00:41:26):

Perlの話は入れようと思って結局冗長になったので削ったんですが、そういえば戻り値が直接他の関数に渡される場合ってのはどうなったんでしたっけ。有無を言わさずスカラー? それともsigilで指示できましっけ。

何らかのリーズナブルなデフォルトの型が設定できるなら、わからない場合はそのデフォルトで、callerが特別に指示したい場合はそれを明示してやる、って感じでいけそうな気がしますね。デフォルトの型が設定できない場合は、多分calleeが戻るところでランタイムエラーにすることになるのかな。出来なくはない気がしてきました。

とおる。 (2010/05/10 23:53:34):

array になるみたいです。 Perl の関数呼び出しで引数に配列を書くと、勝手に配列の要素が引数として展開されるので、(ex. f(1,(2,3)) は f(1,2,3) と同等)なのでちょうどよかったりしますね。

Post a comment

Name: