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

    ブログ内検索

    最近の記事

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

    Blog Translation

    Powered By FC2ブログ

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


    FC2ブログ LOGIN

    with Ajax Amazon

    λ(ラムダ)式の意味

    このエントリーを含むはてなブックマーク はてなブックマーク - λ(ラムダ)式の意味 あとで読む
    ブックマークを整理していたら、Yコンビネータのまとめ記事があった。

    きしだのはてな - おとうさん、ぼくにもYコンビネータがわかりましたよ!

    ●λ式は関数の一表現方法
    λ(ラムダ)式の説明が簡潔で、意味が分かりやすかった。

    曰く、

    まずλありき
    関数の話をしたいのです。
    そのとき、いちいち

    hoge(x) = x * 2

    としてhogeを・・・、とか名前をつけて話を進めるのがめんどうなので、関数を値としてあらわすと便利ということで、λという値を定義するのです。
    そうすると、上のhoge関数なんかはλ(x)(x*2)などとあらわせますが、引数をあらわすのに()を使うといろいろまぎらわしいので、

    λx.x*2

    のように表記します。
    というのがλ。



    ・λとは定義である。
    関数を簡潔に記述する方法として、λという式、記法を考えた。
    ただ単に、こういうもんだと決めているだけ、約束事なので、意味を深く考えて悩む必要はない。

    hoge(x) = x * 2

    λ(x)(x*2)
    と書き換える。

    さらにカッコ()を省略することにして、
    λ(x)(x*2)

    λx.x*2
    と書き換える。
    これがλ式の書き方というわけだ。

    つまり、関数の名前(上記の例だと「hoge」という部分が関数名)をいちいち用意しないで、関数の内容を表わす方法として「λ式」という表記方法を考えたと。

    λ式で書かれた関数の内容を、中学校の代数的な表記に変換する練習をちょっとすれば、λ式の表記方法それ自体にはすぐ慣れると思う。

    λx.x*2 (λ式で関数を表現した場合)

    hoge(x) = x * 2 (中学の代数的な表記で関数を表現した場合)
    関数名を用意して、引数をカッコでくくり、「.(ドット)」を「=(イコール)」に置き換えれば、中学校で勉強した関数の書き方になる。

    入門Common Lispでは、154ページにλ式の説明がある。

    ちなみに、上記のようにλ式で関数を表記することを、専門用語で「関数抽象」と呼ぶらしい。

    ●λ式で値の代入

    hoge(x) = x * 2
    で、関数の引数であるxに、yという値を代入すると、関数の値は、
    hoge(y) = y * 2になる。

    λ式の場合、引数であるxに、yという値を代入することは、専門用語で「関数適用」と呼ぶらしい。

    λx.x*2というλ式で、xにyを代入することを
    (λx.x*2)y
    と書く。
    =λ式をカッコでくくって、その後に代入する値を続けて書くと。

    (λx.x*2)y

    y*2
    という形に書き換えるというルールを用意した。

    =中学校で勉強した代数で「値の代入」に相当するものは、λ式の場合「関数適用」という呼び方をしていて、値を代入したら、関数の実体に置き換えればOKということ。

    入門Common Lispでは、155ページに関数適用の説明がある。

    …MとNがλ式のとき、…(MN)はMのNに対する関数適用と呼ばれます。
    MのNに対する関数適用(MN)とは、NをMに適用することを意味します。
    ここで「適用」というのは、関数型プログラミング言語の用語で、引数により関数を呼び出すことを意味します。
    具体的には代入と同じです。



    たとえば、上記の例にならって、(λx.x*2)3を考えてみる。
    これは関数本体のx*2のxに3を代入するということである。
    「置き換える」というイメージの方が良いとのこと。
    結局(λx.x*2)3は、3*2のように変形できる。
    つまり、hoge(x) = x * 2で、xに3を代入するのと同じことになる。

    きしだのはてな - おとうさん、ぼくにもYコンビネータがわかりましたよ!
    曰く、

    (λx.x*2)y

    とあったら、xの部分をyでおきかえて

    (λx.x*2)yy * 2

    となります。λの引数部分与えられた引数で置き換えること簡約といいます。

    (λx.xは暑いね)今日 →今日は暑いね

    です。式が複雑になっても、冷静に置き換えれば大丈夫です。



    関数適用は、簡約とも言うと。
    代入→適用→簡約 …用語が入り乱れてややこしい!(笑)

    =まあ、そういう約束事だということで、悩まなくてOKと。

    ●λ式で出てくる専門用語まとめ
    Knowledge about Lambda

    λ式の集合は:
    * <変数>任意の変数x
    * <抽象>Mを任意のλ項とすれば、λx.M
    * <適用>MとNを任意のλ項とすれば、MN
    という規則によって再帰的に作られる項の集合。
    それぞれ変数、関数定義(抽象)、関数呼び出し(適用)を表します。



    単に英語を日本語に直訳しても、意味不明な場合がある。
    λ式がややこしいと感じていたのは、何かそれに似ている状況かも。

    ひとたび意味が分かれば、「なんだ、それだけのことか」と思えるようになる。
    同じことでも、分かりやすく平易な言葉で説明するのは親切だと思う。

    上記のブログの説明は、とても簡潔で分かりやすかった。

    入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算
    (2006/09)
    新納 浩幸

    商品詳細を見る

    関連記事

    コメント

    コメントの投稿


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

    トラックバック

    トラックバックURL:
    http://hamamuratakuo.blog61.fc2.com/tb.php/341-78ac2b75

    FC2Ad