🇺🇦 Дмитрий
вот эту проблему я решил |> Result.MapError.. AsyncResult.MapError и красивый код получил кучу копипаста после каждого вызова с let!
🇺🇦 Дмитрий
я так понимаю чтоб вернуть красивый код, нужно в этот билдер сделать ещё bind с моим MapError?
🇺🇦 Дмитрий
я теперь понял почему когда ты мне писал пример с AsyncResult ты делал с Result<'a, exn>
Maksym
Как по мне пайплайн более репрезентабельно выглядит, ну и разбираться в нем быстрее чем просто писать как computer expression
🇺🇦 Дмитрий
Maksym
Вижу что это силеним, думаю что здесь пайплайн не совсем нужен, так как это просто тестирование
🇺🇦 Дмитрий
была рпроблема примерного рода
🇺🇦 Дмитрий
step3 принимает значение и возвращает Async<Result<»
🇺🇦 Дмитрий
result.bind ожидает биндер с значения в Result
Maksym
AsyncResult.bind ?
🇺🇦 Дмитрий
AsyncResult.bind ?
не работал
🇺🇦 Дмитрий
я написал что то такого тогда
🇺🇦 Дмитрий
Maksym
Result.bindAsync не использовал?
🇺🇦 Дмитрий
не знал про него
Maksym
https://github.com/Saphirox/issue-classificator/blob/master/November.Api/Result.fs
Maksym
bindAsync
Maksym
Тут надо самом дописывать такие функции
🇺🇦 Дмитрий
а как бороться с биндами в биндах?
🇺🇦 Дмитрий
когда пайплайн ещё длинее
Maksym
а как бороться с биндами в биндах?
Только создавать новую функцию и делать бинды в ней
🇺🇦 Дмитрий
или когда тип след функции наоборот становится проще приходится map юзать
🇺🇦 Дмитрий
ну и читаешь этот код там map там bind там asyncBind
🇺🇦 Дмитрий
сидишь подбираешь чтоб туда вставить
🇺🇦 Дмитрий
или нет такой проблемы?
AlexB
построй мне график с медианой и 75% в нём по кастомной метрике, построй
Ну там sql-подобный кастомный язык запросов есть. Кастомные перцентили там были вроде. Но впечатление он оставил как что-то очень сырое пока.
🇺🇦 Дмитрий
do! step1 do! step2 do! step3 выглядит проще
Maksym
do! step1 do! step2 do! step3 выглядит проще
Если так то лучше юзать Result.tap
Maksym
do! step1 |> Result.tap step2 |> Async.switch |> AsyncResult.tap step3
AlexB
"мы ёбамониторинг решение" "дайте 90% персентиль вот по этой метрике" ".... а вам не надо, вон есть среднее"
https://docs.newrelic.com/docs/query-your-data/nrql-new-relic-query-language/get-started/nrql-syntax-clauses-functions#functions percentile(attribute [, percentile [, ...]])
🇺🇦 Дмитрий
папйлайн рушится как только нужно что то с другого шага
🇺🇦 Дмитрий
сорри за скрин
🇺🇦 Дмитрий
Maksym
Ну, если не использовать Result, Да, так тоже работает
🇺🇦 Дмитрий
ну я про то что 3 шагу, нужен результат первого
Maksym
tap возвращает результат предыдущей функции при этом выполняет указаную функцию
Maksym
Вот пример с Result<>
Maksym
let tap (f: 'a -> 'b) (x: Result<'a, 'c>): Result<'a, 'c> = match x with | Ok value -> f value |> ignore x | _ -> x
🇺🇦 Дмитрий
tap вычисляет что то в молоко и возвращает переменную с прошлого шага?
Maksym
🇺🇦 Дмитрий
ну в моей примере нужно результат вычисления в след шаг дать, и пред значение донести до 3 шага, напрашиваются туплы
🇺🇦 Дмитрий
https://gist.github.com/BashkaMen/b2a01ec029ed69f2844de8af0afff598
🇺🇦 Дмитрий
🇺🇦 Дмитрий
тут я мапил получилось ли достать из бд потом добавлял item потом считал сумму потом платил используя сумму с прошлого шага и стейт из позапрошлого
Maksym
Ну, так тоже работает, но я думаю можно сделать лучше
🇺🇦 Дмитрий
я уверен что так как я там баловался ни кто не делает))
🇺🇦 Дмитрий
что есть варианты хорошие
Anatoly
ну, т.е. у меня есть доступ к их хер знает какой линии поддержки, не чатботу. и они не смогли.
🇺🇦 Дмитрий
@Saphirox а подскажи ещё про замыкание
🇺🇦 Дмитрий
что предпочтительнее
🇺🇦 Дмитрий
или это? считается ли это читингом?
🇺🇦 Дмитрий
мне второй вариант больше нравится, так как я не менял функции специально под пайплайн (возвращал стейт)
Maksym
или это? считается ли это читингом?
Второй пример лучше, так всегда делаю, сначала думаю какие шаги пайплайна буду делать, потом пишу его без имплементации функций но дефайню входные и выходные данные, вверху делаю имплементацию
Roman
папйлайн рушится как только нужно что то с другого шага
пайплайн вообще работает только на самых тривиальных случаях. Как только у тебя есть ветвление или нужен контекст предыдущих шагов, он нихуя не работает. Так что используй CE.
Roman
Ну хз, просто сложнее думать как построить пайплайн
Или можно не изъебываться и использовать CE. Там не надо сложнее думать. Но можно, конечно, подрочить насильно на пайпы
Ayrat
серьёзный код серьёзных индусов
AlexB
ты попробуй сначала =)
Пробовал. Но не для аггрегации, правда. Искал медленные реквесты. Очень помогло, кстати. Был неприятный прикол, что при поднятии нового контейнера существующие начинали тупить.
Roman
Тут вбрасывали код со всякими |> AsyncChoice.map3 и трехэтажными лямбдами. Код, который в СЕ читался бы за 3 секунды в пайплайне нужно вдуплять 5 минут. Нахуя?
Roman
Можно тогда вообще писать на сишарпе
причем тут сишарп? У тебя, похоже, каргокульт на внешний вид функциональщины.
Anatoly
мы её сохраняем вот так: NewRelic.Api.Agent.NewRelic.RecordMetric($"Custom/{name}", value);
Maksym
А не усложнить
🇺🇦 Дмитрий
и когда там куча map, bind, tap, maperror, pure не очень получается сразу понять
🇺🇦 Дмитрий
я открыл тот код с корзиной который я выше скинул, я не сразу понял что я там делаю (возможно из-за отсутвия насмотренности), но я посмотрел на вариант с CE и мне потом стало понятно что в том пайплайне
Maksym
Ну спустя года на прод проекте на фшарпе я привык, иногда да, пайплайны не подходят особенно если нужно комбайнить результаты многих отправок сообщений через кафку
Ayrat
Ахах
больше ада. Заметь что ИДЕЯ-то всё показывает долбоёбам.