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