我有一个函数probabilities :: String -> [(String, Double)]
,它根据输入String
返回概率分布。现在我想基于具有类似String
的函数的概率分布生成新的随机generate :: String -> String
。我最近在Control.Random.Monad
中找到fromList
,但我正在努力将其用于我的具体情况。任何人都可以帮助我指出正确的方向吗?如果您需要更多信息,请询问。
更多信息:
我需要能够反复调用generate
以用于其他算法。
答案 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
Foo可以是monadic:
foo :: (MonadRandom m) => String -> m String
foo = iterateM 10 generate
或者你可以创建一个状态并使foo
纯净:
foo :: Int -> String -> String
foo seed str = evalRand (iterateM 10 generate str) (mkStdGen seed)