Data.MapにはdataCast2
が定義されています。 dataCast1
のデフォルトはconst Nothing
です。 dataCast2
は、容易にgcast2
と定義される。参考Data.Data - arity 2型コンストラクタのdataCast1を生成する(部分的に特殊化)
:手元
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
を与え、そしてMap
、たとえば(定義された、又はされdataCast2
ためアリティ2種類のコンストラクタを与え(,)
)、この型のコンストラクタの部分的な特殊化のために、一度に1つの特定のコンストラクタに対して、または一般的に、正しいことを行うdataCast1
のバージョンを書くことは可能ですか?
直感的には、良い解決策があるはずですが、私の最初のいくつかの試みはクラッシュして焼き付けられました。
これは興味深い問題のように見えますが、もう少し背景が必要だと思います。まず、質問。 「この型のコンストラクタの部分的なアプリケーションに適切なことをしている」ということは、正確にはどういう意味ですか?タイプコンストラクタは、クラス宣言またはインスタンス宣言の先頭に部分的に適用されているように見えますが、AFAIKが完全に適用されている必要がある場所であればどこでもかまいません。 –
@Sean良い点。私はそれを「部分的専門化」と読み替えました。 '未知(c(多分a))'の結果で 'dataCast1'を呼び出すのと同じ方法で、'おそらく(c(Int、a)) 'の結果を持つ' myDataCast1'を呼び出すことができます。 – sclv