@haskellru

Страница 1498 из 1551
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

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

Alexander
04.10.2018
14:13:40
если newtype там, то использовать coerce

и не мучаться

если много конструкторов, то generic-lens

Yuriy
04.10.2018
14:14:04
generic-lens
Iso из lens — да. generic — детали

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
Prism я не iso если конструктора боьлше 1
из примера кажется, что там ровно один конструктор. кому нужны частичные функции?

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
почему люди боятся частичных функций
я не боюсь, просто когда я хочу, чтобы программа падала в рантайме, я беру JavaScript

Alexander
04.10.2018
14:16:57
например head для списка

без них конечно всегда лучше

но прятать голову в песок и требовать убарть их все в т.ч. из base/prelude - затея не очень

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

Yuriy
04.10.2018
14:27:56
но прятать голову в песок и требовать убарть их все в т.ч. из base/prelude - затея не очень
я же сейчас не про prelude, а про лямбду в пользовательском коде. а у тебя пригорело

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?
А как он поможет? Есть тред-мониторинг, который данные других тредов собирает. А те крутятся сами по себе

только если разные состояния должны изменяться вместе. если не вместе, то STM не нужен
Ну что значит - вместе. Если они вообще изменяются, и хочется их прочитать, не блокируя ничего

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

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

atomicModifyIORef
это вопрос нужно ли читать все данные транзакционно или нет

Александр
04.10.2018
14:58:58
atomicModifyIORef
Ну можно, конечно. Не очень удобно, но можно

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
это вопрос нужно ли читать все данные транзакционно или нет
Даже если не нужно транзакционно, что мешает использовать STM?

Alexander
04.10.2018
14:59:28
вот я с этого и начал
а, я просто прочитал там "изменяться" а не читаться

IORef пошустрее

и поменьше шума, там atomically писать не надо и все такое

но вообще использовать STM by default это нормально

Yuriy
04.10.2018
15:00:08
а, я просто прочитал там "изменяться" а не читаться
правильно прочитал. но я имел в виду любой доступ, не только modify

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

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

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
IORef пошустрее
readTVarIO вроде такой-же

Alexander
04.10.2018
15:02:17
IORef (Map ThreadID IORef)

readTVarIO вроде такой-же
возможно, это не мерял

вообще 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
IORef (Map ThreadID IORef)
А первый IORef зачем?

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 как есть

Alexander
04.10.2018
15:16:30
мы ж задачи не знаем

просто я сказал, что возможно стоит подумать в сторону где тред уведовляет об изменениях через канал

мониторящий тред смотрит канал если надо и что-то делает

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

Страница 1498 из 1551