問題タブ [parametric-polymorphism]

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 投票する
3 に答える
1875 参照

haskell - タイプ数量詞とは何ですか?

多くの静的に型付けされた言語には、パラメトリック多態性があります。たとえば、C#では次のように定義できます。

通話サイトでは、次のことができます。

これらのタイプは、次のように記述されることもあります。

「forallはタイプレベルでのラムダ抽象化のようなものです」と人々が言うのを聞いたことがあります。したがって、Fooは、型(たとえば、int)を取り、値(たとえば、型int-> intの関数)を生成する関数です。Foo(3)多くの言語は型パラメーターを推測するため、の代わりに書くことができますFoo<int>(3)

fタイプが。のオブジェクトがあるとしますforall T. T -> T。このオブジェクトでできることは、最初に。Qを記述して型を渡すことf<Q>です。次に、タイプが。の値を取得しますQ -> Q。ただし、特定fのは無効です。たとえばこれf

したがって、「呼び出す」f<int>とタイプが返さint -> intれ、一般に「呼び出す」f<Q>とタイプが返されるQ -> Qので、これは良いことです。ただし、これは、渡すタイプによって異なる動作をするためf、タイプの有効なものではないと一般的に理解されています。forallの考え方は、これは明示的に許可されていないということです。また、forallがタイプレベルのラムダである場合、何が存在しますか?(すなわち、存在記号)。これらの理由から、forallとexistsは実際には「型レベルのラムダ」ではないようです。しかし、それでは彼らは何ですか?この質問はかなり曖昧だと思いますが、誰かが私のためにこれを解決できますか?forall T. T -> T


考えられる説明は次のとおりです。

ロジックを見ると、数量詞とラムダは2つの異なるものです。定量化された式の例は次のとおりです。

したがって、forallには2つの部分があります。1つは定量化するセット(整数など)、もう1つは述語(Pなど)です。Forallは、高階関数と見なすことができます。

タイプ付き:

存在は同じタイプです。Forallは無限接続詞のようなもので、S[n]は集合Sのn番目の要素です。

存在は無限の論理和のようなものです。

型を類推すると、∧の型類似は交差型∩を計算し、∨の型類似は共用体型∪を計算していると言えます。次に、forallを定義し、次のように型に存在します。

つまり、forallは無限の共通部分であり、存在するのは無限の和集合です。それらのタイプは次のようになります。

たとえば、多形恒等関数のタイプ。これTypesがすべての型のセットであり、->関数の型コンストラクターであり、=>ラムダ抽象化です。

現在、型のものforall T:Type. T -> Tであり、型から値への関数ではありません。これは、タイプがすべてのタイプT-> Tの共通部分である値であり、Tはすべてのタイプにまたがっています。このような値を使用する場合、タイプに適用する必要はありません。代わりに、サブタイプの判断を使用します。

idこれは、タイプがダウンキャストされますint -> intint -> int無限の交差点にも表示されるため、これは有効です。

これはうまくいくと思います。これは、forallとは何か、ラムダとの違いを明確に説明していますが、このモデルは、ML、F#、C#などの言語で見たものと互換性がありませんid<int>。 intsで恒等関数を取得します。これはこのモデルでは意味がありません。idは値の関数であり、値の関数を返す型の関数ではありません。


型理論の知識を持っている人は、正確に何があり、何が存在するのかを説明できますか?そして、「すべてが型レベルでラムダである」というのはどの程度真実ですか?

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

java - Java:抽象メソッドのポリモーフィックリターン型?

抽象Javaクラスに次のコードがあります。

これはうまくコンパイルされます。しかし、どこかで呼び出すと、コンパイラは次のように文句を言います。

複数のインターフェースを実装する必要があるものを返すために抽象メソッドを要求する方法はありますか?

注:いいえ、好きな2つを実装する特別なインターフェースを作成することはできません。GWTにはすでに上記のインターフェースを実装しているLabelのようなウィジェットがあり、私は上記のウィジェットを使用したいと思います。

編集:私はここからこれを行うというアイデアを得ました(22ページ):

http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

0 投票する
2 に答える
193 参照

c - ポリモーフィック関数をパラメーターとしてCの別の関数に渡す

私はこの問題に関してCでのみ働いています。

