データ宣言[src]、[src ] に型クラス制約を設定するのは明らかに悪い考えです。
個人的には、作成したデータ型内で型を制約したいという欲求に出くわしたことはありませんが、言語設計者が「許可するのは悪い考えだと判断した」理由は明らかではありません。何故ですか?
データ宣言[src]、[src ] に型クラス制約を設定するのは明らかに悪い考えです。
個人的には、作成したデータ型内で型を制約したいという欲求に出くわしたことはありませんが、言語設計者が「許可するのは悪い考えだと判断した」理由は明らかではありません。何故ですか?
個人的には、作成したデータ型内の型を制約したいという欲求に出くわしたことはありませんが、言語設計者が「許可するのは悪い考えだと判断した」理由は明らかではありません。何故ですか?
それは誤解を招き、実際に役立つものから完全に逆方向に機能したためです。
特に、おそらく期待している方法で、データ型内の型を実際に制約しませんでした。それが行ったことは、データ コンストラクター自体にクラス制約を設定することでした。これは、値を構築するときにインスタンスを満たす必要があることを意味していましたが、それだけでした。
したがって、たとえば、単純にOrd
制約付きの二分探索木を定義してから、どの木にもソート可能な要素があることを知ることはできません。検索機能と挿入機能には、Ord
それ自体に制約が必要です。防止するのは、順序付けられていない型の値を「含む」空のツリーを構築することだけです。パターン マッチングに関する限り、含まれる型に対する制約はまったくありませんでした。
一方、Haskell に取り組んでいる人々は、賢明なバージョン (データ型のコンテキストが提供されていると想定する傾向がある) が悪い考えだとはまったく考えていませんでした! 実際、 GADT 構文(言語プラグマを使用して GHC で有効になっている一般化された代数データ型) で宣言されたデータ型に対するクラス制約は、明らかな方法で機能します。値を構築GADTs
するには制約が必要であり、問題のインスタンスも必要です。 GADT に格納されるため、値を操作するための制約は必要ありません。また、GADT コンストラクターでのパターン マッチングにより、キャプチャーされたインスタンスを使用できます。
データ型に型クラス制約を追加することは、実際には悪い考えではありません。非常に便利で、他のコードを壊すことはありません。
悪い点は、多くの場合、データ型を使用する関数に制約を課すことを許すためにデータ型を使用できると人々が期待しているという事実にありますが、そうではありません。(暗黙の制約が問題を引き起こす可能性があると主張することができます。)
データ型に制約を置くと、実際には、制約された型に言及しているすべてのコンストラクターに制約がかかります。通常の制約付き関数と同様に、コンストラクタを使用する場合は制約を追加する必要があります。それが健全で、上等だと思います。
特定のことができない限り、データ型にデータを入れることができないことを保証します。その便利。それを使用してプログラミングの失敗を作成することはありません。それは悪い習慣ではありません。彼らが望んでいたほど素敵ではありません。
「許可するのが悪い考え」は、おそらく、GADT が本当に彼らが望んでいるものだからです。
GADT が最初に存在していた場合、このようなことはしなかったでしょう。
両方を持っていることは悪いことではないと思います。状態操作関数が必要な場合は、永続的に明示的なパラメーターを渡すか、モナドを使用して暗黙的にすることができます。データに制約が必要な場合は、データ宣言で永続的に明示的な制約を使用するか、GADT で暗黙的な制約を使用できます。GADT とモナドはより洗練されていますが、明示的なパラメーターやデータ型の制約が間違っているわけではありません。