Doesn't mapBanana work if you give it this signature: mapBanana :: (Something -> Something) -> Banana -> Banana mapBanana f (Banana b) = Banana (f b) Possibly you are wanting a polymorphic Banana? newtype Banana a = Banana a mapBanana :: (a -> b) -> Banana a -> Banana b mapBanana f (Banana x) = Banana (f x)