Anonymous
которые сорок раз return пишут в Хаскеле чтоб подняться на урвоень IO
Ayrat
def splitErrors[ T[_]: Traverse: Alternative, F[_]: Functor, G[_]: Applicative, E, A](ls: T[F[A]])( implicit errors: ErrorsTo[F, G, E] ): G[(T[E], T[A])] = ls.traverse(_.attemptTo[G, E]).map(_.partitionEither(identity)) def parseInt[F[_]: Applicative: Raise[*[_], String]](s: String): F[Int] = s.toIntOption.orRaise(s"could not parse $s") type Calc[A] = EitherT[Eval, String, A] splitErrors[Vector, Calc, Eval, String, Int]( Vector("1", "hello", "2", "world", "3").map(parseInt[Calc]) ).value
Ayrat
с сайта тофу - простой пример как распарсить инт!
Ayrat
простой же
Ayrat
всё понятно
Ayrat
чо тут непонятного
Anonymous
пиздец
Vasily
Нижников, канеш, сильно дохуя умный, но долбоеб
Ayrat
долбоёб, да
Ayrat
Его бы энергию да в мирное русло
Vasily
Ну он очарован математикой
Anonymous
и все таки блять - как вы логгируете в своих ЭфШарпах? просто принимаете логгер параметром?
Vasily
Например
Vasily
Тупо ссылка на модуль
Ayrat
статичный класс может быть модулем, да
Dr. Friedrich
Тупо ссылка на модуль
Я так делал, а потом начал разделять логгеры по функциональности, и пришлось всё-таки через параметры передавать.
Anonymous
ну я так и думал, да. но в итоге все равно приедтся через DI
Anonymous
так что наверно лучше сразу
Dr. Friedrich
У меня там логи от телеграма в одну папочку валятся, а от XMPP в другую, очень удобно.
Николай
У меня там логи от телеграма в одну папочку валятся, а от XMPP в другую, очень удобно.
В каком-нибудь серилоге же можно через конфигурацию синков настроить, в аппсеттингсе
Ayrat
можно ещё так module MyBusinessLogic = private static let logger = NLog(Serilog).create “MyBusinessLogic”
Ayrat
ну то есть по месту создать статичный инстанс и хуй забить
Николай
А логировать всё через один статический логгер
Dr. Friedrich
В каком-нибудь серилоге же можно через конфигурацию синков настроить, в аппсеттингсе
https://github.com/codingteam/emulsion/blob/8e1d410502d79f7a6a915147d17edd6e62d824e0/Emulsion/Logging.fs#L24-L25
Николай
Да, понял
Dr. Friedrich
А логировать всё через один статический логгер
А как он будет понимать, что в какую категорию складывать?
Dr. Friedrich
У меня просто, например, такое есть, что из одной и той же функции нужно либо туда, либо суда.
Анна
Не, там "я пошёл отсюда", но так можно только к младшему или близкому другу. Ещё я бы убрала местоимение и "отсюда", а глагол из будущего времени поставила бы в настоящее 🤔 будет просто "ухожу". То, что уходишь именно ты, и отсюда - подразумевается и так
Анна
Ага, типа «пошёл ты»?
Dr. Friedrich
Я устал, я ухожу!
Ayrat
Я устал, я ухожу!
ну да, ты уже старый, тебе б на покой
Ayrat
Тебе ж наверное уже за 30, а там жизни нет
Dr. Friedrich
Log.Logger1, Log.Logger2
Ок, да, так можно :)
Vladimir
я в пульсаре логаю правда все в один логгер, слишком удобно)
Vladimir
но наверное есть кейсы когда в разные логгеры нужно
Vladimir
нет, как статическое мутабл поле
Vladimir
т.е. юзер пишет Pulsar.Logger <- his logger
Vladimir
а я везде юзаю его через Log.Logger
Vasily
Статическое мутабл поле - лучший DI
Vasily
На самом деле
Igor
Статическое мутабл поле - лучший DI
чорт, я же недавно спрашивал про это и я все удалил
Roman
статическое мутабл поле — это глобальная изменяемая переменная. Я не знаю, в какой вселенной это что-то благое
Roman
Тем более, что в фшарпе можно легко получить вменяемый DI, который валидируется в компайл тайме и работает без какой-либо магии и овер инжиниринга.
Anonymous
Тем более, что в фшарпе можно легко получить вменяемый DI, который валидируется в компайл тайме и работает без какой-либо магии и овер инжиниринга.
А когда ты пишешь DI, подразумеваешь контейнер или руками прикидывать нужные параметры при вызове фций?
Vasily
@atsapura , код кидай, поглядим, зададим вопросы
Roman
А когда ты пишешь DI, подразумеваешь контейнер или руками прикидывать нужные параметры при вызове фций?
Ну у нас это собирается под одним интерфейсом IAppEnv. При желании, для него можно сделать дробление типа IMasterDb, IPaymentGateWay etc., а сам IAppEnv заставить наследовать все это. А дальше в функцию, где тебе это нужно, ты прокидываешь первым параметром либо IAppEnv целиком, либо IMasterDb, если датабазы достаточно. IMasterDb у нас имеет методы вида GetProductItem: string -> Async<ProductItem option>.
Roman
Благодаря object expressions такие интерфейсы можно налету заимплементить в вашем AppEnv, что мы и делаем у себя)
Roman
@atsapura , код кидай, поглядим, зададим вопросы
Я уточню, не нарушает ли это наш NDA, и если все ок, выложу семплы
Roman
т.е. надо прикинуть энв везде где нужен логгер, не сказать что это удобно
как я сказал, если нужна гранулярность, ее легко сделать. И будешь прокидывать не целиком энв, а ILog, у которого будет проперти ILogger
Roman
а твой IAppEnv будет наследоваться от этого ILog, и будет наружу выставлять Ilogger свой
Roman
твоя же функция ничего об этом знать не будет, она будет принимать параметр log: #ILog
Vladimir
удобнее всего когда прокидывать не надо ничего) я бы сказал что логгер это исключение
Vladyslav
я так понял речь о https://bartoszsypytkowski.com/dealing-with-complex-dependency-injection-in-f/ там и код можно глянуть
Roman
я так понял речь о https://bartoszsypytkowski.com/dealing-with-complex-dependency-injection-in-f/ там и код можно глянуть
Да, идея спизжена оттуда. Мы у себя ее использовали не в чистом виде, а чуток подтюнили под свои нужды. Но сутенька оттуда
Vasily
т.е. хардкодить все зависимости или что?
Не вижу особо ничего криминального
Roman
для каких-то тривиальных случаев можно и захардкодить. Если есть хорошее разделение логики (которую отдельно легко покрыть тестами) и ИО, то да, ио часто можно хардкодить. Но если нужно проверить нетривиальный сценарий, где логику и ио разделить нельзя никак, то возможность отрезать реальное окружение сильно облегчает тестирование
Roman
с другой стороны, тривиальные случаи нередко вырастают со временем в мясо, а тестируемость туда никто не добавляет)
Vladislav
@omgszer а каким гит клиентом на маке пользуешься?
Aleksandr
Я помню, он говорил, что fork
Roman
Звучит как зио
это хорошо или плохо?
Vladislav
Хз
Vladislav
Я не знаток дырок в скале
Roman
ну тут никаких дырок нет
Vladislav
Обычный composition root который сам собираешь
Vladislav
Чем это лучше прокидывания контейнера непонятно
Vladislav
Или обжект локатора статичного
Vladislav
Или как его там
Roman
сервис локатор это зло