コンストラクタのサブタイプを使用して別のタイプの値t
を埋め込むタイプSup
を構築しました。GHCが欠落している型制約を無視するように強制します。
data Sup t = ...
| Sub t
deriving Eq
Sup
から省略部分がt
を使用いずれもコンストラクタの多くを、含まれているので、私はにしたいがEq (Sup t)
ではなく、手動でインスタンスを与えることを導き出します。
型制約Eq t
はSup t
ため(==)
のインスタンス上の場所になりました:
(==) :: Eq t => Sup t -> Sup t -> Bool
次のように述語isSub :: Sup t -> Bool
が定義されている:
isSub :: Sup t -> Bool
isSub (Sub _) = True
isSub _ = False
この述語の助けを借りて以下の演算子を定義したいと思います。
supEq :: Sup t -> Sup t -> Bool
supEq x y = not (isSub x) && not (isSub y) && x == y
タイプ制約Eq t
が存在しないため、上記の定義はGHCでは受け入れられません。しかし、怠惰な評価のおかげで、タイプt
の値の間の平等は決して実際には使用されないことがわかります。
GHCに欠落している型制約を無視させる方法はありますか? また、supEq
を使用してEq (Sup t)
の手動インスタンスを与えることなく、冗長タイプの制約を伝播することなく、supEq
という定義を得るために、Sup
またはsupEq
を定義する方法があります。
この構造にはどのようなユースケースがありますか? – bheklilr
'supEq'は、' supAq'(Sub 1)(Sub 1)≡False'のように、 'Sup a'という形式の2つの値が常に不等であると判断しますか?この問題を明確に述べるのに役立つかもしれません。 – leftaroundabout
私はData.Data.toConstr(https://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Data.htmlを参照)を使用して、使用されたコンストラクタの表現を取得してビルドすることができると思いますそこから。 [同様の質問への私の以前の回答](http://stackoverflow.com/questions/2628104/pattern-matching-of-algebraic-type-data-constructors)/ 2630312#2630312 – yatima2975