問題タブ [multimethod]

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.

0 投票する
1 に答える
389 参照

clojure - Clojure での慣用表現の単純化

この優れた投稿に触発されて、投稿で使用されているアルゴリズムを使用して、Clojure に単純な式単純化機能を実装したいと考えました。この投稿では、F#、Scala、Haskell、C++、および Julia での実装例を示しており、どれもかなり洗練されているように見えます。

私は 2 つの異なる実装 (以下を参照) を考え出しましたが、どちらも慣用的ではないというしつこい感じがあります。

私の質問は、慣用的な Clojure の実装はどのようなものでしょうか?

主にプロトコルに基づく最初の実装:

2 番目の実装は、主に multimethods に基づいており、最初の実装よりも詳細です。

0 投票する
1 に答える
1544 参照

julia - Julia はマルチメソッドをどのように実装していますか?

http://c2.com/cgi/wiki?ImplementingMultipleDispatchから少し読んでいます

Julia がマルチメソッドを実装する方法についてのリファレンスを見つけるのに苦労しています。ディスパッチの実行時の複雑さはどのくらいで、どのように達成するのですか?

0 投票する
4 に答える
1203 参照

functional-programming - Elixir がマルチメソッド / プロトコルを使用しないのはなぜですか?

ドキュメントの例を見てみましょう:

なぜ明示的に書く必要があるのEnum.mapですか? なぜきれいで短い表記を使用しないのmap [1, 2, 3, 4], squareですか?

Elixir には複数のディスパッチとプロトコルがありますが、それを少し奇妙に使用しているように思えます。

OOP のポリモーフィズムまたはマルチメソッド / マルチディスパッチ、FP のプロトコルを考慮する場合、ポイントはコードを短く簡潔にし、プログラマーのメモリを解放してメソッドがどこから来たのかを思い出さないようにすることです。

したがって、OOP では以下のコードのようになります。

FPマルチメソッドでは、次のようになります

どちらの場合も、コンパイラ/インタープリターは引数の型を使用して、どのmapメソッドを使用する必要があるかを判断します。

Elixir が同じアプローチを使用しないのはなぜですか? なぜ冗長なコードを書く必要があり、関数がどこから来たのかを決定する責任をプログラマーに負わせる必要があるのでしょうか?

のように、マルチメソッドを使用せずに明示的に指定することが理にかなっている場合がありますHttpServer.start(80)。しかしeachgetsetsizeなどの一般的なメソッドの場合は、どこから来たのかを明示的に指定しなくても、はるかに簡単に使用できるようです。

PS

ElixirのProtocolsで実際にそうすることができるようです。私は疑問に思っています - なぜそれは使われていないのですか?GitHub で見た Elixir プロジェクトのすべてのコードは、 のような長い冗長表記を使用していますModuleName.fnName。なぜそうなのかはわかりません。プロトコルの使用は、日常のタスクで使用するには難しすぎたり、複雑すぎたりしますか?

0 投票する
3 に答える
203 参照

prolog - オブジェクト指向プロローグでマルチメソッドを介して恒星オブジェクトを衝突させますか?

Prolog で統合と OO をどのように組み合わせるのだろうか。term オブジェクトにマルチメソッド ディスパッチを実装したいと思います。

用語オブジェクトと単純な用語がなければ、次のようにして、複数引数のインデックス作成から利益を得ることができます。

しかし、上記は正確なタイプの一致のみを提供します。

サブクラス タイプの一致が必要な場合はどうすればよいですか (excelsior、galaxy など、ケース 2、3、および 4 にも一致する必要がある宇宙船のサブクラスがさらに存在する可能性があります)。

統合とインデックス作成は引き続き使用できますか?

さよなら

PS: 例はここからのもので、Prolog ソリューションはありません:
https://en.wikipedia.org/wiki/Multiple_dispatch

0 投票する
1 に答える
85 参照

clojure - 入力検証は、Clojure のマルチメソッドの合理的なユースケースですか?

マルチメソッドに関する clojure.orgのドキュメントには、次のように記載されています。

Clojure multimethods ... can do validation of arguments and route to error-handling methods etc.

ただし、この目的でマルチメソッドを使用している例はあまり見当たりません。メソッド定義を 1 つだけ実装する必要がある状況でも、マルチメソッドを使用して入力検証を行う意味はありますか? 例えば:

これの利点はdivide、入力チェックまたはエラー処理のクリーンな最終実装を維持することです。検証、エラー処理、およびクリーンな構文を取得するためのより慣用的な方法はありますか?

0 投票する
1 に答える
582 参照

clojure - マルチメソッドを定義する Clojure とパラメーターの受け渡し方法

以下のコードがどのように機能するかを理解するのに苦労しているようです。より正確には、定義された関数が渡されたパラメーターを処理する方法

[x y] [(:role x) (:role y)]「遭遇」を定義するときに、なぜ 2 つのベクトル ( ) があるのですか。これは、関数がベクトル パラメーターを取ることを意味しますか? もしそうなら、なぜ私は次のように関数を呼び出さなければならないのですか?

(encounter {:role :manager} {:role :boss})

最初のハッシュマップを [xy] に渡し、2 番目を [(:role x) (:role y)]) に渡す上記の呼び出しではありませんか。xが値 :manager を取得し、 yが :boss の値を取得する方法を理解できません。

上記の例は、https ://yogthos.github.io/ClojureDistilled.html からのものです。

0 投票する
3 に答える
1898 参照

interface - Nim - メソッドを実装する一連のオブジェクトを作成する

ゲームをプログラミングしたいのですが、複数のエンティティに対してコンポーネント パターンを使用したいと考えています。

インターフェース/型クラス/多重継承のある言語では問題ありません。

一部のエンティティは更新可能でレンダリング可能ではなく、一部は両方である必要があります。


ハスケル:

更新できるもののリストを作成できます。

Java/D/... では、これはインターフェースを介して実装できます


今、これをnimでマルチメソッドでどのように実装できるか疑問に思っています。

適合するマルチメソッドの存在を型で表現できるか?



編集: コードを追加し、正しくない Haskell の例を修正しました

0 投票する
1 に答える
381 参照

java - タイプ別ディスパッチ用のClojureマルチメソッド

clojure で高速電力アルゴリズムを実装しました。

そして今、型ヒントと Java 相互運用性を試してみたいと思っています。クロージュアのこの「Java のもの」すべてをよりよく理解するために、これを行いたいと思います。一見簡単そうに見えて、実は難関がたくさん隠されています。だから、私は書いた:

もちろん、間違ったアリティの問題のため、コンパイルさえされていません。そこで、clojure でタイプ別にディスパッチする方法をググってみたら、multimethods. 実際、この時点で私は素朴で興奮していました。これまでに試したことはなかっmultimethodsたので、似たようなことを書きました:

事態は少し複雑になっています。それはうまくいきますが、タイプごとにオーバーロードするだけのような、よりクリーンな方法があるのだろうかと思います。Javaではできるのに、なぜclojureではできないのかわかりませんでした。

PS: もちろんjava.math.BigInteger、ネストされた関数の内部に基づいてロジックを「非表示」にして、それを外部の関数から呼び出すことfast-powができますが、実際には、それは私にとって興味深いことではありませんmultimethods。私が間違っているか、何かが足りない場合は、説明してください.. ;)