我想在一个范围内生成随机数,并且类型签名为Int -> Int
。我已经阅读了其他多篇文章,但是没有一篇文章建议返回类型Int
的方法。我在代码中使用了System.IO.Unsafe
,但不建议这样做。这是我的代码:
import System.IO.Unsafe
-- random number generator
rng :: Int -> Int
rng upper = unsafePerformIO $ randomRIO (0,upper-1)
有人对在Haskell范围内如何生成随机Int有任何建议吗?
编辑:可能无法更改IO Int -> Int
,所以我将代码转换为
-- random number generator
rng :: Int -> IO Int
rng upper = randomRIO (0,upper-1)
之所以需要rng是因为我想获取列表范围长度内的随机数,以获得列表元素的索引。
list !! rng (length list)
,但出现错误Couldn't match expected type ‘Int’ with actual type ‘IO Int’
。
我是Haskell的新手,我不知道如何操纵Monad。任何帮助表示赞赏。
[Haskell并非不使用IO
而不能生成随机数。
您的示例list !! rng (length list)
,不起作用,因为rng
返回IO Int
,并且!!
需要Int
。
这里是使用您的rng
函数从列表中获取随机元素的函数:
-- Will crash on empty list
randomElementFromList :: [Int] -> IO Int
randomElementFromList list = do
r <- rng (length list)
return $ list !! r