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

Erlang 本を読んだ

こないだ買った本が届いてたわけですが


プログラミング言語Erlang入門

読んでみたので感想。

まず、読みやすい。 最近関数型言語の本が何冊か出てるけど、それらと比べても読みやすい気がする。 記述が無駄に詳しくないんだな(良い意味で)

Erlangの話(というか関数型言語の話)があって 並列プログラミングでフィボナッチ その後分散として別のホストと連携

「ほう、これは良さそうですな」といった所で終わり、見通しは良い

並列分散の話で、(UNIX的な)プロセスや、fork(), スレッド、ソケット的なwait やら select 的な話を前提として無いので その辺知らない人にはかなり読みやすいんじゃないかな

気になった点 参照透明性があるのか無いのか書いてない、それはまぁどうでも良いんだけど

フィボナッチ数求めるのに cfib n = fib(n-2) + fib(n-1) みたいにして、2つのfib を別プロセスとして走らせてる

親分(cfib) 子分A、 子分B 子分は、いわゆる普通の再帰で求めてる。つまり、プロセス3つ

子分もcfib にして、どんどん並列しないのは何故? fib(n-2) と fib(n-1) って、殆ど同じ計算してるから無駄じゃね?

# ほら、ここで参照透明性の話があれば以下略

参照透明性の無い言語の場合には、同じ引数で複数回呼び出される利用される関数の実行を効率化するために メモ化 (memoization) っつーテクニックがある、簡単に言うと関数実行結果のキャッシュ ググると色々出てくるぞ

……しかしだ、どうにも腑に落ちん。 参照透明性の無い言語でメモ化するのは、よく分かる。 問題は、だ。 (ググってる途中で出てきたんだが)なんで参照透明性のある言語でメモ化する必要があるんだ? メモ化された関数を作るのが目的なんじゃなくて、メモ化された関数を作る関数を作るという 「テクの話」だと思うんだけど、いわゆる一つの高階関数遊び。

参照透明性のある言語に、メモ化なんて必要ないよね? 実装次第で、そっちの方が速くなるとかいうしがらみ的な理由を除いては

あー、Erlangの場合は並列化の実装にもよるかなぁ。 プロセス間でも参照透明性に由来する参照は保たれるよね、多分。 でもノード間なら、メモ化されたテーブルがあった方が良いよね、多分。 コスト次第か、別ノードのテーブルを引きに行くか、自分でやっちゃうか

まぁ、欲を言うとフィボナッチなんていう詰まらない(手垢の付いた)例の他に 「おぉ、こんなのも並列でか!」っつー例を見せて欲しかったような気もするけど 楽しく読めたものでした

次はこれ読んでみようかな


Programming Erlang: Software for a Concurrent World

関数型言語入門本たち