Aleksandr
в апсорсе
Крылатый
@fvnever https://vk.com/wall-11632794_49402
Vasily
Наброшу на вентилятор: let inline (|?) (a: 'a option) b = match a with | Some a -> a | None -> b let inline (|??) (a: 'a Nullable) b = if a.HasValue then a.Value else b let inline (|*?) (a: string) b = if String.IsNullOrEmpty a then b else a let fst3 (a, _, _) = a let snd3 (_, b, _) = b let thd3 (_, _, c) = c
Vasily
Вот из-за такого фшарп и не любят
Vasily
Я считаю, отборная ебанина
Aleksandr
Ну я fst / snd пользуюсь иногда
Aleksandr
Меня не ревьюят, но чувствую себя отличнр
Vasily
fst-то ок
Aleksandr
fst-то ок
Ну от fst до fst3 всего один шажок маленький
Vasily
Но меня больше беспокоят магические операторы
Aleksandr
Первый - это алиас к Option.defaultValue по сути
Vladislav
падажди
Aleksandr
Действительно, зачем
Vladislav
фст3 же не дестракт а хуйня какая-то
Vladislav
а не
Vladislav
запутался
Vasily
defaultValue само по себе не всегда полезно
Aleksandr
есть же Choice3Of3
Это для сумм, а то для произведений
Aleksandr
Кортежей то есть
Vasily
Ну все равно
Aleksandr
Ну и чойсы больше 2 оч сомнительная штука
Vasily
А потом говорят
Vasily
Что фп знают
Андрей
Vasily
Ну т.е. вместо нормального проектирования получаем такое вот
Aleksandr
Пайп есть
Ayrat
maybeValue |? defaultValue
Aleksandr
Какая-то экономия на спичках
Ayrat
согласен
Андрей
экономия или нет, но для опшнов неплохо было бы иметь свой стандартный элвис-оператор, поэтому у меня здесь не подгорает
Ilya
А мне нравится |?. Читается хорошо без всяких defaultValue
Aleksandr
Сама идея дефолтвалью - это чеховское ружье
Aleksandr
Которое выстрелит
Ayrat
я согласен. оно обычно или на самом входе в метод (с опциональными аргументами) применяется или один раз в конце метода
Ilya
Может быть. Надо контекст смотреть.
Ayrat
поэтому как оно там выглядит - похуй вообще
Ayrat
до этого там ехал мап через бинд
Ayrat
и я бы не отказался от OPTION-PROPAGATED оператора или сахара как в скала котлене maybe.map(_.id) //scala maybe.map{it.id} //kotlin maybe|> Option.map (fun x -> x.id)
Aleksandr
Впрочем , в конпиляторах всяких defaultValue, например, бывает оч полезен
Aleksandr
Чтобы еррор рекавери делать
Aleksandr
Так что от контекста зависит, да
Vasily
Спасибо! В нашей скодобазе очень не хватало!
Там ниже были рельсы, но там я уже плакал
Vasily
Поплачьте и вы
Vasily
module Railway = type Result<'TSuccess,'TFailure> = | Success of 'TSuccess | Failure of 'TFailure let succeed x = Success x let fail x = Failure x let either successFunc failureFunc twoTrackInput = match twoTrackInput with | Success s -> successFunc s | Failure f -> failureFunc f let bind f = either f fail let (>>=) x f = bind f x let (>=>) s1 s2 = s1 >> bind s2 let map f = either (f >> succeed) fail let switch f = f >> succeed let tee f x = f x; x let pass f x = (ignore >> f)(); x let tryCatch f exnHandler x = try f x |> succeed with | ex -> exnHandler ex |> fail let doubleMap successFunc failureFunc = either (successFunc >> succeed) (failureFunc >> fail) let plus addSuccess addFailure switch1 switch2 x = match (switch1 x),(switch2 x) with | Success s1,Success s2 -> Success (addSuccess s1 s2) | Failure f1,Success _ -> Failure f1 | Success _ ,Failure f2 -> Failure f2 | Failure f1,Failure f2 -> Failure (addFailure f1 f2)
Vladimir
так а че плакать, это же наверное прямой копипаст классики
Vasily
Я вот только не понимаю, зачем это все
Ayrat
а зачем тут кастомный резалт?
Ayrat
нельзя было на обычном забацать?
Vasily
Я завтра задам пару вопросов, конечно
Vasily
Но,мне кажется, тут пора закапывать
Vladimir
а зачем тут кастомный резалт?
во времена когда влашин это писал еще не было стандартного резалта
Vasily
А, это оттуда
Vladimir
да ну
серьезно!
Vasily
Тогда многое становится понятным
Vasily
Год 14-й наверное
Ayrat
А, это оттуда
ты не узнал нетленку?
Ayrat
это ж RAILWAY
Vasily
ты не узнал нетленку?
Через мою голову проходит слишком много информации
Ayrat
я его книгу читал, но прям дословно не помню код подход да, узнаваем
Vasily
Я уже не помню, какой код писал пару месяцев назад
Vasily
как говорится, найдите ошибку в коде: let toUnix date = Math.Round((date - DateTimeOffset(DateTime(1970, 1, 1))).TotalSeconds, 0)
Vasily
Даже в таком простом коде на датах подорвались
Андрей
а у нас разве нет готовой константы для эпохи?
Ilya
Есть. DateTime.UnixEpoch
Ilya
А, там оффсет.
Ayrat
и всё
Андрей
и функция для конверсии наверняка тоже
Ayrat
DateTimeKind.Utc ?
не, оно должно нормально схавать
Ayrat
я вот не вижу честно говоря сходу ошибки. ну кроме того что таймстемп в секундах такое себе