プログラマメモ2 - programmer no memo2

カリー化 クロージャ ラムダ がよくわからない 2006/12/28
2008/01/20

本気でよくわからないもの
カリー化、クロージャ、ラムダ
カリー化、クロージャ、ラムダがよくわからないです。

おそらく僕の使っているプログラミング言語、javaメインだからなのかもしれないです。
これってまずい気もしますが、だからといってお仕事するのに差し支えないレベルでプログラムを記述することはできます。

クロージャがjavaにくわわるというニュースを読んだりしますと、わからないというのもまずそうな感じがしてきま。
わかると何やら幸せになれそうな感じがするので、習うより慣れよで、プログラムでためしていこうと思います。

これらの用語には知的好奇心をくすぐる何かがあるように思えます。

おそらく大学が理系でない人、LL言語に接することが少ない人は、接する機会がないですよね、きっと。

ところで、「計算機プログラムの構造と解釈」というのがあります。
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
489471163X
ほんもの魔法使いのための本という趣きがあると感じるのは僕だけでしょうか。


まず、カリー化から。カリー化はcurrying。

この技法は、Christopher Stracheyにより論理学者ハスケル・カリーに因んで名付けられたが、実際に考案したのはMoses Schönfinkel とゴットロープ・フレーゲである。引用:カリー化 - goo Wikipedia (ウィキペディア) 記事検索


カリー化を基盤としているプログラミング言語もある。特にMLとHaskellでは関数は常に一つの引数のみを取り、複数の引数を取る関数とは、単にネストされた複数の一引数関数の糖衣構文にすぎない。関数をとして扱える言語、たとえばLISP、Scheme、Eiffel、Perl、Ruby、Python、R言語、S言語、JavaScriptなどでは、カリー化関数を作ることができる。
引用:カリー化 - goo Wikipedia (ウィキペディア) 記事検索

ML、Haskellだと言語自体がカリー化を基盤としているようです。

調べていないですが、上記の言語全部、mac osx上でためせるはずです。

実行環境をつくることからはじめないといけませんね。

実際の定義は、
複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること。引用:カリー化 - goo Wikipedia (ウィキペディア) 記事検索

とあるが、よくわからないです。

入門Haskellという本を買ってきましたが、いまいちよくわかりません。p.49にでてくるのですが、やはりはじめから読まないといけないでっしょうか。
入門Haskell―はじめて学ぶ関数型言語
向井 淳
4839919623


理解するためには、高階関数(higher-order function)、関数型言語が鍵になりそうです。
高階関数(こうかいかんすう、英: higher-order function)とは、プログラミング言語において、関数を引数にしたり、あるいは関数を戻り値とするような関数の事である。引数や戻り値の関数もまた高階関数となり得る。これは主に関数型言語やその背景理論であるラムダ計算において多用される。
高階関数 - goo Wikipedia (ウィキペディア) 記事検索

ラムダという用語もでてきました。

ボールドをしましたが、「プログラミング言語において、関数を引数にしたり、あるいは関数を戻り値とするような関数の事である。引数や戻り値の関数もまた高階関数となり得る」ということらしいです。

関数ポインタをやりとりして、使う???、オブジェクトのやりとりとどうちがうのでしょうか。この辺あたりから、僕の計算機にたいする理解不足が露呈してますね。


ちなみに、調べているとこういうのがありました。
なぜ関数プログラミングは重要か
重要なんですね。


ところで、
ラムダ式をC++で実現する【前編】すーぱーぷろぐらみんてくにーーく!
に、他の関数を引数にとる関数を高階関数と呼ぶ、とありました。
関数を渡すためには、C++では、関数ポインタで渡すか、templateで渡すかです。
ラムダ式をC++で実現する【前編】すーぱーぷろぐらみんてくにーーく!

とありました。なんとなくイメージがわいてきますかね。

: