
Alexander
12.05.2018
17:59:04
должно приходить
ну я до ghc скоро доберусь

Александр
12.05.2018
17:59:46
Еще нашел:
The semantics of this re-export is a bit tricky, though. For example, what can we say about the following module?
module M (module Data.List) where
import qualified Data.List
You’d probably think that module M now export everything that is exported by Data.List. Not at all! The standard says (emphasis is mine):
Since we imported Data.List qualified, nothing from it is in scope under an unqualified name. So, M doesn’t export anything. Right? Not quite.
https://ro-che.info/articles/2012-12-25-haskell-module-system-p1

IC
12.05.2018
18:09:19
есть где туториал как писать несложные древесные типы чтобы под них потом значения подгонять?

Google

Александр
12.05.2018
18:16:16
-- STM-Free, basic tweaks, Data.Map - IO Refs + Any 445.0 nsТакие дела. Похоже, мне таки придется остаться на Data.Map

A64m
12.05.2018
18:18:04
вот это подозрительно уже
IORefы тут что означают?

IC
12.05.2018
18:19:11

Александр
12.05.2018
18:19:53

A64m
12.05.2018
18:20:40
а, минус рефы, понятно

Александр
12.05.2018
18:20:59
-- STM-Free, basic tweaks, Data.Map - IO Refs + Any 445.0 ns
-- STM-Free, basic tweaks, HMap - IO Refs 509.2 ns
Между этими случаями разница исключительно в мапе
Но это были, конечно же, только "грязные" замеры, чтобы хотя бы приблизительно понимать порядок проблемы. Более правильное исследование я только собираюсь сделать

A64m
12.05.2018
18:22:03
а ключи в случае Data.Map какие?

Александр
12.05.2018
18:22:14
Пока те же, Data.Unique
Как раз сейчас делаю Int
То есть, ключи везде одинаковые были

Google

A64m
12.05.2018
18:24:10
с них, наверное, и надо было начинать, контейнерные библиотеки в которых хеши считаются к такому могут быть чувствительны

Александр
12.05.2018
18:24:44
Не исключено.
Мне надо какой-то конструктор сделать, чтобы имплементацию того и сего выбирать
-- stm-free, basic tweaks, with Data.Map - IORefs + Any + Int keys: 317.5 nsЗамена Data.Unique на целый ключ, пусть даже с atomicModifyIORef', дала хороший пинок предыдущему результату на Data.Map.
Для случая hashtables замена Data.Unique на Int результатов не принесла. Было и стало:
-- STM-Free, basic tweaks, hashtables + Any - IO Refs 843.3 ns
-- STM-Free, basic tweaks, hashtables + Any - IO Refs + Int keys 859.6 ns

A64m
12.05.2018
19:05:04
а Data.IntMap?

Александр
12.05.2018
19:08:25
О! Еще не пробовал
Data.IntMap относительно Data.Map с целыми ключами: опять обман ожиданий. Было и стало:
-- stm-free, basic tweaks, with Data.Map - IORefs + Any + Int keys: 317.5 ns
-- stm-free, basic tweaks, with Data.IntMap - IORefs + Any + Int keys: 366.5 ns

Sergey
12.05.2018
21:02:48
https://pbs.twimg.com/media/DdBhSO4WkAUtaXq.jpg:large
блин, обрезали на самом интересном месте (

Dmitry
12.05.2018
21:05:33
Можно как-то красиво сделать линзу по двум полям, если есть линзы по обоим полям? Я могу сделать get и set для двух полей, потом lens2 = lens get set. Красивее можно?

Denis
12.05.2018
21:21:41

Dmitry
12.05.2018
21:26:34
есть запись, линзы по полям. Хочу иметь линзу по двум полям.

A64m
12.05.2018
21:27:57
alongside ?

Dmitry
12.05.2018
21:27:59
хм, правда, чего я хочу? :-)
видимо, чтобы была линза по (f1,f2)

Denis
12.05.2018
21:28:51
только глянул на alongside)

Dmitry
12.05.2018
21:29:33
про alongside это мне? А что это?

Denis
12.05.2018
21:30:59

Dmitry
12.05.2018
21:33:36
да, спасибо!

Google

Denis
12.05.2018
21:34:24
можно конечно сделать так, что модификацию применять по нескольким полям, но тип у них должен быть одинаков
(~&~) = liftA2(>=>)
data A = A { _a :: Int, _b :: Int } deriving Show
makeLenses ''A
a1 = A 10 20
a1 & (a ~&~ b) %~ (*3)

Aleksei
12.05.2018
22:10:55
Почему монады являются эндофункторами? Мы же можем из Monad A сделать Monad B, где A и B - не обязательно один и тот же тип.

Denis
12.05.2018
22:12:20

λoλcat
12.05.2018
22:16:54
чтобы join можно было сделать
Но вот папир, где это не обязательно: https://arxiv.org/abs/1412.7148

kana
12.05.2018
22:19:47

