Viewing:
module Instances where
data Identity a = Identity a
instance Foldable Identity where
foldr f z (Identity x) = f x z
foldl f z (Identity x) = f z x
foldMap f (Identity x) = f x
data Optional a = Nada | Yep a
instance Foldable Optional where
foldr _ z (Nada) = z
foldr f z (Yep x) = f x z
foldl _ z Nada = z
foldl f z (Yep x) = f z x
foldMap _ Nada = mempty
foldMap f (Yep x) = f x
-- library functions
-- 1.
sum' :: (Foldable t, Num a) => t a -> a
sum' xs = foldr (+) 0 xs
-- 2.
product' :: (Foldable t, Num a) => t a -> a
product' xs = foldr (*) 0 xs
-- 3.
elem' :: (Foldable t, Eq a) => a -> t a -> Bool
elem' a bs = foldr (\x acc -> acc || x == a) False bs