【发布时间】:2014-03-06 02:05:33
【问题描述】:
考虑以下类型来表示树:
data Tree a = Empty
| Leaf a
| Fork (Tree a) (Tree a)
我需要帮助定义函数removeRandom' :: Tree a -> IO (Tree a),它接收至少有一个叶子的树并返回从树中删除随机叶子的结果(用 Empty 替换它)。练习有一个建议:使用函数randomRIO :: Random a => (a,a) -> IO a生成要移除的元素的顺序
编辑:尝试用户 Thomas 的方法 2
removeRandom' :: Tree a -> IO (Tree a)
removeRandom' t = let lengthTree = numbelems t
in do x <- randomRIO (0,lengthTree -1)
return (remove x t)
numbelems :: Tree a -> Int
numbelems Empty = 0
numbelems Leaf x = 1
numbelems Fork l r = (numbelems l) + (numbelems r)
remove :: Int -> Tree a -> Tree a
remove _ (Leaf x) = Empty
remove n (Fork l r) = let lengthLeft = numbelems l
in if (n>lengthLeft) then Fork l (remove (n-lengthLeft r)
else Fork (remove n l) r
【问题讨论】:
标签: list haskell build io tree