module Exercises where -- 1 data Constant a b = Constant b deriving (Show) instance Foldable (Constant a) where foldr f acc (Constant x) = f x acc -- 2 data Two a b = Two a b deriving (Show) instance Foldable (Two a) where foldr f acc (Two _ x) = f x acc -- 3 data Three a b c = Three a b c deriving (Show) instance Foldable (Three a b) where foldr f acc (Three _ _ x) = f x acc -- 4 data Three' a b = Three' a b b deriving (Show) instance Foldable (Three' a) where foldr f acc (Three' _ x y) = f y $ f x acc -- 5 data Four' a b = Four' a b b b deriving (Show) instance Foldable (Four' a) where foldr f acc (Four' _ x y z) = f z $ f y $ f x acc filterF :: ( Applicative f , Foldable t , Monoid (f a)) => (a -> Bool) -> t a -> f a filterF f x = foldMap y x where y k = if f k then pure k else mempty