2014-02-20 226 views
3

我有一個功能probabilities :: String -> [(String, Double)]它返回基於輸入String輸入的概率分佈。現在我想根據該概率分佈生成一個新的隨機String,其功能如generate :: String -> String。我最近在Control.Random.Monad找到fromList,但我正在努力將其用於我的具體情況。任何人都可以幫助我指出正確的方向嗎?如果您需要更多信息,請詢問。Haskell Grokking隨機數生成

更多信息:

我需要能夠重複調用generate在另一種算法中使用。

回答

3

你需要單子。讓我們改變的generate的類型:您可以定義generate

generate :: (MonadRandom m) => String -> m String 

然後你可能期望:

在:

generate = fromList . probabilities 

您可以反覆用兩種方式調用generate從另一個功能foo這兩種情況下,我們需要iterateM(也在monad-loops

iterateM :: Monad m => Int -> (a -> m a) -> a -> m a 
iterateM 0 _ a = return a 
iterateM n f a = f a >>= iterateM (n-1) f 
  1. 富可單子:

    foo :: (MonadRandom m) => String -> m String 
    foo = iterateM 10 generate 
    
  2. 或者你可以創建一個狀態,使foo純:

    foo :: Int -> String -> String 
    foo seed str = evalRand (iterateM 10 generate str) (mkStdGen seed) 
    
+0

謝謝'fromlist裏。概率「正是我在這裏尋找OP的根源。 –