Гроккинг Генерация случайных чисел в Хаскеле
У меня есть функция probabilities :: String -> [(String, Double)]
который возвращает распределение вероятностей на основе входных данных String
, Теперь я хочу сгенерировать новый случайный String
на основе этого распределения вероятности с функцией что-то вроде generate :: String -> String
, Я недавно нашел fromList
в Control.Random.Monad
, но я борюсь с использованием его для моей конкретной ситуации. Может ли кто-нибудь помочь указать мне правильное направление здесь? Если вам нужна дополнительная информация, пожалуйста, спросите.
Дополнительная информация:
Мне нужно уметь звонить generate
повторно для использования в другом алгоритме.
1 ответ
Вам понадобятся монады. Давайте изменим тип generate
чтобы:
generate :: (MonadRandom m) => String -> m String
Тогда вы можете определить generate
как и следовало ожидать:
generate = fromList . probabilities
Вы можете повторно позвонить generate
из другой функции foo
двумя способами:
В обоих случаях нам понадобится iterateM
(также в петлях монад)
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 может быть монадическим:
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)