@Fsharp_chat

Страница 618 из 772
Vasily
27.06.2018
12:35:01
Так, походу, надо мтпрото телеграма менять

Andrew
27.06.2018
12:35:35
Не в проксях дело

Там у телеги самой какие то траблы

Vasily
27.06.2018
12:36:27
Да, действительно

Google
Vasily
27.06.2018
12:54:20
Такс, у меня есть вопросы по акке

Допустим, есть пользовательская сессия

С некоторым состоянием

КОторое я не хочу хранить в базу

Ayrat
27.06.2018
12:55:00
сделай под неё актора! (это ответ на любой вопрос в акке)

Vasily
27.06.2018
12:55:09
Вопрос

Как мне правильно написать актора, который будет этот стейт хранить

В памяти

Ayrat
27.06.2018
12:55:57
Как обычный класс :D

класс у тебя ж висит в памяти, просто полей туда добавь и всё

Vasily
27.06.2018
12:56:17
Так

Ayrat
27.06.2018
12:56:23
А, F# Chat

вспомнил

Google
Ayrat
27.06.2018
12:56:28
:D

Vasily
27.06.2018
12:56:35
КОгда я делаю actorOf, что происходит?

Если актор уже создан, вернется ссылка на него или создастся новый?

Ayrat
27.06.2018
12:57:06
ща пример скину

ты актору имя задаёшь, по имени (который адрес) он может только один такой быть

Vasily
27.06.2018
12:57:43
Один инстанс?

Ayrat
27.06.2018
12:57:53
по одному ActorPath один актор

но тебе ничего не мешает создавать их так superactor-1 superactor-2 ...

Vasily
27.06.2018
13:00:02
Ну мне и нужен один инстанс, в общем-то

Ayrat
27.06.2018
13:01:47
Ок. если вопрос про то как добавить полей в актора F#, то банально замыканиями накидай let'оф перед рекурсивной функцией

ну обычно короче

Vasily
27.06.2018
13:02:12
А в loop можно стейт передавать,да?

Ayrat
27.06.2018
13:02:30
ну конечно, ты ж его сам объявляешь.

https://github.com/Szer/Akka.FSharp.ActorMonitoring/blob/5675b2a154f3f9bed6ae56cb1b3582dbe5137b1b/src/Akka.FSharp.ActorMonitoring/BaseActor.fs#L22

это совсем уж функциональненько будет - стейты в лупе прокидывать. Можно как хочешь делать в общем

Vasily
27.06.2018
13:04:01
Ну мне важен именно вопрос сохранения стейта внутри сессии

Мда, кто ж так пакеты пишет, подсовываешь Json 11 версии, пишет, что хочет 9-ю О_О

Andrew
27.06.2018
14:24:17
Можно каким либо образом кастить DU типы?

Мб какие то хаки есть

Evgeniy
27.06.2018
14:26:28
Google
Friedrich
27.06.2018
14:27:58
Andrew
27.06.2018
14:30:45
Что ты хочешь сделать?
Ну смотри, у меня есть and BlockStatement = VariablesScope * Statement list И есть and Statement = |... | BlockStatement of BlockStatement Есть парсер для BlockStatement let blockStatement = pipe2 (symbol OPENCURLY >>. localDeclarations) (statements .>> symbol CLOSECURLY) (fun a b -> Ast.BlockStatement (a, b)) Но он возвращает Statement а не BlockStatement Потом из-за того что там Statement на выходе, у меня в AST вместо BlockStatement используется Statement, например and FunctionDeclaration = Identifier * Parameters * TypeSpec * Statement Все бы ничего, но у меня есть функция когда я семантический анализ делаю, которая должна принимать именно BlockStatement, а я не могу этот Statement привести к BlockStatement

Andrew
27.06.2018
14:32:46
match statement with BlockStatement(...) -> dosomething | _ -> failwith "fuck"
Так и думал что можно такой хак с матчингом заюзать. Спасибо

(match blockStatement with Ast.BlockStatement x -> x) Очень костыльно, но теперь не ругается

евроневидимка
27.06.2018
14:34:56
в функцию б вынес

Andrew
27.06.2018
14:36:00
в функцию б вынес
Да, я так и сделал

Просто показал не окончательный вариант)

евроневидимка
27.06.2018
14:36:48
в функции можно заюзать function короче получится

Andrew
27.06.2018
14:36:54
+

Так и сделал

Pavel
27.06.2018
17:00:09
просто меньше) тяжело сказать насколько
ну что. мастер класс покажешь?

Ayrat
27.06.2018
17:40:10
ну что. мастер класс покажешь?
Ток если завтра, я дома не могу за комп сесть. Двое детей это непросто.

евроневидимка
28.06.2018
02:26:10
Так и сделал
Кстати, я недавно охуел и сразу же забыл, что можно сразу писать let block (BlockStatement(x)) = x Вспомнил только щас

Pavel
28.06.2018
02:40:32
в теории можно, на практике нет

евроневидимка
28.06.2018
02:56:48
Ну если где-то потом поймать MatchFailureException, то можно, но проще так вообще не делать

Friedrich
28.06.2018
03:35:17
Зачем его ловить? Юзай этот синтакс в случаях, когда известно наверняка, что всё сматчится.

