2012-02-13 41 views
9

Ai đó có thể cung cấp ví dụ "for-dummies" về cách sử dụng 'MonadRandom'?Làm thế nào để sử dụng MonadRandom?

Hiện nay tôi có mã nào những thứ như thế đi qua xung quanh biến máy phát điện, tất cả các cách từ chức năng chính:

main = do 
    g <- getStdGen 
    r <- myFunc g 
    putStrLn "Result is : " ++ show r 

--my complicated func 
myFunc g x y z = afunc g x y z 
afunc g x y z = bfunc g x y 
bfunc g x y = cfunc g x 
cfunc g x = ret where 
     (ret, _) = randomR (0.0, 1.0) g 

Cảm ơn

Trả lời

13

Về cơ bản, tất cả các thông số bổ sung g chỉ có thể bị xóa. Sau đó, bạn sẽ nhận được số ngẫu nhiên bằng cách sử dụng các hàm từ Control.Monad.Random (chẳng hạn như getRandomR). Đây là ví dụ của bạn (tôi đã thêm một số arg để biên dịch):

import Control.Monad.Random 

main = do 
    g <- getStdGen 
    let r = evalRand (myFunc 1 2 3) g :: Double 
    -- or use runRand if you want to do more random stuff: 
    -- let (r,g') = runRand (myFunc 1 2 3) g :: (Double,StdGen) 
    putStrLn $ "Result is : " ++ show r 

--my complicated func 
myFunc x y z = afunc x y z 
afunc x y z = bfunc x y 
bfunc x y = cfunc x 
cfunc x = do 
    ret <- getRandomR (0.0,1.0) 
    return ret 
+0

Tôi nghĩ rằng bạn có 'runRand' và' evalRand' trộn lẫn! – dflemstr

+0

Không chắc chắn làm thế nào điều đó xảy ra, kể từ khi tôi chạy mã :) Cố định ngay bây giờ. – porges

+0

Tất nhiên, 'myFunc',' aFunc', 'bFunc' và' cFunc' bây giờ là monadic. Chúng trả về các giá trị được bọc trong đơn vị 'Rand', mà phải được trích xuất bằng' >> = '(hoặc' <-' trong 'do') và được tạo ra với' return'. – pat

7

Bạn chỉ cần chạy một cái gì đó trong máy biến áp RandT đơn nguyên với runRandT hoặc evalRandT và cho đơn nguyên Rand đơn lẻ, với runRand hoặc evalRand:

main = do 
    g <- getStdGen 
    r = evalRand twoEliteNumbers g 
    putStrLn $ "Result is: " ++ show r 

twoEliteNumbers :: (RandomGen g) => Rand g (Double, Double) 
twoEliteNumbers = do 
    -- You can call other functions in the Rand monad 
    number1 <- eliteNumber 
    number2 <- eliteNumber 
    return $ (number1, number2) 

eliteNumber :: (RandomGen g) => Rand g Double 
eliteNumber = do 
    -- When you need random numbers, just call the getRandom* functions 
    randomNumber <- getRandomR (0.0, 1.0) 
    return $ randomNumber * 1337 
+0

Um ... nhưng không phải là 'func' của bạn hoạt động bên trong' IO' hay đơn nguyên? – drozzy

+0

Ngoài ra ... điều gì sẽ xảy ra nếu tôi gọi 'func' không phải từ chính? – drozzy

+0

'do' không có nghĩa là bạn sử dụng đơn nguyên' IO'. Tôi đang sử dụng đơn vị 'Rand' ở đây. – dflemstr

Các vấn đề liên quan