import Data.List
data Tree a
= Node a
[Tree a
] deriving Show
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
aW1wb3J0IERhdGEuTGlzdAoKZGF0YSBUcmVlIGEgPSBOb2RlIGEgW1RyZWUgYV0gZGVyaXZpbmcgU2hvdwoKYSA6OiBUcmVlIERvdWJsZQphID0gTm9kZSAxIFthXQoKZmxhdHRlbl9hIChOb2RlIHggKG46XykpID0geCA6IGZsYXR0ZW5fYSBuCgpzY2FuIGYgYSAoTm9kZSB4IG5zKSA9IE5vZGUgYScgJCBtYXAgKHNjYW4gZiBhJykgbnMgd2hlcmUgYScgPSBmIGEgeAoKbWFpbiA9IHByaW50ICQgZm9sZGwnICgrKSAwICQgdGFrZSAxODAwMDAwMCAkIGZsYXR0ZW5fYSAkIHNjYW4gKCspIDAgYQ==