Я вот так, например, использую в сочетании с однокейсовыми DU: https://github.com/ForNeVeR/nightwatch/blob/2641e1c32a437ece0c12ad047fb2ac3da55651a3/Nightwatch.Core/FileSystem.fs#L13

евроневидимка
28.06.2018
03:42:34
Google
евроневидимка
28.06.2018
03:43:22
А, ну да

Friedrich
28.06.2018
03:43:29
Чтобы мне в Path не передали какие-нибудь левые строки.

евроневидимка
28.06.2018
03:44:00
Чтобы мне в Path не передали какие-нибудь левые строки.
Ну левую строку можно и так передать

Friedrich
28.06.2018
03:44:05
Как?

евроневидимка
28.06.2018
03:44:05
Обернуть только придется

Friedrich
28.06.2018
03:44:15
Ну, если оборачиваешь — значит, думаешь!

евроневидимка
28.06.2018
03:44:24
Правая строка

Evgeniy
28.06.2018
04:32:03
Ну левую строку можно и так передать
Это решается, если сделать конструктор приватным и добавить пару функций для врапа/анврапа.

https://fsharpforfunandprofit.com/posts/designing-with-types-single-case-dus/

Какие еще есть варианты? Классы и хак с тегами для единиц измерений?

Vasily
28.06.2018
06:53:37
Интерфейсы

Roman
28.06.2018
07:57:22


Ayrat
28.06.2018
07:58:09
Молодец он) и @gsomix молодец

Vasily
28.06.2018
08:14:14
Чет не могу понять, как в f# akka правильно стейт актора вернуть

Пишут, что ask это фуфуфу

Ayrat
28.06.2018
08:14:46
Вернуть стейт? Это как? Зачем? Стейт инкапсулирован внутрях

Vasily
28.06.2018
08:15:08
Или всякие репозитории лучше делать традиционно?

Ayrat
28.06.2018
08:15:20
Ща, 5 мин до работы дойду, расскажу и пример покажу

Vasily
28.06.2018
08:15:22
Типа доступа к бд этц

Ayrat
28.06.2018
08:19:52
Почему ask это фуфуфу - Есть причина перформанса. Аск создаёт виртуального актора который будет дожидаться ответа от опрошенного. Если на моей тачиле получается прогонять 4кк месаг в секунду (ин процесс) через tell, то асками в 10 раз меньше. но это не самое главное самое главное что при использовании ask ты должен ожидать того что ответа ты не получишь

Google
Vasily
28.06.2018
08:20:43
Ну это понятно

Ayrat
28.06.2018
08:20:51
аск по умолчанию висит вечно, т.е. актор застопит обработку сообщений. Можно класть таймаут вторым аргументом и ловить ексепшн (акка делает так), можно в конфиге глобальном нгастроить таймаут дефолтный на все аски

как делать следует

точнее начну с другого) асками пользуются те кто не отошёл от процедурного програмирования в модели акторов. Т.е. вызвал процедуру (кинул аск актору), дождался возврата процедуры (ответа актора), работаем дальше. Это нифига не реактивно, стопит обработку мейлбокса, добавляет проблем

Message-driven системы работают не так. У акторов как известно есть 3 супер способности: 1) они могут создать конечное кол-во детей 2) они могут отправить конечное кол-во сообщений другим акторам 3) (важное) они могут поменять своё поведение перед обработкой следующего сообщения

вот про последнюю особенность надо подробнее. Чтобы реализовать вопрос ответ я пользовался стейтами. Например у меня тяжёлая работа с БД в сотню потоков, на каждый поток по актору, каждый такой актор находится в состоянии Busy, Idle. В Busy он все принятые сообщения кладёт в стеш, по окончанию Busy вываливает стеш в мейлбокс, продолжает работу. Так же он знает ActorRef куда надо заслать результат есть акторы которые дожидаются ответа от такого актора, но делают они это тоже реактивно, т.е. сигнализируют другим о своём состоянии ожидания а не тупо вешают себя в ожидании ask. Ответ приходит им в мейлбокс в виде типизированного месаджа SqlResponse например, который они умеют обрабатывать в состоянии ожидания ответа.

Могу пример на C# показать

Vasily
28.06.2018
08:27:25
Ну смотри, у меня есть актор, через который я лезу в базу

У него есть метод List

Как мне правильно результат List вернуть и куда?

Ayrat
28.06.2018
08:28:10
Нене, у актора не бывает методов, у него есть реакции на входящие сообщения

Vasily
28.06.2018
08:28:23
Да, я неверно выразился

Он принимает сообщение List

Ayrat
28.06.2018
08:28:44
Не, метод ты сделать можешь, но лучше сразу мыслить в message-driven стиле, станет проще

Смотри. Тебе приходит List<'a>, ты его обрабатываешь и возвращаешь Sender List<'b> например

сендер может реагировать на сообщения вида List как-то своим образом

Vasily
28.06.2018
08:30:13
Пока выглядит так, что у меня сверху должен быть актор, который действительно принимает списки

Ayrat
28.06.2018
08:30:19
но лучше такие примитивные типы не пересылать, типизируй месаджи

Vasily
28.06.2018
08:30:35
Да это понятно

Ayrat
28.06.2018
08:30:47
А можешь задачу вкратце?

Vasily
28.06.2018
08:31:06
Ну вкратце клиент платежного терминала

Есть список услуг для оплаты

Страница 618 из 772