Anonymous
Очень больно это на практике
Anonymous
И быстро становится нечитаемым и все такое
Anonymous
Эти параметры же придется везде в явном виде руками указывать в большинстве случаев
Hog
👍
Nikolay
Nikolay
Продался за стикеры
Bonart
Эти параметры же придется везде в явном виде руками указывать в большинстве случаев
Забавно, ты смотришь на код, в котором явно указывать не надо и говоришь что надо
Bonart
И быстро становится нечитаемым и все такое
Пока это касается только сигнатур - нечитаемость условная, так как сигнатуры генериков одинаково большие и обязательные в любом случае
Bonart
Писать без генериков - будут тонны вонючей копипасты.
Shub
https://github.com/Kirill-Maurin/Sample.Struct/blob/master/Sample.Struct/Summators/IntAdditive.cs А это-фантик для заворачивания целого в обертку
если оно так выглядит на 2 + 2, то даже не хочется думать, как оно выглядит на более-менее повседневной задаче
Shub
впрочем, этого следовало ожидать
Shub
идеоматический код почти всегда неоптимален, а оптимальный код почти всегда неидеоматичен
Bonart
если оно так выглядит на 2 + 2, то даже не хочется думать, как оно выглядит на более-менее повседневной задаче
В повседневной задаче выглядит вот так: public void IndexableSumListBenchmark() => _list.AsIndexable().Sum(0.AsAdditive());
Bonart
Добавляется по одному вызову оборачивающего расширения на тайпкласс
Shub
постойте, это ж C#?
Bonart
Замечу, что для F# должно выглядеть лучше - методы расширения нужны прежде всего из-за хилости вывода типов в сишарпе
Shub
все пустотно, кроме дхармы и Учения, Учение непустотно и непреходяще. другими словами: пишешь на C#? значит, есть за что
Shub
почему ты считаешь, что это тайпклассы?
Bonart
почему ты считаешь, что это тайпклассы?
Это они и есть. Контракт отдельно, инстанс отдельно, тип отдельно, можно писать обобщения работающие с любым инстансом контракта
Bonart
Почему?
Shub
а где там констрейны на параметрически полиморфные типы? я там вижу просто набор интерфейсов. (я вообще C# знаю крайне фигово, может и пропустил)
Shub
так-то абсолютно то же самое и практически в том же виде выразимо на F#
Shub
тайпкласс - это способ сказать что-то в стиле "Тип 'a принадлежит тайпклассу 'TK в случае если тип 'a реализует то-то и то-то"
Андрей
Бухаю и плачу.
Кто не платит, тот не бухает ))
Bonart
Shub
можешь пальцем показать на инстанс тайпкласса и тайпкласс инстанса в этих примерах?
Shub
конечно, хорошо бы там были хоть какие-то комментарии
Анна
Продался за стикеры
А у меня значок есть 🙈
Bonart
Тайпкласс - ISummator, инстанс тайпкласса - IntSummator, Additive - обертка для перегузки сложения и обхода косяков вывода типов. AsAdditive метод расширения для обхода косяков вывода типов.
Bonart
Кто не платит, тот не бухает ))
Бухающие тоже плачут
Bonart
Тайпкласс - ISummator, инстанс тайпкласса - IntSummator, Additive - обертка для перегузки сложения и обхода косяков вывода типов. AsAdditive метод расширения для обхода косяков вывода типов.
Конечно в хаскеле достаточно самого тайпкласса и инстанса без имени. Но это, скажем так, качественно лучше визитера как эмуляции типов-сумм
Nikolay
А у меня значок есть 🙈
Ну, мне далеко до твоего уровня)
Shub
каких генериков там нет?
Dr. Friedrich
А какие есть?
Bonart
Пардон, не у явы а у JVM
Bonart
Вся фишка для сишарпа как раз в генериках с типами-параметрами.
Bonart
У скалы тайпклассы вроде есть
Shub
ты про type erasure, что ли?
Shub
У скалы тайпклассы вроде есть
у скалы есть имплиситные параметры, и это чуть ли не единственное, что там ест
Bonart
ты про type erasure, что ли?
Не только. Я про генерики со значимыми параметрами-типами
Shub
ладно, оставим пока жаву. я бы все же хотел, чтобы ты пояснил, каким образом интерфейс внезапно превратился в тайпкласс
Shub
ты вот написал "Тайпкласс - ISummator, инстанс тайпкласса - IntSummator, Additive - обертка для перегузки сложения и обхода косяков"
Shub
в данном случае "тайпкласс" выступает полным синонимом "интерфейсу"
Shub
Интерфейс - ISummator, реализация интерфейса - IntSummator, Additive - обертка для перегузки сложения и обхода косяков
Bonart
ладно, оставим пока жаву. я бы все же хотел, чтобы ты пояснил, каким образом интерфейс внезапно превратился в тайпкласс
Смотри. Любую фичу, которо нативно нет в языке, можно попытаться реализовать как паттерн.
x
Бухаю и плачу.
Куда тут ударение во втором слове
Bonart
в данном случае "тайпкласс" выступает полным синонимом "интерфейсу"
Неполным. Интерфейс предполагает объект с реализацией. Класс типа предполагает статический инстанс, которым служит реализация в виде структуры с нулевым размером. Это позволяет делать вызовы вида default(TClassInstance).Method. Дополнительно нужна структура-обертка, с которой сможет работать сишарповый вывод типов и сишарповая перегрузка операций.
Bonart
К вопросу о нейминг конвеншенах, которым не следуют авторы либ. Почему проперти сделано глаголом? (Unwrap) 😉
Например, потому, что эта либа исключительно для иллюстрации концепции, а не для продакшена. Ну и потому, что ограничения по регистру символом гораздо легче контролировать автоматически.
Anonymous
а где там констрейны на параметрически полиморфные типы? я там вижу просто набор интерфейсов. (я вообще C# знаю крайне фигово, может и пропустил)
Ну по-идее обычные ограничения на generic-параметр оно и есть, по крайней мере, мне не видна разница.
Anonymous
Выкрутиться-то можно.
Shub
я с удовольствием послушаю детальные объяснения, почему никак невозможно обойтись без тайпклассов, потому что с моей точки зрения они дают прирост менее десятка процентов относительно уже существующих средств языков.
Shub
до сих пор про тайпклассы я разговаривал только с людьми, которые при изжоге "принял перорально 500мл водного раствора кислой натриевой соли угольной кислоты" и киснут от слова "сода"
Shub
пищевая сода - это натриевая кислая соль угольной кислоты
Shub
шуточка за 300
Anonymous
Мне нравятся тайпклассы за простоту и понятность, едва ли это действительно нечто, без чего нельзя обойтись. Хорошо спроектированные обычные интерфейсы не намного должны бы уступать, при условии что на параметры можно накладывать ограничения, а это почти везде так.
Anonymous
Но тайпклассы делают этот процесс прям приятным.
Крылатый
Или уранил нитрат
Shub
Или уранил нитрат
речь о том, что атомарных понятий нет, и для любого понятия можно попытаться сделать модель на элементарных частицах, хотя в быту мы все же говорим "вода", а не "дигидрогена монооксид"
Shub
из того, что я знаю про тайпклассы, следует, что есть крайне малое количество ситуаций, где тайпклассы отличаются от интерфейсов и перегрузки операторов
Shub
в 99% случаев это равнозначные и эквивалентные понятия
Anonymous
Только хаскель умно умеет сам догадаться какой инстанс взять.
Anonymous
Из-за чего, собственно, двух инстансов быть не можетв одном модуле
Shub
а если так, то я согласен с @vshapenko, потому что кому-то это все поддерживать, иногда - в буквальном смысле в 4 утра
Shub
я например в 4 утра социально опасен и за тайпклассы могу сделать такое, что потом всю жизнь каяться
Крылатый
Хм, ну да, и такое бывает.
Крылатый
Особенно весело в 3 ночи в субботу бежать чинить ошибку во время выкладки на бой.)
Shub
Всего-то попилишь древесины
с учетом, что 90% кода пишется буратинами, это звучит крайне двусмысленно