このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

クロージャとラムダ式は同義だ、と主張してみる

だいぶ前に、クロージャ(閉包)って言葉の意味がわからないと書いたことがあります(「クロージャ、それなに?」)。最近また「クロージャ」って言葉を聞いたのですが、やっぱり何を意味しているのかわかんなくて(詮索する余裕もなくて)落ち着かない気分になりました。これはどうも精神衛生上よくない。

クロージャ」と「ラムダ式」はまったく同義に扱ってもいいんじゃないのかな。例えばラムダ式 λx.(a*x + b) があるとき、自由変数a, bを具体化するための環境(変数束縛)をラムダ式と一緒にした (λx.(a*x + b), {a : 2, b : 1}) が古典的な意味のクロージャでしょ、たぶん。letを使えば、(let a = 2 b = 1; λx.(a*x + b)) みたく書けるけど、これも結局 (λa.λb.(λx.(a*x + b)))(2)(1) だから1個のラムダ式ですよね。

クロージャラムダ式は同義だ」ってことになると、毎回「それ、なんのこと?」と考え込まなくて済むのでいいなー、と僕は思うのだけど、「いや、それは違う」って方はご意見をお聞かせください。

[追記]ちょっと話が粗っぽ過ぎたので補足:

ラムダ式と環境の組 (λx.(a*x + b), {a : 2, b : 1}) も、1つのラムダ式 (λa.λb.(λx.(a*x + b)))(2)(1) に展開できるよ、と言いました。ですが、「だから展開の前後はまったく同じだ」と結論しちゃうと言い過ぎです。僕の感覚では、外側の大きなラムダ式 (λa.λb.(λx.(a*x + b)))(2)(1) と、このラムダ式の部分式としての“元のラムダ式 λx.(a*x + b) の出現”を組にすりゃ十分でしょ、ってことです。

部分式の出現を特定するために、下線を引くとか色を変えればいいでしょうが、テキスト・オンリーだと表現が困難なんで <> で囲むことにすると、

  • (λa.λb.(<λx.(a*x + b))>)(2)(1)

とまー、こんな感じのモノ。すべての自由変数が具体化されなくてもいいから、

  • λb.(<λx.(a*x + b))>)(2)

とかでもいいです。いずれしても、ラムダ式という構文的な表現に目印<>を追加しただけのものですから、ここらへんまでは「ラムダ式だ」と言っても許されるんじゃないかな、と。

で、「クロージャ」という言葉を使うとき、上記のごとく少し拡張解釈した「ラムダ式」となんか違いがあるんかい? という話でした。[/追記]