見出し画像

関数型プログラミング事始め (6) ラムダの苦難

関数型プログラミングがはじめての方へ贈る入門の書
前節:再帰の苦難 次節:高階関数の苦難
参考書:
・五味 弘「はじめてのLisp関数型プログラミング」技術評論社(2016)
・大山口 通夫、五味 弘「プログラミング言語論」コロナ社(2008)
・五味 弘「関数型プログラミングと数学(ITと数学)」技術評論社(2021)

関数型プログラミングでは、ラムダ記法に準拠して記述した匿名関数を普通のデータとして扱うことができ、関数を引数や値に使うことができます。これで抽象的な関数が実装でき、応用範囲の広いプログラムになります。でもどうしてラムダなのでしょうか。この謎は本文で

(4) ラムダの苦難

ラムダ lambda はギリシア文字の11番目の文字で、大文字は Λ で、小文字は λ です。このラムダが関数型プログラミングでは大きな意味を持つようになります。この背景は後で説明します。

ラムダは関数型プログラミングでは「変数束縛」を表す記号として使います。なお変数束縛は、ここでは簡単に関数引数として捉えてください。このラムダを使って名前のない関数(匿名関数)を作ることができます。
例えば λx.x+x は引数xに対してx+xの値を返す匿名関数になります。
lispではλx.f(x)は (lambda (x) (f x))のように書くことになります。

(参考)なぜラムダなのか?

関数型プログラミングでは変数束縛のときにラムダを使います。なぜラムダなのでしょうか?アルファでもなく、ベータでもなく、ガンマでなく、なぜラムダなのでしょうか。

その昔、「数学原理」で変数束縛を表すのに^(ハット、キャレット)を使っていました。それをチャーチがラムダ計算で変数束縛を表すのに Λ(ギリシア文字のラムダの大文字)を使いました。

しかしΛは他の記号と混同しがちだったので、小文字のλを使うようになりました。この時点で数学原理とは別ものになってしまいました。次にチャーチの学生だったマッカーシーがLISPにlambdaを導入しました。これで完全にわからなくなり、悲劇「なぜラムダなのですか?」という質問が関数型プログラミング界隈で繰り返されるようになりました。

参考:「はじめてのLisp関数型プログラミング」p.69「column ラムダ計算のラムダはなぜラムダ(λ)なのか」

(考察)ラムダの苦楽 

ラムダによる匿名関数は便利であるとともに、名前がないためにプログラムの了解性を悪くします。名前はプログラムの了解性を高めるための重要な鍵になりますが、その名前がないのでプログラムを理解する鍵がなくなり、途方にくれるかもしれません。

そして名前付けには神経を使います。疲れます。気苦労の素です。へたな名前を付けると後世の人が苦労します。例えば、getValueという関数名であったのにも関わらず、getValueの中で valueの値を破壊的に変更していると悲劇です。悲しいです。

でも名前付けがないだけでプログラミングするのが気楽になるのも事実です。名前付けは疲れます。神経を使います。自分の子供の名前付けのように苦労するが楽しみである名前付けとは違います。苦労します。苦難です。

名前付けを考えずに関数を作れます。気楽に関数を作れます。匿名関数だけでプログラムを作るのも夢ではありません。他の人にとっては悪夢ですが。

(次回予告) (5) 高階関数の苦難

今回の予定は「高階関数の苦難」の予定でしたが、匿名関数だけで文字数がオーバーしましたので、高階関数の苦難は次回になります。関数型プログラミングの特徴である高階関数が難しいという苦難です。

参考:プログラミング言語はどれがお得?(前編)|五味弘 (note.com)
参考:プログラミング言語はどれがお得?(後編)|五味弘 (note.com)


よろしければサポートをお願いします!