
Thanks for your help.
Are there other ways to implement a counter in Haskell?
Using a State monad?
If I use your example on : test = let Node x l = enumeratedTree ( Node 'a' [undefined, Node 'b' []]) in tail l GHCI answers [Node (*** Exception: Prelude.undefined A monadic counter imposes an order of evaluation. In my program, I don't care about the order of the numbers. I only want them to be all different. I think a monad is too restrictive for what I need.
From some of my code:
let enumeratedTree = (`evalState` (0::Int)) $ (`mapTreeM` t) $ \x -> do n <- next return (n, x) next = do a <- get; put $! succ a; return a
where
mapTreeM :: Monad m => (a -> m b) -> Tree a -> m (Tree b) mapTreeM f (Node a ts) = do b <- f a ts' <- mapM (mapTreeM f) ts return (Node b ts')
(which could also be an instance of a popular non-standard FunctorM class)
Best regards Tomasz