在Haskell中理解随机数生成

3
我有一个函数probabilities :: String -> [(String, Double)],它基于输入的String返回一个概率分布。现在我想使用类似generate :: String -> String这样的函数根据该概率分布生成一个新的随机String。我最近发现了Control.Random.Monad中的fromList,但我在使用它处理我的特定情况时遇到了困难。谁能帮我指点一下方向?如果需要更多信息,请询问。
更多信息:我需要能够重复调用generate以供另一个算法使用。
1个回答

3
你需要使用单子。让我们将generate的类型更改为:
generate :: (MonadRandom m) => String -> m String

那么你可以按照预期定义 generate

generate = fromList . probabilities

你可以以两种方式从另一个名为 foo 的函数中重复调用 generate
无论哪种情况,我们都需要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 can be monadic:

    foo :: (MonadRandom m) => String -> m String
    foo = iterateM 10 generate
    
  2. Or you can create a state and make foo pure:

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

谢谢,fromList . probabilities 正是我在这里提出的问题的根源所在。 - Code-Apprentice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接