
Aleksey
03.08.2017
14:36:25
Псто много книг, написанных до появления Except

Даниил
03.08.2017
14:36:30
как эксепшны могут рекомендоваться если это небезопасно, грязно и фу-фу-фу?

Alexander
03.08.2017
14:36:47
@astynax type Except e = ExceptT e Identity или другой Except?

Vasiliy
03.08.2017
14:37:18

Google

Aleksey
03.08.2017
14:37:28

Alexander
03.08.2017
14:37:44
вотя и говорю, что он жирнее, чем Either

Aleksey
03.08.2017
14:37:52
ещё и асинхронные эксепшны есть
State сотоварищи - тоже алиасы над тпансформерами с идентити
Это уже на спичках экономия :)

Denis
03.08.2017
14:40:55
и Reader, Writer, RWS

Aleksey
03.08.2017
14:43:14
Identity - newtype, лишних оберток нет все равно

Denis
03.08.2017
14:51:46
кынули тут http://starcolon.com/blog/moment-of-wtf-on-learning-haskell/index.html

Index
03.08.2017
14:52:45
Правильные тип сумма и тип-произведение это Rec и Union
они сразу N-арные
И у них нет всяких инстансов Foldable (даже по кайндам не сойдется)

Google

Index
03.08.2017
14:53:46
Но их мешает использовать (1) синтаксический оверхед (2) небольшой performance-penalty
А еще хочется унификации higher-order произведений и сумм. Потому что раздражает иметь
data Pair a b = Pair a b
data Product f g a = Product (f a) (g a)
data Biproduct f g a b = Biproduct (f a b) (g a b)
...
Здесь, опять же, Rec и Union подходят за счет параметризации интерпретирующим функтором.

Denis
03.08.2017
14:58:41

Vasiliy
03.08.2017
14:59:01
Rec, я так понимаю, из vinyl

Index
03.08.2017
14:59:05
https://hackage.haskell.org/package/vinyl-0.6.0/docs/Data-Vinyl-Core.html

Vasiliy
03.08.2017
14:59:27
Union из union

Index
03.08.2017
14:59:30
А почитать нигде не могу порекомендовать хорошего, но вот в этой книжке будет https://intermediatehaskell.com/
Union из union
Ага, а еще в новом vinyl ввели CoRec, который вроде эквивалентен (но устроен по-другому внутри)

Vasiliy
03.08.2017
15:02:30
ого, здорово
CoRec - он из пакета Frames того же автора

Denis
03.08.2017
15:03:16

Index
03.08.2017
15:05:01
В общем я только хочу сказать, что штуковины с кайндом (k -> *) -> [k] -> * — это удачная концепцая, часто полезная, но с определенным оверхедом, который не всегда оправдан. Если бы они имели больше поддержки в языке (удобный синтаксис хотя бы), то было бы хорошо.
У них и с выводом типов история хорошая, компилятор всегда подсказывает в нужном направлении при использовании.
Т.е. хотя на первый взгляд это может показаться какой-то адок на типах, там нет линзоподобных ошибок

Alexander
03.08.2017
15:11:06
(k -> *) -> [k] -> * вообще прекрасно

Denis
03.08.2017
15:11:39

Alexander
03.08.2017
15:32:18
удобно в хозяйстве, можно много чего выразить

Dmitry
03.08.2017
15:45:28

Misha
03.08.2017
15:45:57
так type String = [Char] же

Google

Dmitry
03.08.2017
15:46:41
Да, с этим спорить я не буду

Index
03.08.2017
15:51:05
:set -XOverloadedLists -XOverloadedStrings
и после этого вышеперечисленное вообще не обязано работать

Sergey
03.08.2017
17:16:56

Alex
03.08.2017
17:21:41
спринг некромант :)

Alexander
03.08.2017
17:23:33
интересная форма рекламы

Vladimir
03.08.2017
19:21:33
Ну и откуда тут спринг.?

Deleted account
04.08.2017
03:37:59
t.me/folderarchive — канал, где бесплатно сливают платные полезные курсы и материалы.

Andrew
04.08.2017
03:56:39

Yuriy
04.08.2017
08:35:22
заходит @Foo в бар...

Dmitry
04.08.2017
10:39:24

Vasiliy
04.08.2017
10:43:19
я так понимаю, потому что тип второго аргумента должна определять сама функция wtf, а в случае с const тип аргумента определяет тот, кто её вызывает

Alexander
04.08.2017
10:43:26
это только в ghci?
или если компилять то тоже?

Andrew
04.08.2017
10:48:53

Dmitry
04.08.2017
11:13:03
или если компилять то тоже?
Такой код компилируется вполне ок. И если вызвать в ghci foo, то выведет 1
{-# LANGUAGE RankNTypes #-}
wtf :: a -> (Num b => b) -> a
wtf x _ = x
foo :: Int
foo = wtf 1 ("wat" + "man")

Andrew
04.08.2017
11:23:50
Все дошло до меня)

Google

Aleksey
04.08.2017
11:24:21
+ тут, это не сложение списков, а чего угодно, реализующего Num. И "строки" тут не списки (не обязательно), т.к. OverloadedStrings повзоляетт записать в виде строкового литерала всё, что угодно, лишь бы это что-то умело IsString (да, капитанствую).
Отсюда "foo" + "bar", это нечто, умеющее IsString и Num

Den
04.08.2017
11:24:21
Пардон за оффтопик, а как вы тут код форматируете? Бот какой работает?

Andrew
04.08.2017
11:24:44

Aleksey
04.08.2017
11:25:04

Vasiliy
04.08.2017
11:25:11

Дед Пегас
04.08.2017
11:26:05
Либо в три `
`
Хм.

Vasiliy
04.08.2017
11:26:21
да, я тоже три написал :D

Дед Пегас
04.08.2017
11:26:36
Я хотел три обернуть в шесть, не вышло
`
Даже с пробелами съедает.

Den
04.08.2017
11:26:49
хмм, я попробовал *zzz* - не заработало, и забил на markdown

Дед Пегас
04.08.2017
11:27:08
Как ты это сделал?
`

Vasiliy
04.08.2017
11:27:25
_подчёркивания_ вроде должны работать

Дед Пегас
04.08.2017
11:27:30
zzz
подчёркивания тоже двойные

Aleksey
04.08.2017
11:28:16
двойные, да. Так что это Telegram flavoured not-so-Markdown

Google

Vasiliy
04.08.2017
11:28:32
ага, спасибо за информацию

Yuriy
04.08.2017
11:52:07
* = тип
[*] = список типов
ой, вопрос пропал

Den
04.08.2017
11:52:36
да я удалил, ибо пока писал, понял, какой бред написал

Yuriy
04.08.2017
11:53:10
вместо * лучше писать Type (http://hackage.haskell.org/package/base-4.10.0.0/docs/Data-Kind.html#t:Type), будет проще

Den
04.08.2017
11:53:37
я там запутался немного, и привидилось, что в одном месте тип описан типа как * -> * -> *, а в другом он же как * -> *
хмм, занятно: type * = * A backward-compatible (pre-GHC 8.0) synonym for Type

Alexander
04.08.2017
12:01:23
чего сразу мардавном звать

Yuriy
04.08.2017
12:05:46
сам Телеграм называет это маркдауном

Alexander
04.08.2017
12:05:57
ok

Евгений
04.08.2017
14:12:01
Чо наконец-таки ВПИЛИЛИ разметку?