Aleksei
12.05.2018
22:20:15
Понял. А моноидность откуда появилась? Между монадами должна быть какая-то моноидальная опеарция определена, а также нейтральный элемент.

kana
12.05.2018
22:20:29
композиция
перепиши join как естественное преобразование, чтобы увидеть морфизмы в категории эндофункторов
type f ~> g = forall a. f a -> g a
join :: m (m a) -> m a
join :: (m . m) a -> m a
join :: m . m ~> m
pure :: a -> m a
pure :: Identity a -> m a
pure :: Identity ~> m
pure :: 1 ~> m

Denis
12.05.2018
22:22:48
Compose/Identity

Aleksei
12.05.2018
22:24:58
Спасибо

Denis
13.05.2018
09:57:37
https://github.com/tommythorn/Reduceron

Александр
13.05.2018
09:59:25
А я слышал про этот проект.

A64m
13.05.2018
10:25:08
его не так давно кто-то гальванизировал
а, ну собственно это этот форк и есть

Ilya
13.05.2018
12:17:35
Почему люди часто возмущаются функциями head и tail? ?
В этом чате не раз слышал.

Kirill
13.05.2018
12:20:06
частичные функции - способ выстрелить себе в ногу

Alexander
13.05.2018
12:20:55
можно как то в hasql получить имя колонки по идексу аля postgresql-libpq?

Google

patinity
13.05.2018
12:23:17
хаскелл + телеграм бот библиотеки интересно найти, имеет смысл в чат спрошивать или все должно быть на hackage?

Alexander
13.05.2018
12:23:29
ну или вообще как решается типовая задача "распарсить row в рекорд"?

IC
13.05.2018
12:23:50

Alexander
13.05.2018
12:23:59
или в hasql не принято использовать 'select *'?

Alexander
13.05.2018
12:24:18
CC @wormholio
вообще проблемы с head/tail переоценены

Ilya
13.05.2018
12:25:05
частичные функции - способ выстрелить себе в ногу
Эксепшн это выстрел в ногу? Что-то новенькое. По моему понимаю, выстрел в ногу, это когда произошла ошибка, но программа продолжает работать вместо падения. Неаккуратное обращение с указателями в си++, например.

Alexander
13.05.2018
12:25:05
а то некоторые вводят только безопасные варианты с Maybe или хуже того 100500 вариантов, как safe

Ilya
13.05.2018
12:25:13

Alexander
13.05.2018
12:25:20
но проблемы есть
если есть функция foo :: Int -> Int
получить исключение внутри из-за tail печально
но не то, чтобы банить использование функций навсегда
или везде использовать NonEmpty

Ilya
13.05.2018
12:26:42

Andrey
13.05.2018
12:26:48
или дефолтное значение вместе с передавать

Alexander
13.05.2018
12:27:02
Nil возвращать

Ilya
13.05.2018
12:27:05
а что касается варианта с Maybe — с ним так же можно упасть

Alexander
13.05.2018
12:27:08
welcome to clojure

Ilya
13.05.2018
12:27:15
сделав \(Just h) -> h

Google

Ilya
13.05.2018
12:28:29
ну т.е. сигнатура head :: [a] -> Maybe a сама по себе никак не защищает от падения программы. Защищает от падения программы нормальная обработка кейсов Maybe — и Just, и Nothing. Но точно так же можно обработать два случая списка: пустой и не пустой. И в чём разница???

Alexander
13.05.2018
12:28:42
вообще функция по типу которой неочевидно, что она падает это плохо

A64m
13.05.2018
12:28:43

Kirill
13.05.2018
12:29:02

Alexander
13.05.2018
12:29:17
т.е. не надо использовать head где он падает

Andrey
13.05.2018
12:29:29
ошибки не нужны

Ilya
13.05.2018
12:29:38

Kirill
13.05.2018
12:30:01
мой пойнт был про частичные функции

Alexander
13.05.2018
12:30:10
это invariant violation и все такое

Kirill
13.05.2018
12:30:15
ты якобы его переборол введя ещё одну частичную
ССЗБ

Andrey
13.05.2018
12:30:47
добавьте к ним функцию с дефолтным значением, чтобы обходить краевые условия

Ilya
13.05.2018
12:31:25

IC
13.05.2018
12:32:07

Alexander
13.05.2018
12:33:08

Kirill
13.05.2018
12:33:08
1) делать кейс вместо head; 2) заиметь явные гарантии в коде и написать коммент коль хаскель не может вывести; 3) NonEmpty

Alexander
13.05.2018
12:33:49
head нужно использовать только там где он действительно не падает, и есть инвариант
проблема с ним что система типов этот инвариант не энфорсит никак

Andrey
13.05.2018
12:34:31
в пурсе head вернёт Maybe a

Alexander
13.05.2018
12:34:38
исключение нечитабельное

Ilya
13.05.2018
12:34:51

A64m
13.05.2018
12:35:08
нет конечно