
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

Artem
10.08.2018
13:30:19
да :)

kana
10.08.2018
13:30:28

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

Google

Artem
10.08.2018
13:31:01

Dmitry
10.08.2018
13:31:30

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

kana
10.08.2018
13:32:35

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


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

Dmitry
10.08.2018
13:35:58

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 версию

Artem
10.08.2018
13:40:21

Hot
10.08.2018
13:40:34

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

Антон
10.08.2018
15:00:19

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


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


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

Антон
10.08.2018
15:40:14

Dmitry
10.08.2018
15:41:19

Admin
ERROR: S client not available

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

Dmitry
10.08.2018
15:41:45

Антон
10.08.2018
15:41:47

A64m
10.08.2018
15:54:16

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-библиотеками

Антон
10.08.2018
16:12:35

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
Ты так говоришь, как будто только ФЯ может быть нормальным ЯП