@haskellru

Страница 1399 из 1551
Hot
10.08.2018
13:14:59
Блин, да вы не шутите.

Ничоси

Андрей
10.08.2018
13:15:11
это хаскель, братан

Dmitry
10.08.2018
13:15:38
let (i1, g1) = random g (i2, g2) = random g1 f (i1, i2)

Google
Hot
10.08.2018
13:20:44
Чёт пока ни через <*>, ни через двойной fmap не выруливается.

import System.Random (randomRIO) data Line = Line { start :: Int, end :: Int } deriving (Show) randomInt :: IO Int randomInt = randomRIO (-10, 10)

Собсна, имею такой код.

Artem
10.08.2018
13:22:13
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

Hot
10.08.2018
13:22:19
Пытаюсь написать фукнцию, которая принимает n и возвращает список из n Line-ов с рандомными start и end

Ох

Спасибо конечно.

Artem
10.08.2018
13:22:55
задание для читателя: дописать сигнатуры функций Запустить: https://ideone.com/TCeSp3

конечно, жаль, что нет в стандартной библиотеке функции для списка случайных int

Hot
10.08.2018
13:29:34
задание для читателя: дописать сигнатуры функций Запустить: https://ideone.com/TCeSp3
А если я загружу в интерпретатор и напишу :t randIntList и т.д., задание будет выполнено?

Artem
10.08.2018
13:30:19
да :)

kana
10.08.2018
13:30:28
задание для читателя: дописать сигнатуры функций Запустить: https://ideone.com/TCeSp3
в чем подвох-то? Без него задание слишком тривиально

Artem
10.08.2018
13:30:32
но это читерство!

Google
Artem
10.08.2018
13:31:01
в чем подвох-то? Без него задание слишком тривиально
ну и исходная задача тривиальна, вы не находите?

Artem
10.08.2018
13:31:33
во всяком случае, моё наблюдение состоит в том, что если возникают трудности с задачей, то нужно, хотя бы постфактум, взять и разобраться с типами промежуточных вычислений

Artem
10.08.2018
13:32:51
Есть же randoms и randomRs
видимо, да, но там нужно явный генератор таскать! я не разбирался глубоко, просто на SO это первые два ответа, с randomRIO

Dmitry
10.08.2018
13:33:43
Для нетаскания генераторов есть Control.Monad.Random.

Artem
10.08.2018
13:35:14
Для нетаскания генераторов есть Control.Monad.Random.
честно говоря, лень идти смотреть. Если бы вы привели пример, было бы прекрасно!

кстати, sequence . replicate m = replicateM m
проверил, исправил

Dmitry
10.08.2018
13:35:34
Добрый день! У меня тут нубский вопрос. Есть у меня 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]

kana
10.08.2018
13:35:46
честно говоря, лень идти смотреть. Если бы вы привели пример, было бы прекрасно!
ну это просто ньютайп над стейтом, где в стейте генератор

Artem
10.08.2018
13:36:07
Hot
10.08.2018
13:36:11
Приведённые выше решения правильные. Но я для рандома рекомендую использовать библиотеку 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]
Спасибо. Правда, я как раз из тех, кто "детишки балуются".

Собственно, посмотрев на код одного из предыдущих ораторов, наклепал такое: 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

replicateM походу импортнуть откуда-то надо.

В Prelude её нет

Oleg
10.08.2018
13:38:48
Control.Monad

Hot
10.08.2018
13:39:09
Аа, спасибо!

Сейчас сделаем покрасивше.

Google
kana
10.08.2018
13:39:32
вообще конечно всегда, когда получается sequence . f, то можно попробовать поискать fM версию

Terminator
10.08.2018
14:57:49
@chumpa_yandex_ru будет жить. Поприветствуем!

Aleksey
10.08.2018
15:01:10
Ну сейчас я гуглить не буду

buildwithelm, или как-то так сайтик называется

Там есть интересные примеры

Антон
10.08.2018
15:02:37
Парсер-комбинаторы есть?

Aleksey
10.08.2018
15:03:57
Есть вроде

Alexander
10.08.2018
15:06:45
если не нужен криптостойкий рандом, то брать mwc-random или th-random

второе, если нужен split

Yuuri
10.08.2018
15:07:31
Приведённые выше решения правильные. Но я для рандома рекомендую использовать библиотеку 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
10.08.2018
15:07:33
random ужасная библиотека, но слушать советы брать криптостойкие генераторы, если тебе математику считать, я бы не стал

а вообще сразу нужно смотреть какие свойства псевослучайных величин нужны и для каких задач

Leonid
10.08.2018
15:11:59
Я слышал что мерсен твистер неоправданно дорогой

Alexander
10.08.2018
15:12:15
ну я его не предлагал

у него правда дико длинный период

Leonid
10.08.2018
15:12:35
Его по дефолту берут

Alexander
10.08.2018
15:12:49
и он вроде не форкается