私は2つの関数プロトタイプを持っています:

int pkg_permserver(const char *service, const char *protocol, int backlog, void (*errlog) (char *msg))

int pkg_permserver_ip(const char *ipOrHostname, const char *service, const char *protocol, int backlog, void (*errlog)(char *msg))

および次のコードセグメント:

私はテストユニットを書いています。関数の各パラメーターについて、各ケース(有効/無効)をテストする必要があります。

上記の機能を変更することはできません。pkg_permserverとpkg_permserver_ipのパラメーターはまったく同じですが、pkg_permserver_ipにIpOrHostnameが追加されている点が異なります。

別の関数「test_permserver_ip」を作成する場合は、コピーしたくありません。test_permserverからパーツを貼り付けます(パラメーターが同じであるため)。

私が頭に浮かぶのは、int test_permserver(char * port、int which_function);のようなものです。

test_permserver_ipに同じコードをコピーすることは避けたい(test_permserverのものと同じパラメーターの場合)pkg_permserver_ipのテスト関数はまだ作成されていません。

これは、上記の2つの関数のコードです。

0 投票する
2 に答える
1241 参照

scala - どちらかの入力リストをフィルタリングするためのScalaポリモーフィック関数

よりエレガントなソリューションを求めて

私はこのコードを持っています。エラー処理を行う必要がないテストケースで使用します。それが何をするか:

  • 文字列の入力リストを取得します
  • DSJStteper.parseDSResultメソッドを使用してそれらを解析します
  • それらをフィルタリングし、それぞれから右の値を抽出します(左は例外です)

コードは次のとおりです。

今、私はそれほど多くのポリモーフィック関数を実行していませんが、これは機能します。でも少し醜い気がします。誰かが同じことを達成する方法について、より良い提案を持っていますか?

私はこれが個人的な好みの場合に帰着することを知っています。しかし、提案は大歓迎です。

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

inheritance - パラメトリックポリモーフィズムとサブタイプポリモーフィズムF#

これら2つのF#型シグネチャの違い(ある場合)は何ですか?

この場合、それらは同じことを意味しますか?

msdnは、(:>)タイプ制約について次のように述べています

これは、2つの署名が同じことを言っていることを示します。機能的には、それらはどのように異なりますか?

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

scala - Scalaでパラメトリックにクロージャを保持するデータ構造

私はScalaでGUIイベントシステムを実装しています。私は次のようなものを持っています:

次のように、イベントリスナークロージャを(マルチ)マップに保存したいと思います。

私の質問は、保存されたクロージャの関数シグネチャがEventObjectまたは任意のサブクラスになるようにこれを書き直す方法はありますか?次のようなもの:

リスナー関数を定義するときにサブタイプを認識できるようにするには、次のようにします。

0 投票する
2 に答える
1900 参照

c - Cプログラミング:void *-なぜパラメトリック多相ではないのですか?

void *を使用してCプログラミングでパラメトリックポリモーフィズムを実装できると言うのはなぜ正しくないのですか?

教授は質問を提起し、決して答えませんでした。ボイド*は実際にはパラメトリック多型と見なされる非常に低いレベルであると私は信じていますが、それにはもっと強い理由がありますか?

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

scala - 再帰的に制限された型パラメーター(F境界)を型メンバーに変換するScala

どのように変換しますか:

タイプメンバーに?

つまり、私は次のようなものが欲しいです:

しかし、名前Aはすでに型の改良に使用されているため、問題が発生しています。この質問は似ています(そしてそこから生まれます):型パラメーターの代わりに型メンバーによるF有界量化?

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

java - Java の高度なポリモーフィズム

私は大学で高度なプログラミングのクラスを持っていますが、このコードがどのように機能するかを理解するのに少し苦労しています。

このコードが "Collection<?>" を出力するのはなぜですか?

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

polymorphism - 緩い自然変換は、自然性のない単なる自然変換ですか?

定理の4ページに無料で!、Philip Wadlerは、パラメトリシティは緩い自然変換の観点から表現できると述べています。彼は、関数型プログラミング言語のパラメトリックポリモーフィック関数が、その自然性の証明のない自然変換であるという事実に言及していますか?緩い自然変換の適切な定義を見つけられなかったので、これはこれまでのところ私の考えです。