Ayrat
@vshapenko @omgszer а вы какие задачи на фшарпе решали с помощью квотейшнов? Можете дать глянуть пример?
есть две задачи которыми я хотел заняться, но уже не успею 1) по рекордам F# генерить TS типы (для фронтов). Пихаем рекорд в квотейшн, собираем из полученного екпрешна тип TS обратно 2) по рекорду F# генерить ебаный static member (+) и static member Zero. Т.е. кодогенерация банальная. Эту я сделаю
Ayrat
вторую задачу меня так достало руками делать что я обязательно её сделаю
Roman
а решение с наследованием как у Сайма тебя не выручит?
Roman
у него там абстрактный класс моноид, но подробностей я тоже не помню
Roman
Но я не очень понимаю, как ты будешь генерить эти методы для универсального случая
Ayrat
Это не избавляет от необходимости складывать всё подряд
Vasily
Бля, как хочется op_construct
Vladislav
а sum type и enum когда можно будет разными цветами в райдере???77 @fvnever
Roman
Это не избавляет от необходимости складывать всё подряд
то есть тебе нужен + который все поля попарно просуммирует?
Ayrat
у него там абстрактный класс моноид, но подробностей я тоже не помню
я вот про такое [<Struct>] type GameStats = { Fga: int // Fga Fgm: int // FG Fta: int // Free throws Attempts Tpa: int // 3PA Tpm: int // 3P Orb: int Drb: int Tov: int Pts: int } static member Zero = { Fga = 0 Fta = 0 Orb = 0 Drb = 0 Fgm = 0 Tov = 0 Pts = 0 Tpm = 0 Tpa = 0 } static member (+) (a,b) = { Fga = a.Fga + b.Fga Fta = a.Fta + b.Fta Orb = a.Orb + b.Orb Drb = a.Drb + b.Drb Fgm = a.Fgm + b.Fgm Tov = a.Tov + b.Tov Pts = a.Pts + b.Pts Tpa = a.Tpa + b.Tpa Tpm = a.Tpm + b.Tpm } type Stats = { OffStats : GameStats DefStats : GameStats } static member Zero = { OffStats = GameStats.Zero DefStats = GameStats.Zero } static member (+) (a,b) = { OffStats = a.OffStats + b.OffStats DefStats = a.DefStats + b.DefStats } ... и т.д.
Dr. Friedrich
Годная мысля.
Ayrat
т.е. эти полотна кода руками писать с мультикурсором быстро, но утомительно
Ayrat
я бы кодогенерил
Ayrat
тем более там алгоритм есть
Ayrat
складываем всё подряд! для zero берём или Zero у поля, или Unchecked.DefaultValue (это плохо, но допустим)
Roman
но я понял твою мысль.
Roman
А в квотейшнах можно экстеншены генерить? Типы же вроде нельзя объявлять
Ayrat
А в квотейшнах можно экстеншены генерить? Типы же вроде нельзя объявлять
Можно генерить. потом только надо нагенерённое записать куда-то
Vladislav
Ayrat
фантомас же как делает, он читает файл (с диска), пихает его в компайлерСервис, получает в ответочку AST файла. разчпокивает это AST, модифицирует его собирает из AST обратно строку (с новыми отступами и пр) пишет полученную строку в файл
Ayrat
собсно кодогенерация которую я хотел примерно так же должна работать для моноидов - помечаем желаемые рекорды атрибутом [<IWannaBeMonoid>] натравливаем кодогенератор. Он модифицирует АСТ, убирает эти атрибуты, (или даже оставляет, пофигу) и генерит (+) и Zero, пишет обратно на диск
Ayrat
всё это в дотнет тул обернуть и вуаля
Ayrat
плюс полчаса жизни в день!!!
Vladislav
я хочу быть моноидом но мама не поймет
Ayrat
я хочу быть моноидом но мама не поймет
Возможно даже из дома выгонит.
Vladislav
это да
Ayrat
короче, кодогенерация в F# поле абсолютно непаханное. Надо пахать, потому что руками надоело
Vladislav
java.lang.NullPointerException
Vladislav
well
Vladislav
@fvnever https://youtrack.jetbrains.com/issue/RIDER-16391 https://youtrack.jetbrains.com/issue/RIDER-15125
Vladislav
а оно уже не покрывает это?
Dr. Friedrich
Dr. Friedrich
Вот ты видишь какой-то эпик "Create separate highlightings for F#"
Dr. Friedrich
Как скоро, по-твоему, его сделают?
Vladislav
тогда же когда и лонг неймы в датагрибе
Dr. Friedrich
По-моему, примерно никогда такой эпик в таком оформлении сделают.
Dr. Friedrich
Напиши там коммент хотяб.
Dr. Friedrich
Мол, хочу по-разному энумы и ADT.
Vladislav
Мол, хочу по-разному энумы и ADT.
https://youtrack.jetbrains.com/issue/RIDER-23125
Dr. Friedrich
Ну вот другое дело!
Vladislav
у тебя там на аве катана что ль?
Анна
Деанон!!!
Vladislav
дак давно уже.
Fail
Деанон!!!
он же даже не митапе выступал
Анна
Ну не знаю, я сразу после защиты диссера задеанонила 🤔
Анна
Теперь я окультуриваюсь в филармонии
Анна
Vasiliy
👌
x
как бы это подзарефакторить сраные енумы flags во что-то более приемлемое? и функциональное?
Hog
оккультирую
следи лучше за основным - заветная цифра близка :)
Aleksandr
как бы это подзарефакторить сраные енумы flags во что-то более приемлемое? и функциональное?
Если енумы пользуются как остов какого-то дерева условий, то может быть и без него можно обойтись, используя фпшный эквивалент паттерна "декоратор"?
Aleksandr
Флаги, для чего они?
Hog
Флаги, для чего они?
нести и махать
x
ща пример скину. С соседнего проекта люди мучатся
x
https://repl.it/repls/ComfortableValidPipelining
x
они короче там логику в ифах струячат
Shub
они короче там логику в ифах струячат
пример есть? чтобы понять масштабы проблемы
x
есть
Aleksandr
что, простите?
Например, вместо вызовов makeCoffee(Flags.Sugar | Flags.Milk) Делаешь makeCoffee >> withSugar >> withMilk
Shub
тащемта это Builder. но я понял
Aleksandr
Builder и есть в частном виде декоратор, но да, так действительно понятней
Shub
это что-то новое.
Aleksandr
Прошу прощения, раз ошибся. Видимо сразу не так понял https://stackoverflow.com/questions/4768349/builder-vs-decorator-pattern
x
да там у них не декораторы а куча императивной ебанины чтобы из двух энумов, стринга и опшенал децмала получить тру или фолс
x
короче домейн модель говно
x
надо всё переделать
Aleksandr
тащемта это Builder. но я понял
Кстати, вариант makeCoffee >> withSugar >> withMilk наверное, действительно декоратор, а вот: makeCoffee (withSugar >> withMilk) это уже билдер. И он действительно лучше
x
Так. Я малость запутался. Вот у меня энумерабл флагс, в с#. Ими я могу задать штуку которая «А» и «Б» и «Ц», штуку которая «А» и «Г» и «Д» и так далее. А с алгебраическими типами я как бы только могу задать штуку которая «А» ИЛИ «Б» ИЛИ «Ц». Как мне повторить функциональность флагов в алгебраических типах? 🤔
Vladislav
Тупля :)
Vladislav
Список
Vladislav
Ломаю себе мозг элмишем