問題タブ [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.
haskell - Haskell の `head` が空のリストでクラッシュするのはなぜですか (または、空のリストを返さないのはなぜですか)? (言語哲学)
他の潜在的な貢献者への注意: 抽象的な表記法や数学的な表記法を使用して主張を主張することを躊躇しないでください。あなたの答えが不明な場合は、説明を求めますが、それ以外の場合は、快適な方法で自由に表現してください.
明確にするために:私は「安全な」を探しているわけではなく、特に例外的に意味のあるhead
選択でもありません。head
質問の本質は、コンテキストを提供するのに役立つhead
との議論に続きます。head'
私は数か月前から Haskell をハッキングしてきました (Haskell が私のメイン言語になるまで) が、より高度な概念や言語の哲学の詳細について十分な情報を得ていないことは確かです (ただし、私は学びたいと思っています)。私の質問は、哲学の 1 つであるため、あまり技術的なものではありません (そうであり、私がそれに気付いていない場合を除きます)。
この例では、 について話していhead
ます。
ご存知かと思いますが、
これは から続きますhead :: [a] -> a
。けっこうだ。明らかに、(手を振って) no 型の要素を返すことはできません。しかし同時に、定義するのは簡単です (自明ではないにしても)。
これについては、特定のステートメントのコメント セクションで少し議論されているのを見ました。特に、あるアレックス・スタングルは次のように述べています。
「すべてを「安全」にせず、前提条件に違反した場合に例外をスローする正当な理由があります。」
私は必ずしもこの主張に疑問を抱くわけではありませんが、これらの「正当な理由」が何であるかについては興味があります.
さらに、ポール・ジョンソンは次のように述べています。
たとえば、「safeHead :: [a] -> Maybe a」を定義できますが、空のリストを処理したり、それが起こり得ないことを証明したりする代わりに、「Nothing」を処理するか、それが起こり得ないことを証明する必要があります.'
そのコメントから私が読んだトーンは、これが難易度/複雑さ/何かの顕著な増加であることを示唆していますが、彼がそこに何を出しているのか理解できません.
あるスティーブン・プルジナは、(2011年も同様に)次のように述べています。
「たとえば、「head」がクラッシュプルーフにならないのには、もっと深い理由があります。ポリモーフィックでありながら空のリストを処理するには、「head」は常に、特定の空のリストに存在しない型の変数を返さなければなりません。 Haskell がそれを行うことができれば Delphic...".
空のリストの処理を許可すると、ポリモーフィズムが失われますか? もしそうなら、どのように、そしてなぜですか?これを明らかにする特定のケースはありますか?このセクションは、@Russell O'Connor によって十分に回答されています。もちろん、それ以上の考えは大歓迎です。
明確さと提案が示すように、これを編集します。あなたが提供できる考え、論文などは、非常に高く評価されます。
haskell - where句に型注釈
別のタイプをフィードするとData.Enumerator.List.map
互換Iteratee
性のあるものと同様の関数を作成しました。Enumerator
Stream
import Data.Enumerator
の型署名を省略した場合go
、これは問題なく機能します。しかし、それを含めたいのですが、正しい署名がどうあるべきかを判断できません。これが私がそうあるべきだと思うものです:
go :: Monad m => Step ai m b -> Iteratee ao m b
しかし、それは機能しません。
の正しい型アノテーションを見つけるためのアドバイスが必要ですgo
。
f# - List.max<'T> はどのように機能しますか?
MSDN ドキュメントからの署名List.max
は次のとおりです。
私の質問は次のとおりです。
'T
コンパイラは比較操作をサポートしていることをどのように静的に検証しますか?requires
型制約を指定するキーワードですか? はいの場合、どのタイプの制約を指定できますか?- Scala の型クラスでできるように、独自の種類の制約を定義できますか?
c++ - C ++のパラメトリックおよび包含ポリモーフィズムとは
アドレスhttps://cs.senecac.on.ca/~chris.szalwinski/archives/btp200.082/content/adhoc.htmlでいくつかの C++ テキストを読んでいます。
セクションUNIVERSAL POLYMORPHISM
で、著者はParametric
およびInclusion
ポリモーフィズムについて言及しました。特に、Parametric
ポリモーフィズムが実行時に実装されているのに、コンパイル時に実装されるのはなぜInclusion
ですか?
誰かが私に明確な説明や例を教えてもらえますか?
c++ - C++を使用してジェネリック型を作成する-共有実装のテンプレート
例として、リンクリストのような単純なデータ構造を考えてみましょう。Cでは、次のようになります。
同じ構造体と関数が欲しいのですが、data
フィールドの型を宣言することで型チェックを改善します。これは常に何かへのポインタになります。使用例:
しかし、通常のテンプレートのように、すべてのタイプのポインターの実装を生成したくありません。言い換えれば、Java、ML、およびその他の言語の汎用型またはパラメトリック型のようなものが必要です。テストとして以下のコードを試しました。型指定されていないCのような部分は、最終的には実装ファイルに入れられますが、テンプレートと関数の宣言はヘッダーファイルに入れられます。それらが最適化され、タイプチェックされることを除いて、Cバージョンとほぼ同じマシンコードが残されると思います。
しかし、私はC ++が得意ではありません...これを改善する方法、またはより慣用的なC ++、おそらくテンプレートの特殊化を使用する方法はありますか?
go - Go にパラメトリック ポリモーフィズムがないことを回避するにはどうすればよいですか?
私は Go の初心者ですが、Go の常連はパラメトリック ポリモーフィズムを見逃していないことを読みました。新しい言語を学ぼうとするたびに、L99 の問題リストを使って練習します。
最初の問題 (Go では、スライスの最後の要素を取得する単一のステートメントになります) と同じくらい些細なことを書こうとしても、これを任意の型のスライスを取得する関数としてどのように記述し、(を使用して)上記で参照したその単一のステートメント) は、そのスライスの最後の要素を返しますか?
この言語にはパラメトリック ポリモーフィズムがありませんが、Go の常連がパラメトリック ポリモーフィズムを見逃していないと主張するには、これを行う慣用的な「Go」の方法が必要であると考えました。それ以外の場合、たとえばリストの最後の要素よりも例が複雑な場合は、すべてのタイプに対してタスクを実行する関数が必要になります。
私は何が欠けていますか?
java - パラメトリック多型闘争
割り当てのバッグとリストを実装することに加えて、次のステップは順序付けられたバージョンを作成することです。要件は、正しい型パラメーターと制約を使用してパラメトリックインターフェイスOrderedCollectionを指定することです。私の問題はそれを実装することです。
インターフェイスCollection <E>
が存在し、次のように定義されます
それはクラスによって実装されます
構造が機能していて、ソートされたバージョンを実装しようとしています。これを行い、要件の一部を満たすために、私は次のように作成OrderedCollection
しました
ですでに定義されているメソッドを拡張しておりCollection
、必要な新しい機能はcompareTo()
メソッドだけだからです。
しかし、OrderedList
宣言で実装しようとすると
エラーが発生しました
エラーメッセージを理解しているので、インターフェイス宣言で指定されたものの有効な代替となるパラメータタイプを指定する必要があります。しかし、私は試しました
はdeclarerを実装しますが、extendsに構文エラーが存在するという警告が表示されます。
ここで要件を満たすにはどうすればよいですか?
haskell - 順序付けられていないコンテナーの Data.Foldable
私はデータベース操作のための Haskell-meets-SQL 言語に取り組んでおり、それと一緒に使用する共通の型クラス ライブラリに取り組んでおり、Hackage から意味のあるところはすべて取り入れています。
データベース クエリ オプティマイザーの重要な目的は不要な並べ替えをなくすことであるため、並べ替えが実際に必要な場所の静的な表現を保持することが重要です。これにより、折り畳みの型クラスを定義することができます。
Haskell's Data.Foldable
has: (私が作成しているポイントに関係のないデフォルトの定義を省略しています)
このクラスは、ほとんどの Haskell アプリケーションにとって実用上はそれほど重要ではなく、データベースの設定ではより重要な違いを無視しているように思えます。つまり、すべてのData.Foldable
インスタンスには順序があります。
要素に順序付けを課さないコンテナ型に適用されるこの概念の一般化の名前は何ですか?
Haskellの場合、実装に必要なコンテキストData.Set
があるため、問題なく機能します。Ord
ただし、順序付けの要件は実装のアーティファクトであり、多くの有用な型では、使用されている順序付けがドメイン レベルの意味を持たない場合があります。
より一般的なセットの場合fold :: Monoid m => t m -> m
、それ自体の定義はほとんど正しいです (そうですfoldMap
)。私が言う主な理由は、その型には ( の定義によるMonoid
) 結合法則が含まれているが、必要な交換法則は含まれていないためです。他の亜種は存在しません。
必要のないところには導入したくありません。また、追跡できない非決定論を導入したくありません。toList :: Set a -> [a]
次の二分法を導入するため、関数がどこにも転がっていない言語とライブラリを構築することに興味があります。
- セット/リレーションが物理的にどのように格納されているかについて、人々が実装の詳細を観察できるようにする
- 効果としての非決定論を見失う
明らかにsortBy :: (a -> a -> Ordering) -> Set a -> [a]
との両方shuffle :: Set a -> Data.Random.RVar [a]
が有用であり、異論の余地がなく、含まれます。実際、sortBy
は としてさらに一般的な型を持っていsortBy :: (TheUnorderedFoldableClassIAmTryingToName f) => (a -> a -> Ordering) -> f a -> [a]
ます。
このアイデアは何と呼ばれていますか?基地から離れている場合、基地のパスをどこに残したのですか?
haskell - ランク3(またはそれ以上)の多型のユースケース?
ランク2のポリモーフィズム(最も顕著な例はSTモナド)のユースケースをいくつか見てきましたが、それより高いランクのユースケースはありません。誰かがそのようなユースケースを知っていますか?
types - ソート パラメトリック ラッパー関数
Int、Bool、S1、S2 など、いくつかの組み込みおよびユーザー定義の Z3 ソートの使用を想定すると、ソート A からBを並べ替えて戻る?例えば
私は現在、各ケースを手動でカバーしています。
このようなラッパーは、特定の種類のセットから自動的に作成できますが、可能性のある一般的なソリューションをお勧めします。