SOE ex.9.7


twice :: (a -> a) -> a -> a
(twice f) x = f (f x)

twice' :: (a -> a) -> a -> a
twice' f = f . f

main = do
  putStrLn $ show $ (twice (+1)) 0
  putStrLn $ show $ (twice' (+1)) 0
  putStrLn $ show $ twice_twice (+1) $ 0
  putStrLn $ show $ twice_twice' (+1) $ 0
  putStrLn $ show $ twice_twice_twice (+1) $ 0
  putStrLn $ show $ twice_twice_twice' (+1) $ 0
  putStrLn $ show $ twice_twice_twice'' (+1) $ 0
  putStrLn $ show $ twice_twice_twice''' (+1) $ 0
  putStrLn $ show $ n_twice 3 (+1) $ 0
  putStrLn $ show $ n_twice 4 (+1) $ 0

twice_twice = twice twice
twice_twice' f = f . f . f . f

twice_twice_twice = twice twice twice
twice_twice_twice' = (twice twice) twice
twice_twice_twice'' = twice (twice twice)
twice_twice_twice''' f = f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f  -- 16 not 8 times!

n_twice n f = foldr (.) id $ take (2^(2^(n-1))) (repeat f)

Leave a Reply