
Hi Ralf,
I'm looking for a function like extT but with more general type:
(t a -> s a) -> (t b -> s b) -> (t a -> s a)
Is there such a thing in the generics library?
Hi Frederik, Not sure how you are exactly going to use such an operation ... But here is its implementation anyhow. Thanks for the riddle. Ralf import Data.Generics -- Frederik's weird ext operation :-) ext' :: (Data (t a), Data (s a), Data (t b), Data (s b)) => (t a -> s a) -> (t b -> s b) -> (t a -> s a) ext' f g ta = case cast g of Just g' -> g' ta Nothing -> f ta -- A generic default f (Just x) = [x] f Nothing = [] -- A type-specific case g (Just True) = [True] g (Just False) = [] g Nothing = [] -- A composition using our new type-extension operator test :: Data a => Maybe a -> [a] test = ext' f g -- Let's see whether it works ... main = do print $ test (Just (1::Int)) print $ test (Just False)