2016-08-23 54 views
1

我是新來的Haskell,我用從randomRIO功能使用IO詮釋問題的功能,使用從randomRIO隨機整數。我的目標是獲得一個隨機的Int值,比如說r,並且返回True,否則返回false,但我不知道如何去做。哈斯克爾:如何在返回boolean

我的功能看起來應該像:

randomCompare :: Int->Bool 

randomCompare x 

    | x < r = True -- somehow i want to r <- randomRIO(start,end) 

    | otherwise = False     

我知道有一個設計意圖在保持IO瓦爾斯在上下文中的純度等。但我不明白爲什麼使用隨機數的布爾函數應該是「壞」。

謝謝。

+0

這是不可能的類型做'內部 - > Bool',因爲一個函數的結果只取決於它的輸入,這裏唯一的輸入是多少。如果你還傳入隨機數,那麼你有'randomCompare x r = x immibis

回答

5
import System.Random(randomIO) 

randomCompare :: Int -> IO Bool 
randomCompare x = do 
    r <- randomIO 
    return $ x < r 

IO既不好也不壞,它只是聲明你的函數有副作用。這裏副作用是修改全局隨機數生成器的狀態,以便隨後調用randomIO將給出另一個數字(如果它是常量,它不會是隨機的!)。

IO不強制所有的調用函數是IO太(即要使用的IO布爾的那些)。但是,如果調用函數是IO只消耗這個IO布爾,如果沒有其他副作用,那麼你可以把它作爲一個純函數f :: Bool -> SomeType分離和functorially它適用於IO,即

f <$> randomCompare i 

所以在IO單子只售由函子fmap代替普通函數調用$,也注意到<$>。鍵入的時間太長了嗎?

如果你絕對要離開IO單子(爲什麼?),你也可以畫出你所需要的第一隨機值,將其存儲在一個列表,然後在名單上應用純函數。

+0

感謝您的回答。 所以我明白沒有IO沒有優雅的方式。不過,調用「randomCompare」的函數只需要Bool值,那麼調用函數應該如何處理IO Bool而不是Bool呢? 謝謝。通過'MonadRandom M =>內部> IO Bool' - - >米Bool' –

+2

如果導入Control.Monad.Random以及使用該MonadRandom封裝,可以更換'詮釋。然後你仍然可以使用它,就好像它是'Int - > IO Bool'一樣,但是你有類型級的保證,該函數沒有任何其他副作用,而不是產生隨機數。 – Gurkenglas

+0

無限的隨機列表也很常見。 randomCompare :: RandList - > Int - >(Bool,RandList)'where RandList = [Int]''和'randomCompare(x:xs)i =(i