Согласно этой статье способ реализации dataCast1 может быть либо
dataCast1 f = gcast1 f -- for unuary type constructors
или
dataCast1 f = Nothing -- for non-unary type constructors
Они не сказали, что это единственный способ реализовать это, но это может быть так. Возможно, стоит спросить авторов? Я думаю, что основная проблема в том, что мы не можем частично применять конструкторы типов. например следующее невозможно
data T a b = ...
instance Typeable a => Data (T Int) where
dataCast1 f = ...
GHC будет жаловаться, что T не был применен к достаточному количеству аргументов типа.
Хотя я могу подумать об обходном пути. Мы определяем новый тип
newtype PairInt a = PairInt (Int, a) deriving Typeable
instance (Typeable a, Data a) => Data (PairInt a) where
dataCast1 f = gcast1 f
Это довольно раздражает, но это делает работу. Но, возможно, это не соответствует тому, чего вы пытаетесь достичь.