Name: Anonymous 2008-09-16 15:04
-- create a random tree.
randomTree :: Random r => IO (BinaryTree r)
randomTree =
-- randomly pick the left and right sides.
do leftIO <- pick(randomLeaf, randomBranch)
rightIO <- pick(randomLeaf, randomBranch)
-- "un-IO" the sides.
left <- leftIO
right <- rightIO
-- get a random value for the top of the branch/tree.
value <- randomIO
-- create branch and return.
return (Branch left value right)
where
-- return left or right at random.
pick (left, right) =
do useLeft <- randomRIO(True, False)
if useLeft then return left else return right
-- create a random leaf.
randomLeaf =
do value <- randomIO
let leaf = Leaf value
return leaf
-- setup an alias.
randomBranch = randomTreeThis code actually works fine, but I'm wondering if there's a way to simplify the "leftIO/rightIO" stuff. Is there some sort of "double arrow" that will un-Monad twice, or is this verbosity unavoidable?