SOE ex.9.5


applyAll :: [ a -> a ] -> a -> a
applyAll = flip (foldr id)

applyAll' :: [ a -> a ] -> a -> a
applyAll' []     x = x
applyAll' (f:fs) x = f (applyAll' fs x)


----- test -----
main = do
  putStrLn $ show $ applyAll  [simple 2 2, (+3)] 5
  putStrLn $ show $ applyAll' [simple 2 2, (+3)] 5

{-
   applyAll fs x = foldr g x fs
   g f x = f x  ====>  g == id
   so,
   applyAll fs x = foldr id x fs
                 = (flip (foldr id)) fs x
   so,
   applyAll = flip (foldr id)  -- eta reduction
-}

simple :: Int -> Int -> Int -> Int
simple x y z = x * (y+z)

Leave a Reply