【发布时间】:2018-04-01 10:31:58
【问题描述】:
我有这个工作程序:
import Control.Monad.Random
data Tree = Node Tree Tree Tree Tree
| Leaf Bool
deriving (Show)
randomTree' :: (RandomGen a) => Int -> Rand a Tree
randomTree' 0 = do
r <- getRandom
return $ Leaf r
randomTree' depth = do
let d = depth-1
a <- randomTree' d
b <- randomTree' d
c <- randomTree' d
d <- randomTree' d
r <- getRandom
if r
then return $ Node a b c d
else randomTree' 0
randomTree1 :: Int -> Tree
randomTree1 seed = evalRand (randomTree' 4) (mkStdGen seed)
main = print $ randomTree1 1
但我不完全理解为什么这个其他版本会失败并填满我所有的 RAM(带有 thunk ?):
randomTree'' :: (RandomGen a) => Int -> Rand a Tree
randomTree'' depth = do
let d = depth-1
a <- randomTree'' d
b <- randomTree'' d
c <- randomTree'' d
d <- randomTree'' d
r1 <- getRandom
r2 <- getRandom
if depth > 0 && r1
then return $ Node a b c d
else return $ Leaf r2
由于懒惰,a b c 和 d 不应该只在需要时才评估吗?
谢谢!
【问题讨论】:
-
如果您对不同的变量使用相同的名称,则有问题...
-
我会将递归调用移到
then分支下,以便您只在需要时进行调用。
标签: haskell monads lazy-evaluation