Denis
Кидай
Doge
Кидай
Так, у меня новая задачка для знатоков. Есть такой вот код с кучей associated типов, проблема в том, что хочется как-то убедить раст, что non_empty_somethings_ids, никак не зависит от &mut StateType по времени жизни в данном примере. Вот пример: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=386226d4945549bf2ef7d8abe5ae219f Обходные пути понятны: 1. Возвращать вместо итератора сразу Vec<SomethingId> 2. Чуть поменять структуру кода и делать вот так: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=3f03f5b4cc24b1fbfe0e913ca857bf5d 3. Попробовать взять GAT, но они не стабильны пока: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=933998b431ceb9ffc6c21c1233464483 Хочется максимально сохранить первоначальный вариант и использовать именно associated типы.
Doge
В итоге я остановился на первом из обходных вариантов, но в реальном коде чуть хуже смотрится
Doge
Ну и да в реальности логика там чуть сложнее, внутри if хитрый кусок с выбором того, что и как именно пойдет в хэшсет
Anatoly
ок. я хочу попробовать заново резалт-монаду
Anatoly
есть три кейса: 1. Ok (access_token, refresh_token) 2. Unauthorized 3. HttpError (status_code, reason_phrase)
Anatoly
как благородные доны предлагают это в C# изобразить?
Ilya
TripleResult<Z, I, O>
Ilya
(извините, у меня несмешные шутки)
Doge
Что то какая то сложная магия
На работе с Associated типами половина раста построена.
Hog
Это перл?
Полегче!
Ilya
Я специально :)
Ilya
А как вот ту штуку с тройным резалтом сделать-то? DU через абстрактные классы и лямбды передавать, которые будут определять, каким образом надо респонс распарсить и вернуть?
Anatoly
корявенький, но какой есть
Anatoly
Ilya
Ну паттерн матчинг уже на стороне обработчика типизированного ответа будет, как я понимаю. Но вообще, я пытаюсь перевести F# в C#, а это не очень хорошо работает, наверное.
Mikhαil
Да не, в 8 шарпе он помощнее же
Mikhαil
Гораздо
Anatoly
Да не, в 8 шарпе он помощнее же
скрин с документации, сорян, какая есть
Ilya
Да там только синтаксис с => завезли, вроде бы?
Mikhαil
скрин с документации, сорян, какая есть
Ну это явно не то. Там лямбда синтаксис привезли и дополнили мэтчинг
Anatoly
Ну это явно не то. Там лямбда синтаксис привезли и дополнили мэтчинг
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#more-patterns-in-more-places
Mikhαil
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#more-patterns-in-more-places
А принял. Просто то что ты скинул было уже в седьмом) Поэтому я и сказал что в восьмом он побогаче
Mikhαil
Да там только синтаксис с => завезли, вроде бы?
А по свойствам матчинг {IsSuccess: true} =>
Mikhαil
В седьмом такого не было
Ilya
ну, туплы надо погонять, щас
Ну чот такое. В одном месте этим можно воспользоваться, но на общее решение не тянет, имхо.
Anatoly
я пока хочу посмотреть что получится.
Ilya
Да и на монаду это не похоже, вроде бы? Хотя пофиг, конечно.
TOV_MULTIMASSO
Сделать как Either
Ilya
Туплы?
TOV_MULTIMASSO
TOV_MULTIMASSO
Что - туплы?
Mikhαil
Я делал резалт со значением в поле Data или ошибкой в поле Error где Error это бизнес ошибка в виде du И собирал паттерн матчингом Но там два уровня матчинга получились
TOV_MULTIMASSO
А, результата операции же не нет
Ilya
Ой, пофиг.
TOV_MULTIMASSO
Unauthorised/HttpError - и то и другое является ошибками
Ilya
А три кейса, как я понимаю, потому что первые 2 -- это типа бизнес-штуки, а 3 уже что-то непонятное.
Anatoly
401 - у тебя токен говно
Anatoly
всё остальное - не пойми что, сеть плохая, сервер умер, етс, можно ретрайнуть
Ilya
Ну это всё равно можно неплохо записать, типа match response with Ok -> Error(code, reason) when code = 401 -> _ ->
Mikhαil
А чо мешает сделать du из класса ок, анавторайзд и статускод?
Mikhαil
И в ок заворачивать данные если надо
Ilya
На сишарпе это не очень, но такой вариант я с самого начала предложил)
Mikhαil
Если очень хочется разделить на три типа
TOV_MULTIMASSO
Тип-то один
Ilya
Хотя райдер тот же справляется с генерацией вариантов во время паттер матчинга.
Igor
нафига 401 отделять от остальных кодов?
Mikhαil
Тип-то один
Ещё раз - почему не сделать базовый тип резалт и от него отнаследовать три кейса которые описал Анатолий и обрабатывать паттерн мэтчингом. Не оч понимаю
Mark
как вы справляетесь с желанием отрефакторить свои старые петы?
Ayrat
есть три кейса: 1. Ok (access_token, refresh_token) 2. Unauthorized 3. HttpError (status_code, reason_phrase)
я тут не вижу монаду, т.к. не могу придумать операции над типами, котоыре монада в себе держит
Mikhαil
Ну и у меня больше про бизнес ошибки
Mikhαil
В командах и квери
Ilya
Можно вообще вокруг реквеста накрутить вариантов на сколько угодно вариантов. Хотя на каждый код ответа.
Ayrat
я тебе весь домен должен рассказать? :)
нет, но чот на монаду тут надо будет натягивать
Anatoly
нет, но чот на монаду тут надо будет натягивать
если ок, мы делаем нашу бизнес-магию если 401, мы говорим "иди перелогинься" если всё остальное - пока не ясно
Nuxs🏴‍☠️
Зачем монады в мультипарадигменном программировании?
Anatoly
Ilya
Паттерн матчинг?🤔
Ayrat
монада это ж моноид в категории блаблабла а моноид подразумевает бинарные замкнутые операции над типом!
Nuxs🏴‍☠️
Anatoly
хочу прикрутить DU для Result
Ayrat
ну вот если ты сможешь придумать pure: T -> Result flatmap: Result.Ok -> Result то у тебя монада
Ayrat
(ну почти, там ещё пара законов)
Anatoly
у тебя (2) - это частный случай (3)
мне уже объяснили, я почти склонен согласиться. вопрос в том, как бы это накодить.