【发布时间】:2011-10-20 14:38:00
【问题描述】:
我已经收到了这个 sn-p 代码,应该解释它是非终止的,并提出一个可能的修复方案。
randomW = do randomvalues <- sequence (repeat (randomIO :: IO Float))
print (take 10 randomvalues)
修复的条件是不断生成一个无限列表,以便我们可以使用 take 函数。
我认为问题源于序列函数的不那么懒惰的性质,它试图到达repeat (randomIO :: IO Float)生成的列表的末尾,导致不终止。
我也不确定在 randomIO 上是否可以使用重复功能。
test = do random <- repeat (randomIO :: IO Float)
print random
这会产生类型错误。 Print 似乎无法处理 IO Float,这似乎表明您可以在类型 IO Float 上使用 repeat。
【问题讨论】:
-
第二个代码sn-p的问题是
repeat randomIO的类型是[IO Float]。在做repeat randomIO >>= \random -> ...时,你实际上是在 list monad 中。
标签: haskell random io functional-programming