
Alexander
04.10.2018
11:36:28
wreq с линзами
как первую либу я даже не знаю можно ли его предлагать
кто тут auth0 спрашивал?
https://github.com/alasconnect/auth0

Google

A64m
04.10.2018
13:08:22
не ожидал, что хаскелист станет такие вещи делать, конечно
https://haskell-code-explorer.mfix.io/package/lens-4.16.1/show/src/Control/Lens/Indexed.hs#L425

Yuriy
04.10.2018
13:10:50

A64m
04.10.2018
13:11:08
речь не про строку, а про то, что ее показывает

Artem
04.10.2018
14:11:38
Всем привет.
Есть ли в Haskell способ сделать деструктуризацию значения из конструктора полиморфно?
Хотелось бы вместо этого:
chatId' = (\(ChatId id) -> show id) . chatId . messageChat <$> mСделать что-то вроде этого:
chatId' = show . UNPACK_CONSTRUCTOR_FN . chatId . messageChat <$> m

Alexander
04.10.2018
14:12:03
generic-lens

Yuriy
04.10.2018
14:12:59

Alexander
04.10.2018
14:13:40
если newtype там, то использовать coerce
и не мучаться
если много конструкторов, то generic-lens

Yuriy
04.10.2018
14:14:04

Alexander
04.10.2018
14:14:39
Prism я не iso если конструктора боьлше 1

Denis
04.10.2018
14:14:39
в линзах это Wrapped

Alexander
04.10.2018
14:15:09
chatId = coerce . chatId . messageChat <$> m

Google

Artem
04.10.2018
14:15:19
Спасибо ?

Alexander
04.10.2018
14:15:19
coerce FTW

Yuriy
04.10.2018
14:15:31

Alexander
04.10.2018
14:15:38
мне
почему люди боятся частичных функций

Artem
04.10.2018
14:15:59
Топовый чат у Вас.
Не только помогут, а и расскажут о нескольких вариантах и их различиях :)

Alexander
04.10.2018
14:16:08
спасибо

Artem
04.10.2018
14:16:19
Что за частичные функции?

Alexander
04.10.2018
14:16:49
которые не выдают значения, а ломаются на определенном множестве параметров

Yuriy
04.10.2018
14:16:52

Alexander
04.10.2018
14:16:57
например head для списка
без них конечно всегда лучше
но прятать голову в песок и требовать убарть их все в т.ч. из base/prelude - затея не очень

A64m
04.10.2018
14:24:41
я понимаю, почему люди боятся частичных функций, я не понимаю почему они боятся особенно или даже исключительно крайне узкой их разновидности в языке где чуть менее чем все функции такие

Yuriy
04.10.2018
14:27:56

Alexander
04.10.2018
14:29:43
не у меня просто проект долго компиляется

∀
04.10.2018
14:55:57
Мне нужно в несколько тредов делать IO, и у каждого треда должно быть состояние, которое обновляется, и должен быть главный тред, который по таймеру собирает самые актуальные состояния тредов.
Есть какой-нибудь design pattern для этого случая, или, может быть, библиотека?

Александр
04.10.2018
14:56:47
Я бы STM запользовал

Denis
04.10.2018
14:57:02
async?

Yuriy
04.10.2018
14:57:36
Я бы STM запользовал
только если разные состояния должны изменяться вместе. если не вместе, то STM не нужен

Google

Александр
04.10.2018
14:57:38
async?
А как он поможет? Есть тред-мониторинг, который данные других тредов собирает. А те крутятся сами по себе

Alexander
04.10.2018
14:58:24
STM нужен

Yuriy
04.10.2018
14:58:30

Alexander
04.10.2018
14:58:35
паттерна не видел

Александр
04.10.2018
14:58:58

Yuriy
04.10.2018
14:59:06

Dmitry
04.10.2018
14:59:12
если newtype там, то использовать coerce
Я даже реализовал в relude несколько полезных утилитных фуцнкций на основе Coercible по работе с ньютайпами. Можно примеры здесь посмотреть:
http://hackage.haskell.org/package/relude-0.3.0/docs/Relude-Extra-Newtype.html

Александр
04.10.2018
14:59:27

Alexander
04.10.2018
14:59:28
IORef пошустрее
и поменьше шума, там atomically писать не надо и все такое
но вообще использовать STM by default это нормально

Yuriy
04.10.2018
15:00:08

Александр
04.10.2018
15:00:12
Ну, это уже пошли неявные предположения о требованиях, которые озвучены не были

Yuriy
04.10.2018
15:00:13
на ум приходит что-то вроде Map ThreadId IORef

Alexander
04.10.2018
15:00:36

∀
04.10.2018
15:00:37

Alexander
04.10.2018
15:00:50
MVar дороже IORef

Google

Alexander
04.10.2018
15:00:56
будет блокировка

∀
04.10.2018
15:00:58

Alexander
04.10.2018
15:01:04
@cblp_su предложил forkIO + IORef
вообще forkIO + какая-то структура поверх STM/IORef/MVar на выбор
Map ThreadID IORef вполне норм

Leonid
04.10.2018
15:02:13

Alexander
04.10.2018
15:02:17
IORef (Map ThreadID IORef)
вообще STM по умолчанию вполне норм

∀
04.10.2018
15:05:21
Ок, пока буду использовать IORef. Транзакции и блокировки мне не нужны точно.

Yuriy
04.10.2018
15:06:46
если одна нить пишет, а другая читает, то нужна атомарность

Alexander
04.10.2018
15:07:06
ты ж не в вектор пишешь вещи больше слова
так.. стоп, я чего-то imply-ю что другие думают
в общем если тебе нужно единомоментный срез всех состояний
то тогда нужны транзакции
т.е. пока ты читаешь состояние одного треда - состояние других поменяется
если хочется это исключить,то нужны транзакции
в так IORef дает нужную атомарность

∀
04.10.2018
15:09:22

Alexander
04.10.2018
15:09:47
в целом:
r <- mkRegistry
..
forkWithUnmask $ \release -> )register r »= release . runStuff x) `finally` unregsiter r)

Google

Alexander
04.10.2018
15:10:11
где mkRegistry это newIORef Map.empty
register r = myThreadId »= \x -> newIORef emptyState »= \s -> atomicallyModifyIORef r (Map.insert x s) » pure s

∀
04.10.2018
15:11:20

Alexander
04.10.2018
15:11:42
если у тебя не главный тред форкает и отстанавливает
то тогда у тебя хранилище это тоже shared струтура
и тред который мониторит должен получать обновления
(обновил код выше)
unregister r = myThreadId »= atomicallyModifyIORef' r . Map.delete
что-то такое, писал сразу в чятик

Yuriy
04.10.2018
15:14:26
и вместо ThreadID может быть ключ поближе к задаче

Alexander
04.10.2018
15:14:36
да

∀
04.10.2018
15:14:38
Спасибо.

Alexander
04.10.2018
15:14:52
ещё можно предложить вообще решение вбок - и скидывать состоояние в канал какой
внутри треда же состояние не обязано в изменяемой переменной жить

Yuriy
04.10.2018
15:15:48
если состояние "готово — не готово", то вообще async как есть

∀
04.10.2018
15:16:18

Alexander
04.10.2018
15:16:30
мы ж задачи не знаем
просто я сказал, что возможно стоит подумать в сторону где тред уведовляет об изменениях через канал
мониторящий тред смотрит канал если надо и что-то делает

Александр
04.10.2018
15:17:28
В STM каналы тоже есть, ага