Пример рабочего кода
import System.Random
seed::Int
seed = 40
giveList :: [Int]
giveList = [8,9,4,5,2]
generator = mkStdGen seed
giveRandomElement :: Int
giveRandomElement = giveList !! rand where
n = length giveList
(rand, _) = randomR (0,(n-1)) generator
Но это, вероятно, не сработает, как вы хотите.
giveRandomElement
всегда даст один и тот же результат.Это чистая функция без каких-либо входов, так что она должна делать?Он может быть только постоянным.
Вам нужно либо использовать IO
, либо вам нужно пропустить ваш генератор через ваш код и где-то его отслеживать.
Полученная вами ошибка компилятора:
test.hs:14:23: error:
• Ambiguous type variable ‘g0’ arising from a use of ‘randomR’
prevents the constraint ‘(RandomGen g0)’ from being solved.
Relevant bindings include generator :: g0 (bound at test.hs:14:10)
Probable fix: use a type annotation to specify what ‘g0’ should be.
These potential instance exist:
instance RandomGen StdGen -- Defined in ‘System.Random’
• In the expression: randomR (0, (n - 1)) generator
In a pattern binding:
(rand, generator) = randomR (0, (n - 1)) generator
In an equation for ‘giveRandomElement’:
giveRandomElement
= giveList !! rand
where
n = length giveList
(rand, generator) = randomR (0, (n - 1)) generator
|
14 | (rand, generator) = randomR (0,(n-1)) generator
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
потому что вы определили символ generator
в giveRandomElement
в терминах самого себя, и поэтому компилятор не смог определить его тип.(Объявление верхнего уровня generator
в этом случае не использовалось, поскольку (rand, generator) =
уже затенял символ после знака равенства.