Haskell中的Grokking随机数生成

时间:2014-02-20 03:00:42

标签: haskell random random-sample

我有一个函数probabilities :: String -> [(String, Double)],它根据输入String返回概率分布。现在我想基于具有类似String的函数的概率分布生成新的随机generate :: String -> String。我最近在Control.Random.Monad中找到fromList,但我正在努力将其用于我的具体情况。任何人都可以帮助我指出正确的方向吗?如果您需要更多信息,请询问。

更多信息:

我需要能够反复调用generate以用于其他算法。

1 个答案:

答案 0 :(得分:3)

你需要monad。我们将generate的类型更改为:

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

然后您可以按照预期定义generate

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可以是monadic:

    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)