Google
Alexander
10.08.2018
15:12:53
не помню

Dmitry
10.08.2018
15:36:13
> Отдельные люди отличные вещи делают на Elm Например?
Мы на работе используем Elm для фронтенда. Это связано с тем, что человек, который пишет фронтенд, знал до этого только OCaml (да, и такие бывают!), и Elm проще начать новичку. Но сейчас уже думаем перейти на что-то другое. Сложность фронтенда становится очень большой. Так как в Elm нет хорошей поддержки абстракций (вроде тайпклассов), то в итоге получается, что приходится писать go на фронтенде. А ещё в качестве бэкенда используется Haskell, и все библиотеки по автоматической генерации Elm-типов из Haskell типов, JSON энкодеров и декодеров и API эндпоинтов работают очень плохо. Одна библиотека на Generic'ах, но даже не поддерживает суммы типов (и даже енумы не поддерживает!). А вторая библиотека хоть и поддерживает суммы типов, но на TemplateHaskell и не поддерживает фантомные типы. Становится очень больно ?

Антон
10.08.2018
15:37:15
dimiii
10.08.2018
15:38:33
Dmitry
10.08.2018
15:39:15
Нет бы сразу, скажем, PureScript взять
> Это связано с тем, что человек, который пишет фронтенд, знал до этого только OCaml (да, и такие бывают!), и Elm проще начать новичку. Читай мотивацию во втором предложении. Не факт, что с PureScript станет намного лучше. Библиотеки типа purescript-bridge тоже не особо помогают быть продуктивным на полную катушку...

На что же планируете переходить?
Есть три варианта: 1. PureScript 2. GHCJS 3. Написать свою нормальную библиотеку для генерации Elm-кода

Dmitry
10.08.2018
15:41:19
4. Написать свой язык :^)
Можно. Но продукты релизить и зарабатывать деньги тоже хочется ?

Admin
ERROR: S client not available

Антон
10.08.2018
15:41:19
А вообще - писать библиотеку для генерации кода на языке, который транспилируется в JS - ну, такое

Dmitry
10.08.2018
15:41:45
А вообще - писать библиотеку для генерации кода на языке, который транспилируется в JS - ну, такое
Писать это всё руками и тратить на это в два раза больше времени — ещё больше такое ?

Iliya
10.08.2018
15:55:49
ждать Wasm ?

A64m
10.08.2018
15:56:24
не знаю, почему у людей столько оптимизма по отношению к васму

Iliya
10.08.2018
15:57:31
смотрю что 4 главных браузера поддерживают, не пробовал руками

A64m
10.08.2018
15:59:19
ну поддерживает, и что? вы на васме собираетесь писать?

Iliya
10.08.2018
16:00:34
похоже что обычные сайты на нём смысла нет делать, только что-то игрушечное?

A64m
10.08.2018
16:01:56
ну, теоретически можно в него компилировать какой-то нормальный язык, но ни один нормальный язык пока в него не компилируется, и нормально не будет пока кое-какие изменения в васме не произойдут

Iliya
10.08.2018
16:03:30
я не о модели компиляции, с этим кажется проще всего справиться хотя и не скоро. А просто html с каким-то аналогом jQuery на нём будет смысл на чём-то типизированном верстать или это для игрушек, видео и тд?

Google
Iliya
10.08.2018
16:04:17
уж хаскель-то компилятор всяко осилит

A64m
10.08.2018
16:04:59
нет, хаскель в нынешний васм нормально не скомпилировать, будет в 3-5 раз тормознее нативного где-то

но все лучше, чем ghcjs, конечно

Алексей
10.08.2018
16:05:45
не юзайте васм для разработки фронта пожалуйста

A64m
10.08.2018
16:06:05
обязательно будут

Алексей
10.08.2018
16:06:16
он не умеет нормально в DOM

насколько я знаю

и скорее всего нескоро сможет в него, если вообще сможет

и вообще не для этого васм делали вообще, чтобы на нём фронты писать, чтобы всякие жирные рантаймы по сети гонять

A64m
10.08.2018
16:08:44
да никого не волнует, что не для этого

будут писать, потому что яваскрипт хуже гитлера

Iliya
10.08.2018
16:09:20
не понял, откуда жирные рантаймы

и что такое жирные по сравнению с JS-библиотеками

A64m
10.08.2018
16:13:17
Rust
> какой-то _нормальный_ язык

т.е. не совсем убогий ФЯ

Антон
10.08.2018
16:14:59
т.е. не совсем убогий ФЯ
Rust никогда ФЯ и не был. И если уж на то пошло, то он для компиляции в wasm лучше, чем сабж, подходит

A64m
10.08.2018
16:15:30
правильно, не был, а надо нормальный язык

Антон
10.08.2018
16:16:11
Ты так говоришь, как будто только ФЯ может быть нормальным ЯП

Страница 1399 из 1551