2013年3月24日日曜日

関数型言語に、まったく興味がない、訳ではないが

知人がclojure推しなのもあって、関数型にまったく興味はないわけではないのと、「haskellはすべてのプログラマが学ぶべき言語です」とか言ってる有名人も居て、haskellの本なんかも買って、パラパラ捲ったりはしてはいます。

Haskell

困るのが、イコールと矢印の使い方が独特。手続き型&オブジェクト志向と真逆ですね。
http://ja.wikipedia.org/wiki/Haskell

square x = x * x
ここでの「=」は、「の時は」的な意味でしょうか。return 式 とかわざわざ書かないのは、「関数型だから値を返すに決まってるだろ!」ってことですね。すいません。
ただここから先が問題で

square :: Integer -> Integer
square x = x * x
独特ですよねコレ。1行めは、引数型と出力型の定義。矢印は「出てくるのは」的なニュアンス?ダブルコロンは型定義、というのは統一してるんですね。そりゃそうか。
ただし、定義時点での「ガード」は非常に興味深く、他の言語でも似たような概念が欲しいですよね。
fac :: Integer -> Integer
fac 0 = 1
fac n | n > 0 = n * fac (n-1)
この場合の、縦棒は「が」でしょうか。

構文に、カッコとかカンマを殆ど使ってないのも、「手続き型からの移行組」を混乱させる、理由の一つだと思います。

なんとかHaskellは読めそうな気がする?

Haskellで、スーパーマリオ(に似てる何か)を作った変人もいらっしゃって、
http://d.hatena.ne.jp/mokehehe/20081005/nario
俄然興味が出てきたのもありますね。

ちょwグラディウスもありました。
http://www.geocities.jp/takascience/haskell/monadius_ja.html

というわけで次はClojureですが。

Clojure


http://ja.wikipedia.org/wiki/Clojure
言語仕様がシンプルなのは全面的に認めますが、ヘンな記号の使い方はしてない代わりに、カッコだけ推しなので、カッコが何しろ多いのが腹が立ちます。defmacroとか、フツー全体括弧じゃなくて、引数括弧だろ!みたいなね。

どうやら「関数型特有のナニカ」を表現するのに、カッコの直前にナニカ記号を前置する。という手口を使ってるみたいですね。シャープカッコとか気持ち悪いんですが。お蔭さんでまるで判りません。 それにしても、この「引数の順番ですべてが決まる」感は、gitにソックリ。なるほど、clojure推しの彼がgit推しなのもなんか納得できる。
http://rosettacode.org/wiki/Sorting_algorithms/Quicksort#Clojure
やっぱり判りません。条件判定が逆ポーランドなので、ソース眺めてても頭に入ってこないんですよね。

Erlang

http://ja.wikipedia.org/wiki/Erlang
出稼ぎ先で、Key value StoreのMemBaseを使ってみようか、ということがあって、オープンソース版を入れようとしたのですが、ピクリとも動かなくて、ソースがErlangで絶望しました。
ただし、言語として、マルチスレッドとプロセス間通信を内蔵してるのは非常に興味深いです。非常に高速らしいし。チャットサーバとかにはいいかもしれませんね。MemBaseも事情は近いし。
記号の使い方はHaskellと似てるのかな。quicksortの短さには驚嘆します。短いのはHaskellもだが。
http://rosettacode.org/wiki/Sorting_algorithms/Quicksort#Erlang


総合すると、Lisp族のClojureだけ抜群に難解ですが、それ以外はなんとかなりそうではあります。