在Scrap Your Boilerplate package中,在Data.Generics.Aliases
中,有一些函数允许一元和二进制类型构造函数的类型扩展。特别是,ext1
和ext2
有定义。
现在,ext1
和ext2
是根据dataCast1
和dataCast2
定义的,它们是Data
类型类的一部分,通常是由DeriveDataTypeable
机制定义。但是,没有dataCast3
,所以我看不到定义ext3
的简单方法。
是否可以定义ext3
,如果可以,如何定义?
答案 0 :(得分: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)) []