{-# LANGUAGE DeriveFunctor #-} import Data.List data Tree a = Node a [Tree a] deriving (Functor, Show) a :: Tree Double a = Node 1 [a] flatten_a (Node x (n:_)) = x : flatten_a n scan f (Node r l) = Node r $ map (fmap (f r) . scan f) l main = print $ foldl' (+) 0 $ take 1800 $ flatten_a $ scan (+) a