2004-10-07
■ [prog] カリー化
後期が始まってからすっかり更新が鈍っている。
何をしてるのかというと、実習でO'Caml(Objective Caml)したりしてます。型推論すげえ。他にも音声認識とか、並列計算とかいろいろあったのだが、ちょうど関数型言語に興味を持ってたところだったのでO'Camlを選択した。O'Camlでscheme(のサブセット)のインタプリタを作るという実習なのだが、まだ始まったばかりなので、関数を定義したり、カリー化したりしてます。
とは言ってもまだあんまり本質が分かってない感じなのだが、oxy君のページで
K = lambda{|x| lambda{|y| x } }
みたいな(Rubyの)コードが書いてあって、ああなるほど、と思った。 「関数を返す関数」の連続で、関数が定義されている、と。
O'Camlでは例えば、
let concat x y z = x^y^z
と書くのは*1
let concat = (fun x -> (fun y -> (fun z -> x^y^z)))
と書くのと同じである。呼び出す方も、concat "a" "b" "c" と (((concat "a") "b") "c") が同じ意味となる。なんとなく、Lispのリスト (1 2 3 4) がRubyで [1,[2,[3, 4] ] となるのと似てる感じがした。なんか関係あったりするのだろうか。
*1 「^」は文字列結合の演算子