
Aminion
08.04.2018
17:21:06
Прохожу на степике курс, задание о безопасном итерировании
class (Eq a, Enum a, Bounded a) => SafeEnum a where
ssucc :: a -> a
ssucc a
| a == maxBound = minBound
| otherwise = succ a
spred :: a -> a
spred a
| a == minBound = maxBound
| otherwise = spred a
Failed. Runtime error
main: <<loop>>
Выдает такое вот.
Локально в терминале все ок

Ignat
08.04.2018
17:25:00
> spred a = spred a

Google

Aminion
08.04.2018
17:35:58
Ох. Спасибо.

Евгений
08.04.2018
20:25:15

Alister
08.04.2018
20:26:44
скоро у нас кроме компилятора будет отдельный оптимизатор, баг превентер и анализатор который будет крыть матом нерадивых программистов

Слава
08.04.2018
20:47:11

Alister
08.04.2018
20:54:45
а код тестировать не надо будет
верифайер сам все автоматически верфицирует

Ilya
09.04.2018
01:01:31
как-то рид странно работает.
в гхци пробую
λ> read "NaN" :: Double
NaN
в файле задефайнен
minusNaN, nan, inf, minusInf :: Double
minusNaN = read "-NaN"
nan = read "NaN"
но при выполнении получаю в этом месте
Exception: Prelude.read: no parse
что успевает поменяться?
ну и кстати если кто-то подскажет человеческий способ как работать с всякими неканоничными нанами будет здорово
а, похоже ieee754 умеет, проглядел когда первый раз его смотрел https://hackage.haskell.org/package/ieee754-0.8.0/docs/Numeric-IEEE.html#v:nanWithPayload

Alexander
09.04.2018
02:58:58
Prelude> read "NaN" :: Double
NaN
а, туплю, я тоже в ghci
runhaskell << EOF
heredoc> nan :: Double
nan = read "NaN"
main = print nan
EOF
NaN

Ilya
09.04.2018
03:14:21
да, я понимаю что выглядит как волшебство. я в итоге поменял на nan из пакетика ieee-754 и всё стало хорошо. почему не работал read забил разбираться

Google

Aleksey
09.04.2018
04:06:03
> 1 / 0
NaN
так что можно и без read :)

Vladimir
09.04.2018
05:05:05
Это как 1/0 получился наном?
0/0 должен был быть, наверное.

Alexander
09.04.2018
05:17:18
поддельный ghci!

Ilya
09.04.2018
05:17:20
Ну как-то не самодокументированно всё равно выглядит

Aleksey
09.04.2018
05:26:38
0/0 == NaN

Imants
09.04.2018
05:27:34
Не удобнее ли ловить NaN Either и т.п.?
Напр., своей версией '/'

Alexander
09.04.2018
05:27:52
NaN нормальный же

Vladimir
09.04.2018
05:27:57
Кстати, 0/0 /= NaN ;)

Alexander
09.04.2018
05:27:57
не bottom и замечательно

Aleksey
09.04.2018
05:28:15
Вот прямо скопипастил из ghci

Vladimir
09.04.2018
05:29:06

Aleksey
09.04.2018
05:29:17
nan, это что вообще?
В base нету такой

Imants
09.04.2018
05:29:58
У NaN есть всякие (F/A/M) instances?

Vladimir
09.04.2018
05:30:03
Это нан, можно определить как 0/0, можно как inf/inf, без разницы.

Google

Aleksey
09.04.2018
05:30:27
Всё логично
Неопределённость же. Нельзя сравнивать такие

Vladimir
09.04.2018
05:32:00
0/0 == NaN
Поинт в том, что нан -- это такой дабл, который не равен себе. Он единственный в своём роде. Чуть не в стандарте описан способ сделать isNaN x = x /= x

Aleksey
09.04.2018
05:32:05
λ> let nan = 0 / 0 in 1 > nan || 1 < nan
False
Он ничему не равен, в т.ч. и самом у себе :)

Vladimir
09.04.2018
05:32:54
Вот. Поэтому NaN /= 0/0 ;)

Aleksey
09.04.2018
05:33:17
С этой точки зрения - да :)

Imants
09.04.2018
05:33:43
Ну и что с NaN можно сделать, кроме как словить и выделить в отдельный случай?

Aleksey
09.04.2018
05:34:03
Ничего не делать. Это полезное значение
Вычисления с оным так же дадут NaN (а не эксепшн, например)

Aleksey
09.04.2018
05:34:39
Это полезное свойство

Александр
09.04.2018
05:35:22
Тут на Реддите драма развивается.
https://www.reddit.com/r/haskell/comments/8ao7pc/the_monad_complaint_pipeline/
А причиной всему, похоже, послужил этот твит Дяди нашего Боба:
https://twitter.com/unclebobmartin/status/982229999276060672
TL;DR
Пуристы кричат, как Дядя Боб неправ; прагматики пишут статьи, что не надо быть пуристами, иначе внешние люди будут считать всех хаскеллистов asshole'ами:
https://argumatronic.com/posts/2018-04-07-monad-complaints.html

