{-# OPTIONS_GHC -O2 -ddump-simpl-stats -fglasgow-exts #-} {- -dverbose-core2core -} module Main (main) where import qualified Data.Char as Char newtype CustomList a = CustomList {toList :: [a]} {-# INLINE meep #-} meep :: (a -> b) -> CustomList a -> CustomList b meep f = mup f {-# NOINLINE [0] mup #-} mup :: (a -> b) -> CustomList a -> CustomList b mup f (CustomList xs) = CustomList (map f xs) {-# RULES "mup/mup" forall f g xs. mup f (mup g xs) = mup (f . g) xs #-} main :: IO () main = putStrLn $ toList $ meep succ $ meep Char.toLower $ CustomList "Test Text"