> 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)


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to