2013-01-21 1 views
4

Scrap Your Boilerplate package에는 Data.Generics.Aliases에는 단항 및 2 진 유형 생성자에 대한 유형 확장을 허용하는 함수가 있습니다. 특히, ext1ext2에 대한 정의가 있습니다.3 차 유형 생성자 (ext3)의 유형 확장을위한 SYB 함수를 정의하는 방법은 무엇입니까?

이제 ext1ext2dataCast1의 관점에서 정의

dataCast2Data 형 클래스의 일부이며, 보통 DeriveDataTypeable 기계에 의해 정의 된. 하지만 dataCast3이 없으므로 ext3을 정의하는 쉬운 방법은 없습니다.

ext3을 정의 할 수 있습니까? 그렇다면 어떻게해야합니까?

+0

또한주의 ([gcast1 (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Typeable.html#v:gcast1) 및 [gcast2 즉 http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Typeable.html#v:gcast2)가 존재하지만 그 이상은 아닙니다. –

+0

@Tinctorius 네,'gcast3'을 정의하기는 쉽지만,'gcast3'의 관점에서'ext3'을 정의하기 위해서는'Data' 인스턴스 밖에는 타입 정보가 충분하지 않다고 생각합니다. – scvalex

답변

1

나는 이것이 충분하지 않다는 것을 확신한다. 그러나 그것은 가까운 친밀감을 느낀다.

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)) [] 
+0

충분히 가깝습니다. – scvalex

관련 문제