То, что вы описали, не может быть сделано в чистом функциональном коде.
Чистый функциональный код подразумевает, что вы будете получать один и тот же вывод для одного и того же ввода каждый раз. Поскольку функция рандомизации по определению дает разные выходные данные для одного и того же ввода, это невозможно в чисто функциональном коде.
Если вы не передадите дополнительное значение, как описано в @ ответ camccann . Технически, он даже не должен быть таким продвинутым, как ГСЧ, в зависимости от ваших потребностей. Вы можете передать целое число, умножить его на 10 и вычесть 3 (или что-то еще), а затем по модулю этого найти свой индекс. Тогда ваша функция остается чистой, но вы напрямую контролируете случайность.
Другой вариант - использовать RandomRIO
для генерации числа в диапазоне, который затем можно использовать для выбора индекса из списка. Это потребует от вас ввода монады ввода / вывода.