2014年5月18日日曜日

ラムダ式について

#コメントを頂きましたので、加筆・修正しました。


Dart は「ラムダ式」を使用することができます。
ラムダ式は言語ごとに、またはその文献ごとに説明が異なっていることがあります。


具体的には、
・匿名関数そのものを指す
・匿名関数を短くコーディングできる手法を指す
 (”=>”をラムダ演算子と呼ぶ言語もある)
・第1級オブジェクトとして扱える関数を指す
などです。


「Dart はラムダ式が使える」とよく聞きますが、それらは上記のようなものを総称して言っているのだと思います。
(筆者が勝手に思っています)


まずは関数のショートハンドですが、
// 引数 a に b を足して返すだけ
addingA2B(a, b) {
  return a + b;
}
これは、
addingA2B(a, b) => a + b;
と書けます。


また、関数をオブジェクトとして扱える点については、
var addingA2B = (a, b) => a + b;

// こちらも同意
var addingA2B = (a, b) { return a + b; };
といった感じです。


ラムダ式を用いることでクロージャを実現することも可能です。
#今回は触れませんが。。。


今回あえて引数に型指定を行いませんでしたが、上記関数にオペレータオーバーロードした値を渡してもちゃんと計算してくれました。
かしこい!(って当たり前か。。。)


因みに、、、
Java8 のラムダ式はこれとは意味合いが少し異なっていて、関数型インターフェースを実装する形になります。
(抽象メソッドがない場合や、複数ある場合はどのメソッドを実装してよいか判断できないのでコンパイルエラーになる)
Dart とは全く関係ないですが、最近よく見かけるので比較してみました。


今回はこんなところです。

4 件のコメント:

  1. このコメントは投稿者によって削除されました。

    返信削除
  2. 「ラムダ式」はラムダ計算における定義ではないと思いますが、 http://goo.gl/Nj4WVE
    「=>」のことであれば単なるシンタックススイートです。
    実際に、本文の2例は下記のように書くことが出来、それぞれと等価です。

    addingA2B(a, b) => a + b;

    var addingA2B = (a, b) {
    return a + b;
    };

    また、「=>」はシンタックスシュガーなので、クロージャとも直接関係ありません。
    変数代入の例示でクロージャに必要な関数オブジェクトの存在を示唆していますが、
    加えて、関数が定義された環境(名前の由来)における解決機能が必要です。

    Dartにクロージャが有る点はその通りです。

    返信削除
  3. コメントありがとうございます。
    実はこの blog 初のコメントでして、嬉しいです。

    コメントの内容についてですが、
    わたしの書き方が悪かったのと、勉強不足で言いたいことがうまく伝えれていなかったようです。。。

    本文の2例は(特に2つ目)、関数をオブジェクトとして利用可能であることも意味していたのですが、やはり使わない人には目新しいであろう「=>」を強調してしまったために、本意を伝えれていませんでした。

    時間をとって本文を修正してみようと思います。
    良かったらまた見に来てください。

    返信削除
  4. 確かに一部に無名関数をラムダ式と呼ぶ言語があるんですね。 http://goo.gl/kjNL36
    式の文脈でなくてもexpressionと言っているので誤訳が定着したのかもしれません。

    返信削除