[Haskell-cafe] creating tree with level subnodes and incrementing
number?
Chris Kuklewicz
haskell at list.mightyreason.com
Tue Aug 8 08:57:25 EDT 2006
> Is there a better way to do this?
> This problem is similar to adding numbers to each tree item
>
> Marc
Yes. The feature you wanted is "replicateM".
The point of a State monad is you probably never have to touch the State data
constructor:
> module Main where
>
> import Control.Monad.State
> import Data.Tree
>
> type Supply = State Int
> unique :: Supply Int
> unique = do
> value <- get
> put (succ value)
> return value
>
> createTree :: Int -> Supply (Tree Int)
> createTree 4 = do
> me <- unique
> return (Node me [])
> createTree level = do
> me <- unique
> children <- replicateM level (createTree (succ level))
> return (Node me children)
>
> main = do
> putStrLn $ drawTree $ fmap show $ evalState (createTree 2) 0
Or even more tersely:
> import Control.Monad
>
> createTree :: Int -> Supply (Tree Int)
> createTree 4 = liftM (`Node` []) unique
> createTree level = liftM2 Node unique (replicateM level (createTree (succ level)))
More information about the Haskell-Cafe
mailing list