ラムダ式

  • 関数の名前を省略したい。
  • 使いたいときにその場で定義したい。
このようなときに便利なのがラムダ式です。ラムダ式は多くの言語で利用できますが、 Maximaでも利用できます。

例1.

lambda([x],x+1)(1);
実行結果. 2

lambda([x],x+1) の [x] は引数を意味します。x+1 がこの関数の返す値です。 つまり、上の結果は \[ f(x) = x+1 \] という関数に 1 を代入した結果が 2 であるという意味になります。

名前を省略できるところが良いところですが、理解を深めるため、あえて名前をつけてみます。

例2.

f:lambda([x],x+1)$ f(1);
実行結果. 2

2変数関数も定義できます。

例3.

lambda([x,y],x-y)(a,b);
実行結果. a-b

[x,y] によって2変数関数であることを宣言しています。例3では \[ f(x,y) = x-y \] という関数を定義して、x=a,y=b を代入したことになります。

応用例

ラムダ式は、sublist や rreduce などで関数が必要になった時に、その場で定義し使用できるところが良いところです。 「わざわざ別の場所に移って、名前をつけて関数を定義する」という手間を省略できます。 ただし、関数定義が長くなる場合は別で定義したほうが見やすいです。

例4.

rreduce(lambda([x,y],x+1/y),[1,2,2,2,2,2,2,2,2]);
実行結果. 1393/985

\[ \frac{1393}{985}=1+\cfrac{1}{2+\cfrac{1}{2+\cfrac{1}{2+\cfrac{1}{2+\cfrac{1}{2+\cfrac{1}{2+\cfrac{1}{2+\cfrac{1}{2}}}}}}}} \]

「リスト」 でも応用例をいくつかあげていますのでそちらも参照してください。