Гроккинг Генерация случайных чисел в Хаскеле

У меня есть функция 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
  1. Foo может быть монадическим:

    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)
    
Другие вопросы по тегам