Добрый день! У меня тут нубский вопрос. Есть у меня ADT, который хранит в себе 2 инта. И мне надо сделать n таких ADT, каждый инт в которых будет случайным.
Приведённые выше решения правильные. Но я для рандома рекомендую использовать библиотеку cryptonite, потому что random — это ненастоящий рандом. Так, для детишек поиграться. А если хочется настоящую псевдослучайность, то лучше использовать cryptonite. Приведу пример кода в ghci, как решить эту проблему с более хорошей библиотекой:
ghci> import Crypto.Random
ghci> import Crypto.Number.Generate
ghci> -- напишем функцию, которая принимает дествие в монаде рандом и выполняет его, создавая генератор в монаде IO
ghci> evalRandom randomAction = drgNew >>= \gen -> pure $ fst $ withDRG gen randomAction
ghci> :t evalRandom
evalRandom :: MonadRandom m => MonadPseudoRandom ChaChaDRG b -> m b
ghci> -- объявим генератор типа данных Line
ghci> data Line = Line Integer Integer deriving Show
ghci> genLine = Line <$> generateMax 100 <*> generateMax 100
ghci> :t genLine
genLine :: MonadRandom f => f Line
ghci> -- напишем функцию, которая принимает число n и генерирует n строчек
ghci> import Control.Monad
ghci> genNLines n = replicateM n genLine
ghci> :t genNLines
genNLines :: MonadRandom m => Int -> m [Line]
ghci> -- а теперь запутим наши функции в REPL'е, чтобы посмотреть результат
ghci> evalRandom $ genNLines 5
[Line 16 99,Line 23 72,Line 19 79,Line 27 24,Line 92 18]
ghci> evalRandom $ genNLines 3
[Line 17 51,Line 58 70,Line 8 72]