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
Например
Dr. Friedrich
Vasily
Тупо ссылка на модуль
Ayrat
Ayrat
статичный класс может быть модулем, да
Dr. Friedrich
Тупо ссылка на модуль
Я так делал, а потом начал разделять логгеры по функциональности, и пришлось всё-таки через параметры передавать.
Anonymous
ну я так и думал, да. но в итоге все равно приедтся через DI
Anonymous
так что наверно лучше сразу
Dr. Friedrich
У меня там логи от телеграма в одну папочку валятся, а от XMPP в другую, очень удобно.
Николай
Ayrat
можно ещё так
module MyBusinessLogic =
private static let logger = NLog(Serilog).create “MyBusinessLogic”
Dr. Friedrich
Ayrat
ну то есть по месту создать статичный инстанс и хуй забить
Николай
А логировать всё через один статический логгер
Николай
Да, понял
Dr. Friedrich
У меня просто, например, такое есть, что из одной и той же функции нужно либо туда, либо суда.
Анна
Не, там "я пошёл отсюда", но так можно только к младшему или близкому другу. Ещё я бы убрала местоимение и "отсюда", а глагол из будущего времени поставила бы в настоящее 🤔 будет просто "ухожу". То, что уходишь именно ты, и отсюда - подразумевается и так
Анна
Ага, типа «пошёл ты»?
Dr. Friedrich
Я устал, я ухожу!
Ayrat
Тебе ж наверное уже за 30, а там жизни нет
Vladimir
Dr. Friedrich
Vladimir
я в пульсаре логаю правда все в один логгер, слишком удобно)
Vladimir
но наверное есть кейсы когда в разные логгеры нужно
Anonymous
Vladimir
нет, как статическое мутабл поле
Vladimir
т.е. юзер пишет Pulsar.Logger <- his logger
Vladimir
а я везде юзаю его через Log.Logger
Vasily
Статическое мутабл поле - лучший DI
Vasily
На самом деле
Roman
Roman
статическое мутабл поле — это глобальная изменяемая переменная. Я не знаю, в какой вселенной это что-то благое
Roman
Тем более, что в фшарпе можно легко получить вменяемый DI, который валидируется в компайл тайме и работает без какой-либо магии и овер инжиниринга.
Anonymous
Vasily
@atsapura , код кидай, поглядим, зададим вопросы
Roman
А когда ты пишешь DI, подразумеваешь контейнер или руками прикидывать нужные параметры при вызове фций?
Ну у нас это собирается под одним интерфейсом IAppEnv. При желании, для него можно сделать дробление типа IMasterDb, IPaymentGateWay etc., а сам IAppEnv заставить наследовать все это.
А дальше в функцию, где тебе это нужно, ты прокидываешь первым параметром либо IAppEnv целиком, либо IMasterDb, если датабазы достаточно.
IMasterDb у нас имеет методы вида GetProductItem: string -> Async<ProductItem option>.
Roman
Благодаря object expressions такие интерфейсы можно налету заимплементить в вашем AppEnv, что мы и делаем у себя)
Vladimir
Danil
Roman
а твой IAppEnv будет наследоваться от этого ILog, и будет наружу выставлять Ilogger свой
Roman
твоя же функция ничего об этом знать не будет, она будет принимать параметр log: #ILog
Vladimir
удобнее всего когда прокидывать не надо ничего) я бы сказал что логгер это исключение
Roman
Vladyslav
я так понял речь о https://bartoszsypytkowski.com/dealing-with-complex-dependency-injection-in-f/
там и код можно глянуть
Vasily
Roman
для каких-то тривиальных случаев можно и захардкодить. Если есть хорошее разделение логики (которую отдельно легко покрыть тестами) и ИО, то да, ио часто можно хардкодить.
Но если нужно проверить нетривиальный сценарий, где логику и ио разделить нельзя никак, то возможность отрезать реальное окружение сильно облегчает тестирование
Roman
с другой стороны, тривиальные случаи нередко вырастают со временем в мясо, а тестируемость туда никто не добавляет)
Vladislav
@omgszer а каким гит клиентом на маке пользуешься?
Aleksandr
Я помню, он говорил, что fork
Vladislav
Vladislav
Хз
Vladislav
Я не знаток дырок в скале
Ayrat
Roman
ну тут никаких дырок нет
Vladislav
Обычный composition root который сам собираешь
Vladislav
Чем это лучше прокидывания контейнера непонятно
Vladislav
Или обжект локатора статичного
Vladislav
Или как его там
Roman
сервис локатор это зло