import Control.Monad.State.Strict data Node = Node [Node] deriving Show mknode :: Int -> State Int Node mknode 1 = do modify (1+) return $ Node [] mknode (k+1) = do modify (1+) p1 <- mknode k p2 <- mknode k return $ Node [p1, p2] main = print $ runState (mknode 10) 0