import "Prelude" import "Lazy" data Node = Node { name :: String, children :: Lazy <> [Node] } root = genNode "" where genNode name = do print "genNode \(name)" Node { name, children = lazy [genNode (name + "A"), genNode (name + "B")] } nameOf Node { name } = name childrenOf Node { children } = force children main = for (childrenOf root) $ \c -> for (childrenOf c) $ \c2 -> print "visit \(nameOf c2)" -- genNode genNode A genNode B genNode AA genNode AB visit AA visit AB genNode BA genNode BB visit BA visit BB ()