Ilya
09.04.2018
05:43:26

Aleksey
09.04.2018
05:48:43
Infinity опять же

Александр
09.04.2018
06:02:41
Так и есть же - многие хаскелисты, это те ещё снобы :)
Некоторое время назад Кметт громко хлопнул дверью и сложил с себя обязанности chairman (ЕМНИП). Так закончилась эпоха академического-пуристического хаскелля, символом которой он и был, и началась эпоха прагматического хаскелля, символом которой стал Снойман.

Aleksey
09.04.2018
06:03:43
Это то тут при чем?

Google

Александр
09.04.2018
06:03:54
И пуристы с тех пор агонизируют, не желая уступать место менее знающим, но более практичным людям

Aleksey
09.04.2018
06:04:18
А, в этом ключе! Тогда согласен, есть такое

Александр
09.04.2018
06:06:06
Окей :)
На Сноймана же часто нападают, что он Хаскелля не знает

Aleksey
09.04.2018
06:11:29
Я лично не считаю, что Снойман не знает Хаскеля (и что такое вообще "знать заскель"?), хоть я и согласен с тем, что Снойман имеет довольно своеобразное мнение о том, как пристало использовать Х в реальных проектах, и иногда слишком форсит оное, как единственное правильное. Но таковым занимаются многие и вне хаскеля тоже. Дядябоб тоже "из этих" :)

Александр
09.04.2018
06:13:10
> и что такое вообще "знать заскель"?
Ну, я бы хотел так не знать Хаскелль, как его не знает тот же Снойман. Цены б мне не было

Imants
09.04.2018
06:17:28
Если б кто написал рабочий _HC с нуля (на С или ASM), про тех наверное можно смело сказать, что они знают Х

Евгений
09.04.2018
06:19:37
Каждый тимлид таким занимается. Работа у них такая
Только плохой тимлид так делает. Задача тимлида вырабатывать общие практики, это да. Но есть два способа решения этой проблемы -- либо придумывать отсебятину, либо слушать людей в команде и вместе с ними прорабатывать тонкие места

Admin
ERROR: S client not available

Vladimir
09.04.2018
06:20:38

Alexander
09.04.2018
06:30:47
а потом стал прагматичный?!
ой вей

IC
09.04.2018
06:35:03

Александр
09.04.2018
06:35:57
P.S. Имел честь беседовать с ним лично. Офигенный мужик.

Alexander
09.04.2018
06:39:20
правильно сделал, нехрен на токсиков время тратить
а то там народ некоторый из практичных, совсем берега потерял

Google

Alexander
09.04.2018
06:40:05

Александр
09.04.2018
06:40:31

Alexander
09.04.2018
06:40:40
+

Александр
09.04.2018
06:41:03
Прикольно. Кого поймал?

Alexander
09.04.2018
06:42:05
запоминать что поймал в какой-то день? увольье
знаю что кметт с женой за мистиков играли

Александр
09.04.2018
06:43:29
Моя коллега до сих пор играет. Правда, я не уверен, что за сервера использует

Dmitry
09.04.2018
06:43:35
Т.е. вы на практике мапили список покемонов в очки? И теперь список покемонов у тебя удалён из головы GC? Молодцы, даже в жизни Хаскель применяете!

Alexander
09.04.2018
06:44:08
если что играли после Zurihack когда возвращались, просто это интереснее чем просто общались

Александр
09.04.2018
07:15:49

Alexander
09.04.2018
07:16:33
очень интересно откуда в утверждении неявное "или"

Александр
09.04.2018
07:17:34
Ну вот мне интереснее. Так что пойду играть в Покемонов, а не в чате сидеть

Alexander
09.04.2018
07:18:21
зачем сидеть в чате, когда ты в Цюрихе?
впрочем идти играть в покемонов здоровее будет чем сидеть в чате. Ну и одно другому опять же не мешает

Dmitry
09.04.2018
07:20:08
Компромиссное решение — это сделать отображение пойманных покемнов в слова. Поймал 5-6 покемонов, получилось предложение. Отправляешь его в чат.

Александр
09.04.2018
07:20:21
Мои Покемоны называются "два доклада на конец апреля"

Dmitry
09.04.2018
07:26:42
И все по фри-монадам?

Александр
09.04.2018
07:31:27

Alexandr
09.04.2018
08:26:12
Всем привет. Есть массив термов, которые можно посчитать параллельно, потом собираю результаты в другой терм с помощью foldl:
let terms = [t1, t2, ...]
computations <- traverse (\t -> async $ comput t) terms
foldl (\acc t -> do r1 <- acc; r2 <- wait t; return $ Term r1 r2) (pure mempty) computations
Хотелось бы выводить результат по мере вычисления, вместо этого, пока foldl не выполнится не видно и результата, как такое можно сделать?

Dmitry
09.04.2018
08:29:06
(не полагаться на ленивость?)
использовать другие средства коммуникации и явный тред, который выводит результаты?