Ayrat
Система букмекера была гвоздями прибита к модели команда против команды, где ставки делались на 1 или 2.
А когда участников больше 2 - проблемы. Тогда сделали много участников, но потом выяснилось что можно делать ставки не только на собаку, но и на будку, из которой собака бежит (очень странно, да, но вот так), типа тебе пофигу.
И тогда будки добавили как участников соревнований, для которых точно так же проводился расчет добежала будка или нет.
В дебаг вью будки бежали наравне с собаками до финишной прямой
Dr. Friedrich
И на них все радуются
Ayrat
Ayrat
И тайпклассы это композиция
Ayrat
Типа накидал тайпклассов, получил что хочешь
Dr. Friedrich
Композиция не мешает, получается, наследовать реализацию.
Ayrat
Dr. Friedrich
В базовом классе пишешь, что (=) = not << (!=), а (!=) = not << (=), и всё.
Ayrat
Потому что там такая же иерархия. Все что монада - функтор
Dr. Friedrich
Юзер перегружает одно, а второе наследует
Dr. Friedrich
Реализацию наследует! Ужасы!
Ayrat
Ну как с жирафом и животными
Dr. Friedrich
Вроде бы наследование как наследование :)
Dr. Friedrich
А как у них diamond problem решается?
Ayrat
А не просто монаду!
Ayrat
Скомпозировал!
Dr. Friedrich
Но когда я какой-то тайпкласс реализую, что я там скажу?
Dr. Friedrich
Что я реализую монаду с логгером. Что я композирую при этом?
Ayrat
То есть создаёшь отдельно инстанс логера, отдельно инстанс монады
Dr. Friedrich
Ayrat
Композируешь!
Ayrat
Dr. Friedrich
Да как нет?
Ayrat
Dr. Friedrich
Вот у меня есть
def foo[X : Monad with Logger](monal: X) {}
Dr. Friedrich
И что, где я тут скомпозировал?
Dr. Friedrich
Как мне создать монал?
Ayrat
Пишешь условно
type A with
Interface Monad with
...
....
type A with
Interface logger with
...
Dr. Friedrich
Ну вот это разве композиция?
Dr. Friedrich
Это чистое незамутнённое множественное наследование
Критерий
Ayrat
Они могут быть в либах разных
Dr. Friedrich
Dr. Friedrich
Я в листе могу написать свой отдельный Select
Dr. Friedrich
Потому что IEnumerable — тайпкласс!
Dr. Friedrich
И обнаружили, что там где-то посос большой в системе-то ентой
Dr. Friedrich
Не то в Расте, а не то даже в самом Хаскеле
Dr. Friedrich
Кажись, я не могу чужой тайпкласс реализовать для чужого типа
Ayrat
Dr. Friedrich
«Потому что пошёл нахер» было официальным ответом
Ayrat
Там же все на честном слове держится
Ayrat
Хаскель только один инстанс разрешает иметь в скоупе
Ayrat
То есть два раза сделать логер для одного типа - хуй
Ayrat
Ахахахах
Критерий
но ведь... newtype...
Андрей
нет это новая интерпретация типа
Doge
Dr. Friedrich
Dr. Friedrich
Логичные причины.
Андрей
Dr. Friedrich
Dr. Friedrich
Ну реализовали, ну и чо?
Dr. Friedrich
Там, где мне это важно, я же могу конфликт разрешить.
Dr. Friedrich
Явно указать, чо я импортирую, ну или явно передать тайп аргументом.
Dr. Friedrich
someOtherLibrary.MethodCall<TypeFromLibrary1, TypeClassInstanceFromLibrary2>()
Doge
Я не понимаю, хоть убей, почему это проблема.
Проблема в том, что тебе чтобы использовать инстанс тайпкласса не нужны его импорты.
А в данном случае придется эти импорты указывать.
В хаскеле и расте решили что возможность писать всегда без импортов важнее.
В скале решили, что важнее возможность иметь несколько реализаций и там надо импортировать тайпклассы
Dr. Friedrich
В сишарпе сейчас эта проблема есть (можно сделать несколько одноимённых экстеншенов для одного и того же типа), прекрасно решается юзингами.
Критерий
Dr. Friedrich
Dr. Friedrich
Андрей
Dr. Friedrich
В итоге ну хз, насколько это нужно в хаскеле — видать, там автор пакета всегда лучше меня знает, с какими тайпклассами я захочу его сопрячь