問題タブ [lifting]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Pythonのデコレータを使用してf(x)をf([x])に変換する
私はこれを数年前に書きました。f(X)
関数を飾ると。@foo
になり
f(list of Xs)
ます。
このプロセスは何と呼ばれていますか?それは何ですか?その関数型プログラミングの名前は何ですか?
カリー化していない。私は単純なmap9(f,list of Xs)
ことがそれをすることができたかもしれないことを知っています。
数学的に呼ばれるデコレータ/デコレーションの操作とは何ですか?
c# - C# Lambda のパフォーマンスの問題/可能性/ガイドライン
さまざまなラムダ式の構文を使用して、パフォーマンスの違いをテストしています。簡単な方法がある場合:
point
ラムダの観点からは自由変数であるため、パラメータに関連する変数リフティングがここで行われています。このメソッドを 100 万回呼び出すとしたら、そのままにしておくか、何らかの方法で変更してパフォーマンスを向上させる方がよいでしょうか?
どのようなオプションがあり、どれが実際に実行可能ですか? 私が理解しているように、フリー変数を取り除く必要があるため、コンパイラはクロージャ クラスを作成して、このメソッドを呼び出すたびにインスタンス化する必要がありません。通常、このインスタンス化には、非クロージャ バージョンと比較してかなりの時間がかかります。
問題は、大ヒットのラムダ式を書くたびに時間を無駄にしているように見えるので、一般的に機能するある種のラムダ記述ガイドラインを考え出したいということです。従うべきルールがわからないため、動作することを確認するために手動でテストする必要があります。
代替方法
& サンプル コンソール アプリケーション コード
また、変数のリフティングを必要としない同じメソッドの別のバージョンも作成しました (少なくともそうではないと思いますが、これを理解している皆さんは、その場合はお知らせください)。
ここで要旨をチェックしてください。コンソール アプリケーションを作成し、コード全体をブロックProgram.cs
内のファイルにコピーするだけです。namespace
2 番目の例は、自由変数を使用していませんが、はるかに遅いことがわかります。
矛盾した例
ラムダの最適な使用ガイドラインを作成したい理由は、以前にこの問題に遭遇したことがあり、驚いたことに、述語ビルダーのラムダ式を使用すると、より高速に動作することが判明したためです。
では、それを説明してください。コードに頻繁に使用するメソッドがあることがわかっている場合、ラムダをまったく使用しないことが判明する可能性があるため、ここで完全に迷っています。でも、そんな事態は避けて、真相を究明したい。
編集
あなたの提案はうまくいかないようです
コンパイラが自由変数ラムダで行うのと同様に内部的に動作するカスタム ルックアップ クラスを実装しようとしました。ただし、クロージャー クラスを使用する代わりに、同様のシナリオをシミュレートするインスタンス メンバーを実装しました。これはコードです:
興味深いことに、これは遅いバージョンと同じくらい遅く動作します。理由はわかりませんが、速いもの以外は何もしていないようです。これらの追加メンバーは同じオブジェクト インスタンスの一部であるため、同じ機能を再利用します。ともかく。私は今、非常に混乱しています!
この最新の追加でGist ソースを更新したので、自分でテストできます。
scala - ScalaにliftM2を実装することは可能ですか?
Haskellでは、次のliftM2
ように定義できます。
これをScalaに翻訳したいと思います。私の最初の試みは次のとおりでした。
これは、可能な限り最も明白な方法であると私が推測する方法で失敗します。「値flatMapは型パラメーターM[T1]のメンバーではありません」。M[_]
そうです、それがある種のモナドであることを示していません。そこで次に試したのは、次のような構造タイプを定義することでした。
...そして持っているM[A] <: Monad[A]
。しかし、Scalaには再帰的な構造型がないため、それは機能しません。
それで、私が試した次のいくつかのことは、に似た回転を含みましたM[A] <: FilterMonadic[A, _]
。これらはすべて失敗しました。おそらく、の正しい暗黙のfuを理解できなかったためCanBuildFrom
です。
StackOverflowで私が見つけた最も密接に関連する質問は、再帰的な構造型とScalaでHaskellの型クラスを模倣する方法の両方に触れたこの質問でした。しかし、そのアプローチでは、関心のある各型から型クラスを定義する特性への暗黙の変換を定義する必要があります。この場合、これはひどく循環しているように見えます...
私がやろうとしていることをする良い方法はありますか?
haskell - Haskellで高階関数を持ち上げる
次のタイプの関数を作成しようとしています。
t
モナド変換子はどこにありますか。具体的には、これを行うことに興味があります。
私はいくつかのHaskellウィザードライブラリをいじりましたが、役に立ちませんでした。どうすればそれを正しくすることができますか、またはおそらくどこかに私が見つけられなかった準備ができた解決策がありますか?
c# - メンバー アクセス式のチェーンを分解するにはどうすればよいですか?
短いバージョン (TL;DR):
メンバー アクセス演算子の単なるチェーンである式があるとします。
この式は、それぞれが 1 つのメンバー アクセス操作で構成される部分式の合成と考えることができます。
私がやりたいのはe
、これらのコンポーネントのサブ式に分解して、個別に作業できるようにすることです。
さらに短いバージョン:
もし私がその表現を持っているならx => x.foo.bar
、私はすでに別れ方を知っていますx => x.foo
。他の部分式を引き出すにはどうすればよいfoo => foo.bar
ですか?
私がこれをしている理由:
CoffeeScriptの存在アクセス演算子の?.
ように、C#でメンバーアクセス演算子を「持ち上げる」ことをシミュレートしようとしています。Eric Lippert は、同様の演算子が C# で検討されていると述べていますが、それを実装する予算はありませんでした。
そのような演算子が C# に存在する場合、次のようなことができます。
チェーンの一部target.foo.bar.baz
が null であることが判明した場合、この全体が null と評価されるため、NullReferenceException が回避されます。
Lift
この種のことをシミュレートできる拡張メソッドが必要です。
私が試したこと:
私はコンパイルできるものを持っていますが、それはある程度機能します。ただし、メンバーアクセス式の左側を保持する方法しか知らないため、不完全です。x => x.foo.bar.baz
に変身できますがx => x.foo.bar
、維持する方法がわかりませんbar => bar.baz
。
したがって、最終的には次のようなことになります(疑似コード):
これは、式の左端のステップが何度も評価されることを意味します。それらが POCO オブジェクトの単なるプロパティである場合は大したことではないかもしれませんが、それらをメソッド呼び出しに変えると、非効率性 (および潜在的な副作用) がより明白になります。
コード:
これは、この回答に大まかに触発されました。
Lift メソッドの代替手段と、それらを使用できない理由:
Maybe モナド
長所:- 関数型プログラミングで一般的な既存のパターンを使用
- 解除されたメンバー アクセス以外の用途があります
- 冗長すぎます。いくつかのメンバーをドリルダウンするたびに、関数呼び出しの大規模なチェーンは必要ありません。クエリ構文を実装
SelectMany
して使用したとしても、私見はより乱雑に見えますが、それ以下ではありません。 - 個々のコンポーネントとして手動で書き直す必要が
x.foo.bar.baz
あります。つまり、コンパイル時にそれらが何であるかを知る必要があります。のような変数から式を使用することはできませんresult = Lift(expr, obj);
。 - 私がやろうとしていることのために実際に設計されたわけではなく、完璧にフィットしているようにも感じません.
式ビジター
Ian Griffith の LiftMemberAccessToNull メソッドを、前述のように使用できる汎用拡張メソッドに変更しました。コードは長すぎてここに含めることはできませんが、興味のある方は Gist を投稿します。
長所:result = target.Lift(x => x.foo.bar.baz)
構文に従います- チェーンのすべてのステップが参照型または null 非許容値型を返す場合にうまく機能します
- チェーン内のいずれかのメンバーが null 許容値型である場合、それは窒息します。これにより、その有用性が実際に制限されます。
Nullable<DateTime>
メンバーのために機能する必要があります。
トライ/キャッチ
これは最も明白な方法であり、より洗練された方法が見つからない場合に使用します。
長所:- それは簡単です。
- コードの目的は明らかです。
- エッジケースについて心配する必要はありません。
- それは醜くて冗長です
- try/catch ブロックは重要なパフォーマンス ヒットです*
- ステートメント ブロックなので、LINQ の式ツリーを発行することはできません。
- 負けを認めた感じ
うそをつくつもりはありません。「負けを認めない」ことが、私が頑固な一番の理由です。私の本能は、これを行うエレガントな方法があるに違いないと言いますが、それを見つけるのは困難でした. 式の左側には簡単にアクセスできるのに、右側にはほとんど到達できないなんて信じられません。
ここには本当に 2 つの問題があるので、どちらかを解決するものは何でも受け入れます。
- 両側を保持し、妥当なパフォーマンスを持ち、あらゆる型で機能する式分解
- null 伝搬メンバー アクセス
アップデート:
null 伝播メンバー アクセスは、 C# 6.0に含まれる予定です 。ただし、式の分解に対する解決策が必要です。
haskell - iterateを使用してマップを繰り返し適用できないのはなぜですか?
データ構造をネストすると、それらを掘り下げるためのコードを手動で記述していることに気付きました。このような:
そのため、高階関数を使用して、ネストされたデータ構造を掘り下げるための関数を自動的に構築できるはずです。
それは私にそれを打つ
- 私はそれが期待した場所のリストを見つけることを理解しています...何か他のもの
- これを修正する方法がわかりません-反復が目的であると思っていたとしても、繰り返し適用するコードを書く必要がありますか?
- これは「持ち上げる」という概念に似ているように見えますが、その直感をどのように適用するかはわかりません。
scala - 同時実行のための scala での式の自動リフティング
任意の関数への引数を透過的に (ソース レベルの変更なしで) 並列に評価したいと考えています。
たとえば、 -
c = f(a, b)
は次のようになります:
a
andb
が並列に評価されてから、 of が呼び出されf
ます。
これを行う 1 つの方法は、上記の式を次のように変換することです。
(そうf: a -> b -> c
なるf: Future<a> -> Future<b> -> Future<c>
ように)c' = f'(a', b')
これはscalaで行うことは可能ですか?
haskell - クライスリの矢印をIOに持ち上げますか?
次の2つのクライスリ矢印がある場合:
私は次のような何かを書くことができるようにしたいと思います:
String
と一致しないため、もちろん機能しませんIO String
。一方、両方を定義してタイプにすることは可能ですstdoutProcessA
がwriteToFileA
、その場合、他のものに必要なKleisli IO ...
タイプの矢印でそれらを構成することはできません。Kleisli Maybe ...
私はまだ矢印の経験があまりないので、おそらく明らかな何かが欠けています。上記をどのように行うのでしょうか?
haskell - トランスフォーマーの下での変換
現在、モナドトランスフォーマーに少し苦労しています。トランスフォーマーを利用するいくつかの異なる非決定論的関係を定義しています。残念ながら、ある効果的なモデルから別のモデルにきれいに変換する方法を理解するのに苦労しています。
これらの関係が「foo」と「bar」であるとします。「foo」が As と B を C に関連付けるとします。「バー」が B と C を D に関連付けるとします。「foo」に関して「bar」を定義します。さらに興味深いことに、これらの関係の計算はさまざまな方法で失敗します。(bar リレーションは foo リレーションに依存するため、その失敗ケースはスーパーセットです。) したがって、次の型定義を与えます。
次に、次の関数シグネチャを使用してリレーションを記述できることを期待します。
私の問題は、「バー」の定義を書くときに、「foo」リレーションからエラーを受け取り、それらを「バー」スペースで適切に表現できる必要があることです。したがって、次の形式の関数で問題ありません
ListT を実行し、EitherT にマッピングし、ListT を再構築することで、その小さな獣を書くことさえできます (たまたま m [a] が ListT ma に変換される可能性があるためです)。しかし、これは... 面倒です。
トランスフォーマーを実行して、その下でいくつかのことを行い、一般的に「元に戻す」ことができないのには十分な理由があります。私が実行したトランスフォーマーには効果がある可能性があり、魔法のようにそれらを元に戻すことはできません. convert
しかし、上記の関数を記述する必要がないように、関数をトランスフォーマースタックに持ち上げて何らかの作業を行う方法はありますか?
scala - Scala の奇妙な暗黙のボクシング変換エラー
以下が機能しない理由を誰かに教えてもらえますか?
次のエラーが発生します。