承前。
「アリティのチェックと結合方式」に関しては、 Perl はかなり言語側が便宜を計ってくれている。
sub f1{
$_[0], $_[1], $_[2]
}
sub f2{
$_[0], $_[1]
}
sub f3{
$_[0]+$_[1]+$_[2]
}
&f3(&f1(1, 2, 3)) # 6
&f3(&f2(&f1(1, 2, 3))) # 3
($x, $y, $z) = &f2(1, 2, 3) # $z は undef (多分)
つまり、引数の数が足りていなかったり多すぎたりしても、勝手に都合よく解釈してくれるということらしい。俺はこういう仕様ははっきりと嫌い。やはり俺は「m = jのときだけ結合可能」というのが一番しっくりくるかなあ。
実は俺は単純に Perl みたいに多値を扱えればなあと思っていた節があるのだけど、可変コアリティを見て少し気が変わった。これはちょっと不味い問題だ。もしも可変コアリティを使うのであれば、戻り値をどうやって受け取ればいいのだろう? 実行するまではいくつの値が返されるのかわからないのだから、 Python のような言語では対応できない。
そうなるとタプルないしリストで戻して必要に応じてアンパックというのは、実は一番無難な解決方法なのではないかと思う。なんともおもしろみの無い結論とは思うんだけど。
あと Haskell は関数の型宣言を見ればわかる通り、暗黙的にカリー化して 1-in 1-out の世界を作っている。実は今までは、 Haskell の関数の型宣言がどうしても腑に落ちなかった。
f1 :: Integer -> Integer -> Integer
f1 x y = x + y
これを
f1 :: Integer, Integer -> Integer
f1 x y = x + y
こう書きたいと。
でも Haskell が全てを 1-in 1-out に押し込めるような仕様になっていると考えれば、今の仕様が合理的なのではないかと思えるようになってきた。そうなると多値をタプルで代用しているのも納得できる。これもこれでおもしろみが無い気がするけど、やっぱ引数と戻り値の対称性を合理的に実装するにはこうするか、もしくは Perl みたいに投げっ放しジャーマンにするかのどちらかなのかなあ。
しかし俺はろくに Haskell 書けないのに Haskell のコードを引合に出しすぎだ。これじゃあまるで俺が Haskell プログラマじゃないか。
え!? 冬季オリンピックってもう始まってたの?
どうでもいいけど、最近瘴気を纏った検索キーワードが多くてなんとも。いや、俺が悪いんだけど (でも「DOA パンチラ」とかはあんまりだと思うんだ)。
通夜終わった。何でこういう面倒くせえ儀式が必要なのかな−。もうちょっと簡単に死ねない物なのかな。