ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    ブックマーク数の多い記事

    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    with Ajax Amazon

    「プログラミング in OCaml」は大学の講義ノートがベース

    このエントリーを含むはてなブックマーク はてなブックマーク - 「プログラミング in OCaml」は大学の講義ノートがベース あとで読む
    関数型プログラミングのやり方について、Haskellの本よりもOCamlの本の方が解説が分かりやすいという意見がAmazonの書評にあった。

    プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~
    (2007/11/30)
    五十嵐 淳

    商品詳細を見る

    現在出ている日本語のHaskell本では、関数型言語の考え方が今いち理解できませんでした。
    それで、違う関数型言語の本を読みあさっていて、この本に出会いました。
    関数型言語の考え方が、とても良くまとめられていて、Haskellの理解が大幅に進みました。



    OCamlと書いて、「オーキャムル」「オーキャメル」と発音するらしい。
    何となく「岡村」とも読める。

    Objective Caml - Wikipedia

    Objective Caml(オブジェクティブ・キャムル)は、フランスのINRIAが開発した関数型プログラミング言語MLの方言とその実装である。
    通常 OCaml(オキャムル) と略称される。
    強力な型推論を最大の特徴とする
    なお、英語では Caml は camel (ラクダ) と同様に発音されている。



    ●大学の講義ノートがベースになっている
    「プログラミング in OCaml」を手にとってパラパラと読んでみると、第1章から第8章までは、東大や京大のプログラミングの授業で行われた講義内容をベースにしているとのこと。

    まえがき
    本書の第8章までの内容は東京大学教養学部広域科学科と京都大学工学部情報学科計算機科学コースでのプログラミング演習のために書かれたものです。



    確かに、用語や概念の解説が注釈としてうまくまとめらており、理解を促すような体裁になっている。
    これは分かりやすそうだ。

    Lisp → JavaScript → Erlang → CouchDB …ロードマップを見直して、どこかにOCamlの勉強を入れるかな?
    というか、Lispの勉強が停滞している…。
    Lispは一休みして、とりあえずOCamlの本を通読してみるかな。

    ●OCamlを選ぶ理由
    OCamlを選ぶ人は、どんな理由があるのだろうか?

    Haskell より Ocaml ? - 黎明日記

    >以前から OCaml の立ち位置ってのがよくわからなくて
    私はHaskellも大好きなのですが、OCamlは色々とチャレンジングな言語機能が豊富だったりしてとても魅力的だと思います。
    (1)多相バリアントは多分他の言語にはないです。 Lispのアトムに型が付いて安全になる感じです。
    (2)あとモジュールシステムは、 隠蔽能力に優れかつ柔軟です。ファンクタとか(SMLにもありますが)。Haskellのモジュールシステムは貧弱っす。
    (3)オブジェクト指向の取り込みにそこそこ成功している「静的型付け関数型言語」はOCamlだけだと思います(きっと…)。

    そのへんの多様な言語機能が相互に影響を及ぼし合うだけでなく、型安全になるように注意深く設計されているために信頼性も高いと思います。
    さらに型推論によって面倒なアノテーションが不要になっているのが、スゴい点だと思います。


    >関数型の魅力の一つは隔離された副作用や参照透過性によって、非正格評価が可能であること
    OCamlやSMLを含めた場合、静的型付け(型安全性)と代数的データ型(パターンマッチ)、型推論あたりが魅力と言えるんじゃないかなと思います。あとはライブラリがそうした関数型のパラダイムに合致するよう設計されている事とか…
    他のパラダイムだとこれは実現しにくい(Scalaとかを見てると…)そうです。
    関数渡しそれ自体はJavaScriptでもできちゃいますしね。



    ●アノテーション
    意味が分からない用語が出てきた。

    アノテーション - Wikipedia

    アノテーション(annotation)とは、あるデータに対して関連する情報(メタデータ)を注釈として付与すること。
    XML等の記述形式を用いてメタデータをタグ付けする場合が多い。
    付与したメタデータやタグを指してアノテーションという場合もある。
    元々の意味は、標本などを閲覧した際に、その標本に対するコメントなどを付すことを指す。



    アノテーションとは - ilovex

    まず、アノテーションとは、なんぞやと思い調べてみました。
    ほとんどのサイトでは、以下のような説明がされていました。
    「クラスやメソッド、フィールドなどのプログラム要素に対して、プログラム的に意味づけを行うものです。」
    この説明を読んで、私は、プログラム的に意味づけ=コメントみたいなものかと思いました。
    ところが、このアノテーションというものは、コンパイルされたプログラムの中に情報として残るため、
    プログラムから参照可能なのです。そこが、コメントとは大きく異なる点です。
    また、あくまでもコメント的な位置づけなので、プログラムコードに記述しているにもかかわらず、
    プログラムの挙動には影響を及ぼさないのです。



    アノテーションって便利そうだ。
    (でも、PHPにはコメントで十分だな。)

    ●非正格評価
    意味が分からない用語が出てきた。

    関数型言語 - Wikipedia

    引数の評価が関数の実行より先に行われることを正格であるといい、そのような性質を正格性と呼ぶ。
    正格性に関して非正格である言語は通常、デフォルトでの遅延評価を採用している。
    純粋関数型言語は遅延評価を標準とし、非純粋関数型言語は正格評価(先行評価)を標準としている。



    引数がどんな値を持つものであるのかチェックする作業に順番があると。
    ・先行評価(正格評価)=関数実行の前にやる。
    ・遅延評価=関数実行の後にやる。
    そういうこと?

    10.1.1 遅延評価対正格評価の利点と欠点 - Clean Version 2.0 言語報告

    遅延評価は、先行(正格)評価に比べて、以下の利点/欠点を持つ。

    * 最終結果に貢献する計算だけが計算される(いくつかのアルゴリズムにとっては、これは、明らかな利点であり、一般的に、より大きな表現の自由を与えてくれる)。
    * 無限データ構造(例えば、[1..])を処理できる。
    * 遅延式がいつ評価されるのかが分からない(デバッグ、評価順序の制御にとっては欠点である)。
    * 一般に、正格評価は遥かに効率的であり、基本型、非再帰型、組とこのような型からなるレコードのオブジェクトにとっては特にそうである。
    * 一般に、正格式(例えば、2 + 3 + 4)は、遅延式より領域を取らないが、逆の場合もある(例えば、[1..1000])。



    ●遅延評価
    ついでにフォロー。

    遅延評価 - Wikipedia

    遅延評価(ちえんひょうか、lazy evaluation、delayed evaluation)とは、計算機科学におけるプログラムの評価手法の一つ。
    主に関数型言語で使用される。
    対義語は先行評価(eager evaluation、strict evaluation)。

    評価しなければならない値が存在するとき、実際の計算を値が必要になるまで行わないことをいう。
    評価法が指示されているが実際の計算が行われていない中間状態の時それをプロミス (promise) や、計算の実体をさしてサンク (thunk) といい、プロミスを強制(force)することで値が計算される。
    一旦計算された値はキャッシュをすることが可能であり、遅延プロミスは最大で一度しか計算されないようにすることができる。

    遅延評価を行う利点は計算量の最適化である。
    一方で遅延評価は実装の難しさ、計算が起こるタイミングを予想できないという弱点を持つ。



    遅延評価の訳語
    lazy 【形】 1. 怠惰な、不精な 2. だらけさせる、のろのろした
    delayed 【形】 遅延(型)の

    先行評価(正格評価)の訳語
    eager 【形】 切望している、熱心な、熱望している
    strict 【形】 1. 厳しい、厳格な 2. 正確な、厳密な 3. 徹底的な、完全な

    正格評価ってのは、英語で言うとstrict evaluationだな。

    ●参照透過性
    知らない用語、多過ぎ。(笑)

    参照透過性 - Wikipedia

    参照透過性(さんしょうとうかせい、英:Referential transparency)とは計算機言語の概念の一種で、文脈によらず式の値はその構成要素(例えば変数や関数)によってのみ定まるということを言う。
    具体的には変数の値は最初に定義した値と常に同じであり、関数は同じ変数を引数として与えられれば同じ値を返すという事になる。
    当然変数に値を割り当てなおす演算である代入(Assignment)を行う式は存在しない
    このように参照透過性が成り立っている場合、ある式の値、例えば関数値、変数値についてどこに記憶されている値を参照しているかということは考慮する必要がない、即ち参照について透過的であるといえる。

    参照透過性が成り立つ言語は式の値がプログラムのテキストから定まるという特徴から宣言型言語(Declarative language)と呼ばれたり、関数の数学的性質が保たれるという特徴から純粋関数型言語(Pure functional language)と呼ばれたりする。
    一方変数の値の変更が認められているような参照透過的でない言語を手続き型言語と呼ぶ



    Erlangの本を読んでいると、最初の方のページに、Erlangにおける変数の使い方の説明があった。
    「一度変数に値を入れると、その後値を変えられない」という説明を読んで、なんか変な仕組みだなーと思ったが、なるほど、あれが「参照透過性」というやつだったのか。
    今まで手続き型のプログラム言語しか使ってなかったので、代入は当たり前の操作だと思っていたけど、代入無しの世界もあるんだなー。(遠い目)

    計算量の最適化=引数の評価方法は、プログラム言語に任せておくとして、参照透過性=変数の値を変えないスタイルは、慣れる必要がありそうだ。

    「プログラミング in OCaml」は、関数型プログラミングの講義ノートのつもりで読んでみるか。
    関連記事

    コメント

    コメントの投稿


    管理者にだけ表示を許可する

    トラックバック

    トラックバックURL:
    http://hamamuratakuo.blog61.fc2.com/tb.php/349-117e4cf4

    FC2Ad