したがって、Data.Map はdataCast2
定義されています。これは、アリティ 2 型のコンストラクターを持っているため、理にかなっています。dataCast1
デフォルトはconst Nothing
です。dataCast2
として簡単に定義されgcast2
ます。
参考のため:
class Typeable a => Data a where
dataCast1 :: Typeable1 t => (forall d. Data d => c (t d)) -> Maybe (c a)
dataCast2 :: Typeable2 t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a)
...
gcast1 :: (Typeable1 t, Typeable1 t') => c (t a) -> Maybe (c (t' a))
gcast2 :: (Typeable2 t, Typeable2 t') => c (t a b) -> Maybe (c (t' a b))
Data.Data
当面の問題は、次のとおりです。 、Data.Typeable
などのすべてが与えられ、アリティ 2 型のコンストラクタdataCast2
が定義されている場合 (たとえば、Map
、または)、部分的な特殊化に対して正しいことを行う(,)
バージョンを作成することは可能ですか?dataCast1
一度に 1 つの特定のコンストラクターに対して、または一般的に、この型コンストラクターの
直観的には、良い解決策があるはずだと思いますが、最初の数回はクラッシュして燃えました。