我想在Haskell中生成一个随机数列表。
Step 1 : declare an empty Int List
Step 2 : Generate a random number between 1 to 50
Step 3 : Add that number at the end of the List.
Step 4 : Repeat Step 2 and 3 for 5 times.
我使用Array编写了代码。
import System.Random
import Data.Array.IO
main = do
arr <- newArray (1,5) 0 :: IO (IOArray Int Int)
forM_ [1..5] (\i -> do
v <- getStdRandom(randomR (1,50))
writeArray arr i v)
forM_ [1..5] (\i -> do
a <- readArray arr i
print (a))
示例输出如下: -
Prelude> main
32
14
27
23
33
如何使用List实现此目的。可能正在使用MVar或TVar List。提前致谢。
答案 0 :(得分:5)
步骤1:声明一个空的
Int
列表...
不要那样做。创建一个空的东西,然后填补它很少是一个好主意。有时,出于性能原因,创建一个未初始化的数组(不是空的,但是“空的”)然后在事实之后定义内容可能很聪明 - 这基本上就是代码中发生的事情。同样合理:从一个空的Set
开始并逐步填满它;这可以在纯粹的功能状态monad中很好地完成。
但对于列表(或数组),从空开始永远不会获得任何东西;为什么不立即正确定义完整的结果列表?就这么简单:
do
...
randList <- forM [1 .. lLength] $ \_i -> randomRIO (1,50)
...
请注意,这不是forM_
而是forM
,它会自动收集列表中的结果 - 正是您想要的!我实际上并不需要index参数(因此_
变量的i
前缀。我也可以写mapM (const $ randomRIO (1,50)) [1 .. lLength]
,或者简称replicateM lLength $ randomRIO (1,50)
,如user3237465评论。