1. ホーム
  2. lambda

[解決済み] ラムダ(関数)とは何ですか?

2022-03-19 12:17:22

質問

コンプサイエンスのバックグラウンドを持たない人にとって、コンピュータサイエンスの世界でのラムダとは何なのでしょうか?

どのように解くのですか?

ラムダの由来は ラムダ計算 であり、プログラミングにおける無名関数のことである。

なぜこれがクールなのか?名前を付けずに、素早く捨てられる関数を書くことができるからです。また、クロージャを書くのに良い方法を提供してくれます。この力を使えば、こんなこともできるようになります。

パイソン

def adder(x):
    return lambda y: x + y
add5 = adder(5)
add5(1)
6

Pythonのスニペットからわかるように、関数adderは引数xを受け取り、別の引数yを受け取る匿名関数(ラムダ)を返します。この匿名関数によって、関数から関数を作成することができます。これは簡単な例ですが、ラムダとクロージャが持つ力を伝えることができるはずです。

他の言語での例

Perl 5

sub adder {
    my ($x) = @_;
    return sub {
        my ($y) = @_;
        $x + $y
    }
}

my $add5 = adder(5);
print &$add5(1) == 6 ? "ok\n" : "not ok\n";

JavaScript

var adder = function (x) {
    return function (y) {
        return x + y;
    };
};
add5 = adder(5);
add5(1) == 6

JavaScript (ES6)

const adder = x => y => x + y;
add5 = adder(5);
add5(1) == 6

スキーム

(define adder
    (lambda (x)
        (lambda (y)
           (+ x y))))
(define add5
    (adder 5))
(add5 1)
6

C# 3.5以上

Func<int, Func<int, int>> adder = 
    (int x) => (int y) => x + y; // `int` declarations optional
Func<int, int> add5 = adder(5);
var add6 = adder(6); // Using implicit typing
Debug.Assert(add5(1) == 6);
Debug.Assert(add6(-1) == 5);

// Closure example
int yEnclosed = 1;
Func<int, int> addWithClosure = 
    (x) => x + yEnclosed;
Debug.Assert(addWithClosure(2) == 3);

スウィフト

func adder(x: Int) -> (Int) -> Int{
   return { y in x + y }
}
let add5 = adder(5)
add5(1)
6

PHP

$a = 1;
$b = 2;

$lambda = fn () => $a + $b;

echo $lambda();

ハスケル

(\x y -> x + y) 

ジャワ 見る この記事

// The following is an example of Predicate : 
// a functional interface that takes an argument 
// and returns a boolean primitive type.

Predicate<Integer> pred = x -> x % 2 == 0; // Tests if the parameter is even.
boolean result = pred.test(4); // true

ルア

adder = function(x)
    return function(y)
        return x + y
    end
end
add5 = adder(5)
add5(1) == 6        -- true

コトリン

val pred = { x: Int -> x % 2 == 0 }
val result = pred(4) // true

ルビー

Rubyは、関数の呼び出しとまったく同じ構文でラムダを呼び出せないという点で少し異なりますが、それでもラムダは存在します。

def adder(x)
  lambda { |y| x + y }
end
add5 = adder(5)
add5[1] == 6

Rubyにはラムダという省略記法があり、それを使って adder このように

def adder(x)
  -> y { x + y }
end

R

adder <- function(x) {
  function(y) x + y
}
add5 <- adder(5)
add5(1)
#> [1] 6