在Haskell中,我想生成Int
的随机列表,并在整个程序中使用它。我当前的解决方案导致每次访问/使用它时都会随机创建数组。
我该如何克服这个问题?
答案 0 :(得分:2)
这是一个简单的例子(@luqui提到)你应该能够概括你的需要:
module Main where
import Control.Monad (replicateM)
import System.Random (randomRIO)
main :: IO ()
main = do
randomList <- randomInts 10 (1,6)
print randomList
let s = myFunUsingRandomList randomList
print s
myFunUsingRandomList :: [Int] -> Int
myFunUsingRandomList list = sum list
randomInts :: Int -> (Int,Int) -> IO [Int]
randomInts len bounds = replicateM len $ randomRIO bounds
randomInts
是一个IO
- 动作会生成随机的整数列表,您可以在main
{{1}的第一行中看到它的使用}}-块。一旦使用它,列表将保持不变。do
是一个非常简单的例子(只是总结它),以纯粹的方式使用这样的列表 - 实际上它只需要一个整数列表,我恰好用{{{}的随机列表来调用它。 1}} 答案 1 :(得分:0)
关注此example。然后,将rs
从main
传递给任何需要它的函数。
如果不使用像unsafePerformIO
这样的东西,你就不能有这个全局变量,正如名称所示,不应该使用IO
。原因是选择随机数是一种固有的非确定性操作,取决于外部select SUM(number) from(
select case when(aa.number>(select SUM(bb.number)
from bb where bb.sharedid=aa.id))then aa.number else 0 end as number from aa )abc
状态。