5

Scrap Your Boilerplateパッケージには、Data.Generics.Aliases単項およびバイナリ型コンストラクターの型拡張を可能にする関数があります。特に、との定義がext1ありext2ます。

さて、ext1ext2は型クラスの一部である、、dataCast1とで定義され、通常は機械によって定義されます。しかし、がないので、を定義する簡単な方法がわかりません。dataCast2DataDeriveDataTypeabledataCast3ext3

を定義することは可能ext3ですか?もしそうなら、どのように定義しますか?

4

1 に答える 1

0

これでは十分ではないと確信しています。しかし、それは非常に近いと感じます。

ext3 :: (Data a, Typeable3 t)
     => c a
     -> (forall d1 d2 d3. c (t d1 d2 d3))
     -> c a
ext3 def ext = maybe def (id) (gcast3' ext)

gcast3' :: (Typeable3 t, Data a) => c (t f g h) -> Maybe (c a)
gcast3' x = r
 where
  r = if typeOf3 (getArg x) == typeOf3' (getArg (fromJust r))
       then Just $ unsafeCoerce x
       else Nothing
  getArg :: c x -> x
  getArg = undefined
  typeOf3' z = mkTyConApp (typeRepTyCon (typeOf z)) []
于 2013-01-25T19:53:58.263 に答える