如何在Haskell函数中使用do块?[已关闭]

问题描述 投票:-1回答:1

我想在一个函数中生成2个随机的Int值,并在调用其他函数时使用它们。这些函数需要一个Int,所以我想在do块中获取随机值。谁能告诉我,我应该如何正确地做这件事?

simmulatedGen :: [[Bool]] -> [[Bool]] ->Int -> Double -> Int -> [[Bool]]
simmulatedGen seed minim _ _ 0 = minim
simmulatedGen seed minim dimensiuni t iteratii = do
        {i <- getStdRandom $ randomRIO (0,dimensiuni - 1 :: Int)
        ;j <- getStdRandom $ randomRIO (0,31:: Int)}
    let vecin = selectVecin i j seed
        valoareVecin = deJong dimensiuni (bitGenToDoubleArray dimensiuni vecin)
        valoareMinim = deJong dimensiuni (bitGenToDoubleArray dimensiuni minim)
        percentage = getStdRandom $ randomIO :: Double in  
    if valoareVecin < valoareMinim then simmulatedGen seed vecin dimensiuni t (iteratii - 1) else if t > percentage then simmulatedGen seed vecin dimensiuni t (iteratii - 1) else
                                                            simmulatedGen seed minim dimensiuni t (iteratii - 1)
haskell random syntax
1个回答
2
投票

我无法理解你自己的逻辑,但你可以尝试使用类似这个例子。

import System.Random

example :: Int -> IO [[Bool]]
example n = do
    x <- randomRIO (1,10)
    if n < x then
       return [[True]]
    else
       return [[False],[False]]


main :: IO ()
main = do
   b1 <- example 5
   b2 <- example 5
   print (b1, b2)

上面,我们生成一个随机的 Int命名 x,并与输入比较 n,根据比较的结果返回两个不同的列表。在 main我们用相同的参数调用函数两次,但由于随机性,我们可以观察到不同的结果。

作为一个经验法则,使用 x <- f argsf 返回 IO something (结果可以是随机的)和 let x = f args 当结果不在 IO 结果是确定性的)。这不是一个硬性的规则,但在大多数情况下,你会希望使用这个。

© www.soinside.com 2019 - 2024. All rights reserved.