module NestedLists where data NestedList a = Nest [NestedList a] | Item a deriving Show nestedList = Nest [ Item 1 , Item 2 , Nest [ Item 3 , Nest [ Item 4 , Item 5 ] , Item 6 ] ] instance Functor NestedList where fmap f (Item x) = Item (f x) fmap f (Nest nest) = Nest ((fmap . fmap) f nest) main = do print $ fmap (*2) nestedList