タグ付けされた質問 「lambda」

ラムダは、さまざまなプログラミング言語で使用できる匿名関数(つまり、クラスのメソッドのような識別子がない)です。

2
これは良いパターンですか?長い関数を一連のラムダに置き換えますか?
最近、次のような状況に遭遇しました。 class A{ public: void calculate(T inputs); } まず、A物理世界のオブジェクトを表します。これは、クラスを分割しないことの強力な議論です。今、calculate()非常に長く複雑な機能であることが判明しました。私は3つの可能な構造を知覚します: テキストの壁としてそれを書く-利点-すべての情報が一箇所にある privateクラスでユーティリティ関数を記述し、それらをcalculateボディで使用する-欠点-クラスの残りの部分は、これらのメソッドを知らない/気遣わない/理解しない calculate次のように書きます: void A::calculate(T inputs){ auto lambda1 = () [] {}; auto lambda2 = () [] {}; auto lambda3 = () [] {}; lambda1(inputs.first_logical_chunk); lambda2(inputs.second_logical_chunk); lambda3(inputs.third_logical_chunk); } これは良いプラクティスか悪いプラクティスか?このアプローチは問題を明らかにしますか?全体として、再び同じ状況に直面したとき、これを良いアプローチと考えるべきですか? 編集: class A{ ... public: // Reconfiguration of the algorithm. void set_colour(double …
14 c++11  lambda 


1
高次リスト関数のC ++ 11サポート
などなど、ほとんどの関数型プログラミング言語(例えばCommon Lispの、スキーム/ラケット、Clojureの、ハスケル、スカラ座、OCamlで、SML)リスト上のいくつかの一般的な高階関数をサポートするには、map、filter、takeWhile、dropWhile、foldl、foldr(例えば参照、Common Lispの、スキーム/ラケットをClojureの並列リファレンスシート、Haskell、Scala、OCaml、およびSMLドキュメント。 C ++ 11には、リストに同等の標準メソッドまたは関数がありますか?たとえば、次のHaskellスニペットを考えます。 let xs = [1, 2, 3, 4, 5] let ys = map (\x -> x * x) xs 最新の標準C ++で2番目の式をどのように表現できますか? std::list<int> xs = ... // Initialize the list in some way. std::list<int> ys = ??? // How to translate the Haskell expression? 上記の他の高階関数はどうですか? C …

1
Java 8:遅延操作のAPIでストリームを渡すことをお勧めしますか?
GuavaなどのJava 8より前のラムダヘビーライブラリでは、出力は共通のJava Collection Frameworkインターフェイスを使用するため、外部/内部APIに簡単に渡すことができ、ライブラリメソッドがそれを実行する場合(レイジーfilter()およびtransform())でも遅延計算を利用できます。 ただし、Java 8 Streamsでは、Collection/ を取得する呼び出しMapはターミナル(つまり、熱心)であり、結果を保持するために新しいデータ構造も割り当てます。 中間に複数のステージと戦略パターンがある複雑な計算では、中間結果のために多くの不必要な割り当てが発生します。 だから、人々は内部API(すなわち戦略パターン戦略)がStreams を取得して返すのが良い習慣だと思うのですか、それとも単に怠け者にフォールバックする必要がありますか? 編集: 私の主な関心事Streamは、それが一度だけ消費され、Supplier<Stream<X>>非常に面倒に見えるようなものを渡すことができるということです。それはほとんどあなただけ渡すためにプッシュしCollection、その後、再stream()それを(その時点での先行評価のコストを支払います)。
12 java  lambda 

3
Java 8では、メソッド参照式や、関数型インターフェースの実装を返すメソッドを使用するほうが文法的に優れているでしょうか?
Java 8では、関数型インターフェイスの概念と、関数型インターフェイスを取るように設計された多数の新しいメソッドが追加されました。これらのインターフェースのインスタンスは、メソッド参照式(例SomeClass::someMethod)とラムダ式(例(x, y) -> x + y)を使用して簡潔に作成できます。 同僚と私は、どちらのフォームを使用するのが最適かについて意見が異なります(この場合、「最適」は、「最も読みやすい」と「標準的な慣行に最も近い」に要約されます。同等)。具体的には、次のすべてが当てはまる場合です。 問題の関数は単一のスコープの外では使用されません インスタンスに名前を付けると、読みやすさが向上します(たとえば、ロジックが何が起こっているかを一目で確認できるほど単純であるのとは対照的) ある形式が他の形式よりも好まれるプログラミング上の理由は他にはありません。 この問題についての私の現在の意見は、プライベートメソッドを追加し、それをメソッド参照で参照することが、より優れたアプローチであるというものです。これはこの機能がどのように使用されるように設計されているかのように感じられ、メソッド名とシグネチャを介して何が起こっているかを伝える方が簡単に思われます(たとえば、「boolean isResultInFuture(Result result)」は明らかにブール値を返すと言っています)。また、クラスの将来の拡張で同じチェックを利用したい場合に、プライベートメソッドを再利用しやすくしますが、機能インターフェイスラッパーは必要ありません。 私の同僚の好みは、インターフェイスのインスタンスを返すメソッドを用意することです(たとえば、 "Predicate resultInFuture()")。私には、この機能の使用方法が完全ではないように感じられ、少し不格好に感じられ、名前を付けることで意図を実際に伝えるのが難しいように思われます。 この例を具体的にするために、異なるスタイルで記述された同じコードを次に示します。 public class ResultProcessor { public void doSomethingImportant(List<Result> results) { results.filter(this::isResultInFuture).forEach({ result -> // Do something important with each future result line }); } private boolean isResultInFuture(Result result) { someOtherService.getResultDateFromDatabase(result).after(new Date()); } } …

4
Javaの主な焦点は何ですか?新機能を入手するのになぜこんなに時間がかかるのですか?
私は、ラムダ式、拡張メソッド、新しいストリームAPIなど、JDK8の新機能を調査しています。 明らかに、これらの機能のどれもプログラミングの世界で新しいものではないので、なぜ今までこれらすべての機能がJavaで利用されているのか不思議に思いました。 Lisp(1958)、SML(1973)、Haskell(1990)、Python(1991)、JavaScript(1994)、Ruby(1995)、Scala(2003)、C#(2007)、およびLispの55年後にラムダ式があり、 Java(2013)では実質的に他のすべての人。 そして、私はSIC(1996)のストリームについて読みました。 なんで今なんだろう?証拠は、他の言語との競争が動機ではないことを示唆しています。 このリリースのJavaの優れた新機能はすべて、並列処理の実装の副産物にすぎないようです。ラムダは、並列アルゴリズムの記述を簡単にするためにあり、ラムダ式が必要とする変更などをサポートするためにそれらを必要とするため、拡張メソッドがあります。 したがって、私の質問は、このJavaの次のリリースのメイントピックが実際に並列処理であることを安全に確認できるでしょうか。それとも、今までJavaで本の中で最も古いトリックが登場した他の理由を正当化できるでしょうか。

3
Haskellおよび/またはラムダ計算におけるパラメーターなしのラムダ式
SchemeやPythonなどの熱心な言語では、パラメータなしのラムダ式を使用して、評価を遅延させることができます。たとえば、Scheme(チキンスキーム)の場合: #;1> (define (make-thunk x) (lambda () (+ x 1))) #;2> (define t (make-thunk 1)) #;3> (t) 2 2行目tは未評価の式にバインド(lambda () (+ 1 1))され2、3行目で評価されます。 同様に、Pythonでは: >>> def make_thunk(x): return lambda: x + 1 ... >>> t = make_thunk(1) >>> t() 2 この手法を使用すると、熱心な言語で遅延評価を実装できます。 そのため、言語が既に遅延しており、遅延式を作成する必要がないため、Haskellにはパラメーターなしのラムダ式がないと予想していました。驚いたことに、Haskellではラムダ式を書くことが可能であることがわかりました \() -> "s" これは次の()ような値にのみ適用できます: (\() -> "s") () …

1
「通常の順序」と「名前による呼び出し」は同じものですか?
私は「コンピュータプログラムの構造と解釈」という本を研究しており、セクション1.1.5手続き適用の代替モデルでは、筆者は通常の順序と適用順序の概念を説明しています。 今すぐ、私はコースを取っていコーセラが呼ばれるスカラ座での関数プログラミングの原則をと(本が先に引用してずっと彼もちろんベース)教授マーティン・オーダーズキーが説明の名の下に同じ概念コール名ずつとcall-値渡し。 彼のコースでは、教授Odersky著は、私は私の図書館の本に相談して置換モデルは、ラムダ計算に基づいていると言う関数型プログラミングもののラムダ計算に入門をし、22ページに、著者はApplicativeのため、通常の注文として用語を定義し。興味深いことに、彼の定義では、通常の順序はAlgolの名前による呼び出しと同様に、適用順序はPascalの値による呼び出しと同様であると述べています。 彼の説明で「に似ている」という言葉の使用は、私を疑わせたものです。したがって、私の質問: これら2つの用語は同等ですか、それとも微妙な違いがありますか? 意味を間違える危険を冒すことなく、どちらか一方を交換して使用できますか? 同じことを指すために異なる用語の存在を正当化する理由について、あなたが知っている理由はありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.