import Data.List data Tree a = Node a [Tree a] deriving Show a :: Tree Double a = Node 1 [a] flatten_a (Node x (n:_)) = x : flatten_a n scan f a (Node x ns) = Node a' $ map (scan f a') ns where a' = f a x main = print $ foldl' (+) 0 $ take 18000000 $ flatten_a $ scan (+) 0 a