Haskellコードの読み方

2013-02-24 | Haskell | コメントはまだありません

#Haskellコードの読み方を教える記事じゃないので、そういうのが必要な人は他のとこ行ってほしい。これはあたし用のメモだ。それも、理解したので書く記事ではなく、わかんないから書く記事なので、役に立たないす。
書きだして眺めるための記事であります。

Hakell読んでてイライラさせられるというか、他の言語をちょっとでもかじった人はたいてい苦しむんじゃないかと思う点が、「=」だ。

php:
$a = 1 + 2;

Python:
a = 1 + 2

Haskell:
a = 1 + 2

うん。ここまではいい。というかここで既に転んでたらアンインストールしとるわ。
このとき、あたしの頭は
「1+2をaに代入/バインド/ホニャララする」と読んでいます。右辺から左辺、という方向です。「←」です。
ではこれはどうか。

Haskell:
hogeFunc x y = x + y

こんくらい簡単な例なら、一瞬フリーズするものの何とかならんでもないんですが、一瞬フリーズするのは確かなんですよ。どっち方向に読むのコレ。
hogeFuncという名前の関数の定義らしきものだなと読み、えーと引数がxとyで、そんでx+yしたものを左辺にー、えっ?左辺どうすんの?……みたいなかんじです。

phpなりPythonなりJavaScriptなり、あたしの知っている言語は、関数を定義するときに関数名の定義と中身をイコールでつないだりしていない。
ブラケットやインデントで隔離された領域があって、(Haskellのように副作用を認めない、絶対に値を返すというルールでいうならば)returnで値を返す、

php:
function wee($a){
    return $a+1;
}

返された値は左辺の何かに放り込まれるか、

$b = wee(10);

その場で展開されて値になる(といった感じに読んでいる)

$b = wee(10) + 5;
→ $b = 11 + 5;
→ $b = 16;

そんなかんじであると思っているわけです。
これはHaskellであってphpでもPythonでもねえんだよということは重々承知ではあるが、10年かそこら読んできたクセが染み付いててなかなかスイッチを切り替えることができません。

Haskell:
hogeFunc x y = x + y

さっきのこれの例でいくと、x+yされた何かを左辺に返すと読みたいんだけど、左辺にあるのは関数名と引数の羅列であって、振り上げた拳を下ろす場所を見つけられないような、ぐにゃりとした、もやもやした、行き場のない感じを感じてしまうわけであります。
左辺右辺で言えば、あたしはこれを左辺を見て右辺を見て、右辺からどっかにいくはずなんだけど行き先がよくわからん、といった趣。
左辺と右辺は等しいよ、という読み方をするほうがいいのかなあ。考え方というか読解のためのコツがわかってない感じ。

何が何でも絶対に”return”するから、わざわざreturnとか書かないよ~みたいな話なのかなー。
そのうち慣れて、そういうもんだよーって思えるようになるのかなー。

ほんとに慣れるのか?

uu (x:xs) = x+1:uu xs

先日書いたコード断片。
こういう、再帰的に処理の続きが発生している記述がすごく苦手です。読み解こうとするときに、どこをどんな形で脳に教えてやったらいいのかわからず、混乱するわけです。
1. uuさんにリストを渡すんだよ~
2. リストの先頭のxに+1するんだよ~
ここで思考停止。残りの「:uu xs」部分を、脳にどう教えたらいいのかわからない。
あたしにとって右辺は左辺に値を戻すもののはずなのに、右辺の端っこでまだ処理が続こうとしている上、行き先がよくわからない。
頑張って読む。xsの先頭に対して+1する処理をして、xsの残りに対してuu xsして……。
はあ、なるほど、わからん。
その際限のなさそうな、ふかーいループというか、やたら積み上がっていくスタックというか、それどこまで覚えてたらいいの、あたしそんなたくさんのこと一度に覚えられないんだけど、ああ頭痛が眠気が。再帰こわい。つらい。
そんな酷で際限のないつらいことを強要する言語設計なんぞするわけがない。すると読解のコツがあるはずだ。
むしろあれか、際限ねえんだから今は気にするなということなのであろうか。遅延評価というのはそういうことなのだろうか。
わからぬ。

About Author

about author

Halipeco

UO@倭国、EQ@Xegony、DOL@乙鯖を経てFF14のアトモスに生息中。
仕事と趣味でPython書いてる。
買った果物に種があると植えるのが趣味。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です