2016-05-27 10 views
3

ドキュメントやサンプルを読んでいるときに、変数に無名関数を割り当てることができるという考えがよく出てきます。新しい機能を定義するのではなく、なぜこれを実際に行うのですか?変数に無名関数を割り当てるのはなぜですか?

いくつかの例:

のClojure/Lispの

(def add2 
    (fn [a] (+ 2 a)) 
(add2 4) ;; => 6 

パイソン

add2 = lambda e: e + 2 
add2(3) # => 5 

スカラ明らか

val add2 = (x: Int) => x + 2 
add2(5) /* => 7 */ 

は、これらは些細な例ですが、生産コードでは、私は通常、私は高いkinded種類を考える(特定のユースケースのために必要なオフ機能である無名関数を考えますなど)。

なぜ私は変数に匿名関数を割り当てるのですか?それはランタイム/コンパイル時のことですか?これを有利にする特定のパフォーマンス特性はありますか? Python Docsによると

+0

これは実際には主に意見ベース/スタイルの問題です。しかし** Python **のようなラムダを使うことは、デバッグを難しくすることを除いて、他の "目的"にはならない。 –

+1

'key'関数(例えば' sort'のため)が必要なときにラムダ関数に名前を割り当てることがあります。引数として使う同じ行で関数を定義すると思うときには、あまりにも簡潔ですが、通常の関数はあまりにも冗長であると感じます。 – timgeb

+0

私は今朝これを実際にしました。私は異なる実装を持つ2つの高次関数をテストしていましたが、同じ入出力を持つ必要がありました。私は渡された関数を 'let'で束縛し、それを本体で使用しました。私はそれを具体的な機能として定義できましたが、これは迅速なテストには十分でした。 – Carcigenicate

答えて

1

のためだけの速記である私は、それが提示されている方法は、読者が真に機能は言語が言った中で最初のクラスであることを理解し、よりそうだと思います。彼らは他の関数の引数としてそれらを使用していたにすぎないかもしれませんが、おそらくその点は失われているかもしれません。しかし、それらを非常に価値のあるやり方で使用すること、割り当ての右手として使うこと、ラムダ自体のメソッドを呼び出すことなどは、数字、文字列、マップ、または言語の他の値と非常に似ているという点を家庭にもたらします。

私はこのパターンを使用しません。これは、他のコメントにも言及しているように、コードの読み取りとデバッグが難しいだけでなく、適切な関数宣言(Python)を完全には持たないケースがあります。

しかし、実際に関数の引数を利用するコードを書くときは、多かれ少なかれそれをやっています。オペレータの使用よりも間接的にしか割り当てが行われません。

1

は意味的に、彼らは通常の関数定義のためだけ糖衣構文です。

afaikのように、lambdaには特別なパフォーマンス特性はありません。あなたが複雑な仕事のためにラムダを使うことを考えているなら、もう一度考えて、関数を使ってください。

ラムダ式を識別子に直接バインドする代入文ではなく、常にdef文を使用します。

編集:Clojureので追加StefanS」提案

+1

https://www.python.org/dev/peps/pep-0008/の「ラムダ式を識別子に直接バインドする代入文ではなく、常にdef文を使用する」を追加する必要があります。ラムダ関数を実際に使用すると、http://docs.python-guide.org/en/latest/writing/style/#shortの例のように、リストの補完やマップ/フィルタなどの小さな関数を使用することができます-ways-to-manipulate-listsを使用します。 – StefanS

+0

@StefanS Ok、これを追加します:) – noteness

0

、その理由は、あなたが複数の場所で関数を使用することができます。実際に

(defn add2 [x] (+ x 2) 

(def add2 (fn [x] (+ x 2)) 
関連する問題