
Alexey
27.09.2017
11:19:54
нефига

Dmitry
27.09.2017
11:20:13
94

Andrey
27.09.2017
11:20:35
не подсказывай

Sergey
27.09.2017
11:21:41
не, серьезно, что за издевательство над людьми?

Google

Sergey
27.09.2017
11:22:01
я по другому это назвать не могу

Alexey
27.09.2017
11:22:15
вот поэтому, я и не тестирую с боевого акка )

Andrey
27.09.2017
11:22:24
Серега должен страдать

Sergey
27.09.2017
11:22:40

Dmitry
27.09.2017
11:22:58
107

Alexey
27.09.2017
11:23:14
а почему он его несколько раз спрашивает? ты его разбаниваешь чтоли?

Dmitry
27.09.2017
11:23:22
ну конечно
так я тебя тоже разбанил

Alexey
27.09.2017
11:23:30
а меня не разбанил
а. спасибки

Dmitry
27.09.2017
11:24:42
Я короче вместо того чтобы добавить сообщение при кике

Google

Dmitry
27.09.2017
11:26:26
Удалю сообщение на присоединение
вот такое
И если кого-то кикнули - то как не бывало

Andrey
27.09.2017
11:26:58
+1

Alexey
27.09.2017
11:27:28
ну. только в трее останутся циферки, что есть новые сообщения. зайдешь, а их нету

Dmitry
27.09.2017
11:28:18
Да, в нотификациях
Можно будет добавить /stat@BucklerBot
Когда нибудь

Sergey
27.09.2017
11:29:41
еее
В телеграммовском клиента под линупсы баг, судя по всему.
Если тебя забанили, а после разбанили, и ты пытаешься вернуться группу, то увы, ты не увидешь сообщения, адресованные тебе.
В итоге, я заходил в группу и не видел сообщений от бота.
Пытался что-то написать, а он меня - хопача- и банил.
move it away and try again

Константин
27.09.2017
11:44:23
у нас и так админов достаточно, елси появляются активисты - я сразу предлагаю админство
но с ботом полностью отпадает необходимость иметь админов)))
Красота))


Dmitry
27.09.2017
12:06:01
tldr: Рационально ли использовать raise для выхода из пайплайна?
Задача такая: есть функция, где один из аргументов - список, и нужно убедится что этот список содержит элементы одного типа (integer к примеру). А после валидации там длинный пайплайн. Т.е. validate_list(list) |> do_stuff() |> do_another_stuff() ... и т.д. И естественно желание такое, что если валидация фейлится у нас функция должна сразу возвращать еррор. Ну и первое что мне пришло в голову это делать raise ArgumentError. Норма ли это или есть решения лучше?
Гварды не воспринимают Enum.all, а макрос писать - оверкилл. Сомнения по поводу рейза от того что в интернетах пишут, мол его редко используют, валит процессы и все такое.
может у меня вообще вкорне неверный подход к валидации аргументов, так что буду рад если поясните. А то у меня желание сделать так от привычки использовать промис чейн из js)

Dmitry
27.09.2017
12:07:37
Может тогда with использовать?

Nikolay
27.09.2017
12:08:21
+1

Dmitry
27.09.2017
12:08:25
with {:ok, validated} <- validate_list(list), .... else {:error, {:wrong_parameters, _}} -> ... end

Google

Dmitry
27.09.2017
12:08:33
Что-то в таком духе

Dmitry
27.09.2017
12:08:40
думал, но как это подвязать на то что у меня список вылидный если он содержит либо строки либо интеджеры, и логика в одной из функций разная
в зависимости от стринг/инт

Nikolay
27.09.2017
12:08:59
либо делай так, что бы твоя следующая фукнция в пайпе принимала турпл {:ok, value} {:error, []}

Dmitry
27.09.2017
12:09:07
т.е. мне из функции валидации надо еще возвращать тип

Dmitry
27.09.2017
12:09:31
Можешь в валидации приводить к одному типу

Nikolay
27.09.2017
12:09:31
ну и матчся на эти :ok, :error

Dmitry
27.09.2017
12:09:32
{:ok, type, validated} <- validate_list(list)

Dmitry
27.09.2017
12:09:43
Как делает changeset.cast
Он и валидирует и приводит

Dmitry
27.09.2017
12:10:10

Dmitry
27.09.2017
12:10:40
Ну это же монада стандартная

Dmitry
27.09.2017
12:10:51
Тогда вопрос следующий - когда вообще raise используется? И зачем в эликсире есть к примеру ArgumentError?

Dmitry
27.09.2017
12:10:57
Каждая функция в пайпе принимает либо данные либо ошибку
И ошибку пробрасывает дальше
А данные преобразовывает

Dmitry
27.09.2017
12:12:03
Ну это же монада стандартная
блин, вот это сильно. Не знал что changeset - часть эликсира. Надо попробовать. Я когда работал с экто мне понравилась идея ченджсета

Dmitry
27.09.2017
12:12:22
Changeset это не часть эликсира
Я про другое

Google

Dmitry
27.09.2017
12:12:53
Обычная option монада

Dmitry
27.09.2017
12:13:08
а

Dmitry
27.09.2017
12:13:34
https://fsharpforfunandprofit.com/rop/
Почему сделали with вместо такой милой штучки дрючки для меня навсегда останется загадкой
Хотя with по своей сути то же самое

Alexey
27.09.2017
12:20:26
на самом деле подходов два. пользуй любой. либо в rail паттерн заворачивай. либо ошибки лови
в первом случае, все ф-ии в цепочке должны принимать либо {:ok, data} либо {:error, reason}. ошибку пробрасывать дальше, а если ОК, то вычислять и результат отдавать дальше
во втором случае, идут чистые данные, без кортежа, но throw если что-то не так

Dmitry
27.09.2017
12:22:33
Просто в стандартную либу если бы накидали столько методов сколько в расте
Там и option
Там и result
Там и unwrap
И всевозможные if_some, then_result
А ещё какой нибудь модифицированный Enum
Чтобы вида {:ok, listA} мапил на {:ok, listB}
Было бы вообще супер пупер

Dmitry
27.09.2017
12:34:04
спасибо за ответы, попробую railway

Nikolay
27.09.2017
12:41:45

Dmitry
27.09.2017
12:42:40
http://www.zohaib.me/monads-in-elixir-2

Den
27.09.2017
14:08:36
супер, почитаю про монадки)

Google

Dmitry
27.09.2017
14:09:16
супер, почитаю про монадки)
This post is not about what monads are, I expect that you already know about them. The post is to see how you can use monads in Elixir using already created libraries.
для новичков в теме была очень крутая статья про fantasyland spec, хоть и с уклоном на js
есть даже перевод на русский

Dmitry
27.09.2017
14:10:29
http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html
лучшея статья
с картинками