Ayrat
То есть как обычно?🤔
я если чо, не знаю точно. просто я не верю что бывает честного капитализма
Ayrat
если это кто-то называет лоббированием, говно лучше не становится
Nikolay
А кто знает, вот такой код сильно будет тормозить и в память какать? let compare a b = let filter: seq<IComparable> -> seq<IComparable> = Seq.filter ( function | :? int -> true | _ -> false ) let prev = filter a let curr = filter b (Seq.compareWith Operators.compare prev curr) = 0
Doge
Но забокшенные инты внутри сиквенса из IComparable точно ничем хорошим не закончатся.
Ayrat
ну бля
Nikolay
ну бля
Ну красиво
Ayrat
НИКОЛАЙ
Sergey
Да покажите уже котов
Ayrat
фшарп умеет в стейт машны для сиквенсов
Ayrat
йоп
Nikolay
Ну так
Nikolay
Это быстро будет работать?
Ayrat
Это быстро будет работать?
стейт машины точно будут
Ayrat
а твой код даже лямбду не закеширует
Nikolay
Ayrat
Как правильно сделать?
ну если тебе обязательно сиквенсы, то через билдер
Ayrat
но я бы тут ручками ебанул если перф нужен
Ayrat
тут вроде тривиальный тайп чек
Nikolay
Беда беда
Doge
Беда беда
Такое могло бы норм заоптимизироваться в языке с нормальным AOT компилятором, но в языке с JIT'ом скорее всего выйдет гадость
Ayrat
вчитавшись в код я понял что ты чекаешь равенство интовых подпоследовательностей в двух последовательностях
Ayrat
Да
ну я бы сразу нормально написал
Vasily
Ну вот на хешсетах эффективнее, имхо
Vasily
Ещё вариант на массивах
Nikolay
Ну если уж на то пошло, лучше полностью ручками
Nikolay
Ибо хэшсет же аллокации
Hog
Вот вы там упарываетесь
Hog
А про чо это?
Doge
Ну если уж на то пошло, лучше полностью ручками
А боксить структуры в IComparable изначально - словно не аллокации.
Hog
Ну сиквенс сиквенсов это чо?
Ilya
А я думал на f# нельзя написать дичь...
Ilya
А тут оказыватся ещё и руки нужно чтобы росли откуда надо🤔
Nikolay
А боксить структуры в IComparable изначально - словно не аллокации.
Есть аллокации, которых не избежать, а есть аллокации, которые можно избежать
Doge
+++ Пулы не просто так придумали
Hog
Массивы там из пу
Hog
Чорт :)
Nikolay
Всё сложнее
Hog
Чо-то мы такое уже обсуждали
Hog
Раза 2 или 3
Hog
Вроде ещё не весна...
Nikolay
Зависит
Nikolay
Хотя тут нельзя прям hotpath назвать
Nikolay
Но код важно выполнять быстро и с минимальными аллокациями
Nikolay
Так как код выполняется на UI треде
Nikolay
Код писал Дон Сайм
Hog
Стопэ
Nikolay
Ну как бэ стоимость абстракций
Hog
Я ж не зря спросил про смысл этого сравнения
Hog
Что это для уя?
Nikolay
15 лет назад нельзя было такое юзать, так как довольно дохлые железки были
Hog
@vshapenko 🤣🤣🤣
Nikolay
Что это для уя?
https://github.com/fsprojects/Fabulous
Hog
Сиквенс сиквенсов - что это
Hog
То, что вы фабулюс используете, все знают
Nikolay
Сиквенс сиквенсов - что это
Не понял к чему это ты
Hog
Не понял к чему это ты
Прокрути к началу
Nikolay
Прокрути к началу
Модификаторы
Ayrat
На хешсетах?
let inline private getNext<'b>(someEnum: IEnumerator<IComparable>): 'b voption = let mutable result = ValueNone let mutable found = false while found || someEnum.MoveNext() do match box someEnum.Current with | :? 'b as x -> found <- true result <- ValueSome x | _ -> () result let compare (a: IComparable seq) (b: IComparable seq): bool = use aEnum = a.GetEnumerator() use bEnum = b.GetEnumerator() let mutable aNext = ValueNone let mutable bNext = ValueNone let mutable isEqual = true let mutable notFinished = true while isEqual && notFinished do aNext <- getNext<int> aEnum bNext <- getNext<int> bEnum match aNext, bNext with | ValueSome _, ValueNone | ValueNone, ValueSome _ -> notFinished <- false | ValueSome ai, ValueSome bi when ai <> bi -> isEqual <- false | ValueNone, ValueNone -> notFinished <- false | ValueSome _, ValueSome _ -> () isEqual
Ayrat
я мог где-то наебаться, не дебажил
Nikolay
😏
Ayrat
и матч можно упростить
Ayrat
ну да похуй
Nikolay
и матч можно упростить
let inline private getNext<'b when 'b :> IComparable> (someEnum: IEnumerator<IComparable>): 'b voption = let mutable result = ValueNone let mutable found = false while found || someEnum.MoveNext() do match someEnum.Current with | :? 'b as x -> found <- true result <- ValueSome x | _ -> () result
Ayrat
мне кажется тут я наебался с условием выхода из вайла
Ayrat
оно не остановится на найденном. а должно
Ayrat
оно должно идти while notFound && MoveNext
Ayrat
как только мы находим или не можем идти дальше, надо выходить
Ayrat
let inline private getNext<'b>(someEnum: IEnumerator<IComparable>): 'b voption = let mutable result = ValueNone let mutable notFound = true while notFound && someEnum.MoveNext() do match box someEnum.Current with | :? 'b as x -> notFound <- false result <- ValueSome x | _ -> () result
Ayrat
и вот такой порядок обязателен notFound && someEnum.MoveNext() чтобы он лишний раз не прокрутил итератор
Nikolay
и вот такой порядок обязателен notFound && someEnum.MoveNext() чтобы он лишний раз не прокрутил итератор
Косячок есть, если количество элементов не равно в двух массивах