
Misha
07.02.2017
23:02:02
почему документация говно?
в смысле устарела?
или просто misleading

Anatolii
07.02.2017
23:02:21
@qnikst это конечно полезнее

Google

Alexander
07.02.2017
23:02:21
т.к. её подробно никто не писал она неконсистентная
в смысле прочитать то можно, но скорее всего это мало что даст

Misha
07.02.2017
23:02:42
все плохо!

Alexander
07.02.2017
23:02:44
а будет бардак в голове
да
:/
сейчас тим вернулся он очень деятельный пока
если не пропадёт обещал поразбираться с документацией
сейчас попробую перечитать вопрос и ответить

Misha
07.02.2017
23:03:32
книжка марлоу, которая про concurrency?
там вроде последняя глава только про CH

Alexander
07.02.2017
23:03:57
ну там очень хорошее описание
тем более что другие главы тоже полезны

Google

Alexander
07.02.2017
23:04:21
давай я про задачу ещё спрошу, я не очень понял
что именно и где мы хотим запускать и делать
.. как быстрый ответ скорее всего что-то руками придётся писать, но не много

Misha
07.02.2017
23:09:32
мы хотим чтобы у нас на node1 и node2 (для простоты пусть два) был стейт (или кэш). Мне надо чтобы стейт обновлялся и на обоих узлах при входящем событии (когерентность их между собой можно пока отложить). То есть первое что приходит в голову, это держать на каждом узле по процессу (или пулу процессов), которые получают эти события через receive или канал и обновляют стейт. С другой стороны, хочется пользоваться более высокоуровневыми вещами, типа call/spawn.
мда, сбивчиво

Alexander
07.02.2017
23:10:51
в новые процессы нужно передавать весь стейт или они могут как с ets или как его там работать?
поидее ничего не запрещает использовать call, spawn если замыкание "будет знать" как получить стейт на ноде

Misha
07.02.2017
23:11:47
да, но стейт возможно большой и его нельзя перекачивать между узлами

Alexander
07.02.2017
23:11:47
его можно получить "чисто" запрашивая локальный процесс, по имени, например

Misha
07.02.2017
23:12:04
тактак

Alexander
07.02.2017
23:12:14
смотри, на ноде делаешь процесс
используешь register и регистрируешь его на ней

Alex
07.02.2017
23:12:40
Вечер в чат
http://haskellbook.com/ - кто-нибудь смотрел уже?

Alexander
07.02.2017
23:12:48
замыкание которое ты посылаешь на ноду - будет делать whereis, и общаться с этим процессм

Misha
07.02.2017
23:13:15
ага

Alexander
07.02.2017
23:13:16

Alex
07.02.2017
23:13:28

Alexander
07.02.2017
23:13:32
1. ты просто посылаешь этому процессы GetFoo, UpdateBar и какой-то честный протокол

Google

Alexander
07.02.2017
23:14:05
это совсем безопасный вариант полностью в d-p

Misha
07.02.2017
23:14:45
да, это первое что пришло в голову

Alexander
07.02.2017
23:14:51
2. ты посылаешь запрос ShareStateToMe Pid, и от отправляет тебе в ответ какую-нить IORef/STM, несериализованное значение
там в unsafe есть, и где-то в extras хэлперы

Misha
07.02.2017
23:15:27
unsafe непедагогично

Alexander
07.02.2017
23:15:30
это не очень безопасно и один небольшой unsafe кусок будет
если тебе нужен большой и главное мутабельный стейт, то этот путь норм
дальше

Misha
07.02.2017
23:16:21
а, понял, то есть внутри узла заставлять их общаться, пересылая ссылку, без сериализации?

Alexander
07.02.2017
23:16:22
есть совсем грязный вариант
угу
это если аккуратный вариант медленно или не работает (мутабельность)

Misha
07.02.2017
23:17:31
ясно

Alexander
07.02.2017
23:17:32
и самый грязный:
foo :: MVar MonoType
{-# NOINLINE foo #-}
foo = unsafePerformIO $ newMVar ""
но так лучше не делать :)
если только совсем уж приспичит

Misha
07.02.2017
23:18:02
я думаю, пойду по варианту 1 :)

