Andrey
всего по 15 минут в день..
Dmitry
Вообще, надо бы просто список. Но я смотрю, формат ruhaskell предполагает именно размещение статей
Dmitry
Лучше бы добавить возможность там не только посты размещать, но и ссылки на внешние источники
Alexander
По категориям
Dmitry
И это тоже. "Темы" выглядят как-то ненавигабельно
Alexander
кстати длинные числа где-то в недрах типов для векторизации есть
Alexander
но не уверен, что они юзабельны и нативный кодогенератор, что-то хорошее сделает
Aleksei (astynax)
кому-то - определённо. Фейсбуку, например
Aleksei (astynax)
Мне лично у Reason синтаксис не нравится, поэтому я если бы брал, то оригинальный BuckleScript. Но это вкусовщина, конечно же
Alexander
странно или там только для векторизации было?
A64m
да
kosc
Добрый день! У меня тут нубский вопрос. Есть у меня ADT, который хранит в себе 2 инта. И мне надо сделать n таких ADT, каждый инт в которых будет случайным.
kosc
Сейчас столкнулся с тем, что рандом возвращает Int в IO
kosc
А конструктор ADT принимает чистый Int.
kosc
И через fmap такое не разрулить.
kosc
Надеюсь, понятно описал.
Dmitry
Получаешь последовательность через mkStdGen
Andrey
через фмап в фмапе должно разрулить
Dmitry
Дальше через random надёргиваешь столько интов, сколько надо.
Ignat
do pureInt <- getIntFromIO pure (pureInt, pureInt)
Artem
Если два аргумента у конструктора, то это не fmap, а <*>
kosc
Блин, да вы не шутите.
kosc
Ничоси
Andrey
это хаскель, братан
Dmitry
let (i1, g1) = random g (i2, g2) = random g1 f (i1, i2)
kosc
Чёт пока ни через <*>, ни через двойной fmap не выруливается.
kosc
import System.Random (randomRIO) data Line = Line { start :: Int, end :: Int } deriving (Show) randomInt :: IO Int randomInt = randomRIO (-10, 10)
kosc
Собсна, имею такой код.
Artem
import System.Random (randomRIO) import Control.Monad (replicateM) data Pair = P Int Int deriving Show randIntList m = replicateM m $ randomRIO (1,10::Int) createRandomPairs m = zipWith P <$> randIntList m <*> randIntList m n = 5 main = createRandomPairs n >>= print
kosc
Пытаюсь написать фукнцию, которая принимает n и возвращает список из n Line-ов с рандомными start и end
kosc
Ох
kosc
Спасибо конечно.
Artem
задание для читателя: дописать сигнатуры функций Запустить: https://ideone.com/TCeSp3
Artem
конечно, жаль, что нет в стандартной библиотеке функции для списка случайных int
kosc
задание для читателя: дописать сигнатуры функций Запустить: https://ideone.com/TCeSp3
А если я загружу в интерпретатор и напишу :t randIntList и т.д., задание будет выполнено?
Artem
да :)
кана
задание для читателя: дописать сигнатуры функций Запустить: https://ideone.com/TCeSp3
в чем подвох-то? Без него задание слишком тривиально
Artem
но это читерство!
Artem
в чем подвох-то? Без него задание слишком тривиально
ну и исходная задача тривиальна, вы не находите?
Artem
во всяком случае, моё наблюдение состоит в том, что если возникают трудности с задачей, то нужно, хотя бы постфактум, взять и разобраться с типами промежуточных вычислений
Artem
Есть же randoms и randomRs
видимо, да, но там нужно явный генератор таскать! я не разбирался глубоко, просто на SO это первые два ответа, с randomRIO
Dmitry
Для нетаскания генераторов есть Control.Monad.Random.
Artem
Для нетаскания генераторов есть Control.Monad.Random.
честно говоря, лень идти смотреть. Если бы вы привели пример, было бы прекрасно!
Artem
Dmitrii
Добрый день! У меня тут нубский вопрос. Есть у меня 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]
кана
честно говоря, лень идти смотреть. Если бы вы привели пример, было бы прекрасно!
ну это просто ньютайп над стейтом, где в стейте генератор
kosc
Приведённые выше решения правильные. Но я для рандома рекомендую использовать библиотеку 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]
Спасибо. Правда, я как раз из тех, кто "детишки балуются".
kosc
Собственно, посмотрев на код одного из предыдущих ораторов, наклепал такое: import System.Random (randomRIO) data Line = Line { start :: Int, end :: Int } deriving (Show) randomInt :: IO Int randomInt = randomRIO (-10, 10) generateNLines n = sequence $ replicate n $ Line <$> randomInt <*> randomInt
kosc
replicateM походу импортнуть откуда-то надо.
kosc
В Prelude её нет
Oleg
Control.Monad
kosc
Аа, спасибо!
kosc
Сейчас сделаем покрасивше.
кана
вообще конечно всегда, когда получается sequence . f, то можно попробовать поискать fM версию
Anonymous
@chumpa_yandex_ru будет жить. Поприветствуем!
Aleksei (astynax)
Ну сейчас я гуглить не буду
Aleksei (astynax)
buildwithelm, или как-то так сайтик называется
Aleksei (astynax)
Там есть интересные примеры
Антон
Парсер-комбинаторы есть?
Aleksei (astynax)
Есть вроде
Alexander
если не нужен криптостойкий рандом, то брать mwc-random или th-random
Alexander
второе, если нужен split
Ю ли я? 🤔
Приведённые выше решения правильные. Но я для рандома рекомендую использовать библиотеку 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]
"Ненастоящая" и "настоящая" псевдослучайность - это звучит :)
Alexander
random ужасная библиотека, но слушать советы брать криптостойкие генераторы, если тебе математику считать, я бы не стал
Alexander
а вообще сразу нужно смотреть какие свойства псевослучайных величин нужны и для каких задач
Leonid 🦇
Я слышал что мерсен твистер неоправданно дорогой
Alexander
ну я его не предлагал