Alexander
07.02.2017
23:18:06
угу
самый логичный, перейти в другие всегда успеешь

Misha
07.02.2017
23:18:55
а есть какие-то паттерны насчет того, чтобы держать на узле пул процессов?

Google

Misha
07.02.2017
23:19:12
один воркер со стейтом немасштабируется
то есть в реальности я не буду один процесс держать на узле для обновления стейта

Alexander
07.02.2017
23:20:49
в платформе вроде есть
но я бы сам написал

Misha
07.02.2017
23:21:18
в принципе должно быть несложно, но очень легко налететь на какой-нибудь bottleneck
понятно, что просто round robin какой-нибудь и все

Alexander
07.02.2017
23:24:11
ну я не очень знаю задачу
так что сказать не могу
если что work-stealing делается просто

Admin
ERROR: S client not available

Alexander
07.02.2017
23:24:32
вроде у WT в блоге было
http://www.well-typed.com/blog/74/
если не ошибаюсь

Misha
07.02.2017
23:25:26
о, круто, спасибо
я попробую чего-нибудь набросать, наверняка вылезет что-нибудь неожиданное
спасибо

Alexander
07.02.2017
23:38:13
к. если что пиши

Misha
07.02.2017
23:38:34
ага

Aldar
08.02.2017
08:23:18
Привет, что то туплю, посчитал бесконечный список чисел Фибоначчи,
Prelude Control.Applicative> fib = 1:1:(map (\(x,y) -> x + y) $ zip fib (tail fib))
Prelude Control.Applicative> take 10 fib
[1,1,2,3,5,8,13,21,34,55]
а теперь надо посчитать последовательность вида a[k] = a[k-1] + a[k-2] - 2a[k-3]

Google

Aldar
08.02.2017
08:25:24
seq2 = 1:2:3:(map (\(n1,n2,n3) -> n2 + n3 - 2 * n1) $ zip3 seq1 (tail seq1) (tail $ tail seq1))
take 10 seq1
[1,2,3,1,1,-2,0,-3,2,-3]
четвертый элемент должен быть ( 3 + 2 - 2*1) = 3
но почему то 1
то есть получается у меня три списка
[1,2,3]
[2,3]
[3]
я их зипую получается [(1,2,3)], потом после map должно получится [3]
Prelude Control.Applicative> list = [1,2,3]
Prelude Control.Applicative> tail list
[2,3]
Prelude Control.Applicative> tail $ tail list
[3]
Prelude Control.Applicative> zip3 list (tail list) (tail $ tail list)
[(1,2,3)]
Prelude Control.Applicative> list2 = zip3 list (tail list) (tail $ tail list)
Prelude Control.Applicative> map (\(n1,n2,n3) -> n2 + n3 - 2*n1) list2
[3]
то есть 3, верно
take 4 seq1
[1,2,3,1]
но тут дает 1
блин я идиот, надо было писать take 4 seq2
четвертый элемент верно вычисляет, но 5 нет,
Prelude Control.Applicative> take 5 seq2
[1,2,3,3,0]


Igorek
08.02.2017
08:48:51
А чё ты без аккумулятора считаешь? ) там по заданию с ним надо делать ;)

Aldar
08.02.2017
08:50:29
через бесконечный список

Олег
08.02.2017
08:51:48

Aldar
08.02.2017
08:52:36
работает
Prelude Control.Applicative> seq2 = 1:2:3:(map (\(n1,n2,n3) -> n2 + n3 - 2 * n1) $ zip3 seq2 (tail seq2) (tail $ tail seq2))
Prelude Control.Applicative> take 10 seq2
[1,2,3,3,2,-1,-5,-10,-13,-13]
Prelude Control.Applicative> take 20 seq2
[1,2,3,3,2,-1,-5,-10,-13,-13,-6,7,27,46,59,51,18,-49,-133,-218]

Олег
08.02.2017
08:54:08
^_^

Aldar
08.02.2017
08:55:12
дорешиваю то что в прошлом году не успел)

Andrew
08.02.2017
12:44:46

Alexander
08.02.2017
12:45:05
` <- таким обрамить