Doge
В хаскеле, кажется, просто поленились сделать отдельный синтакс для такой фундаментальной проблемы.
В хаскеле, если ты не пишешь библиотеку, а исполняемый файл, то ты можешь реализовать чужой тайпкласс для чужого типа спокойно.
Dr. Friedrich
А в эфшарпе мне для всех использований тайпклассов хотелось именно чужие тайпклассы поимплементить для чужих либов
Nikolay
Почему
Dr. Friedrich
Почему
А почему нет?
Doge
И теряю все чужие тайпклассы с него
Нет, у тебя есть дерайвинг инстансов для ньютайпов под это же
Dr. Friedrich
Если какой-то чужой тип объявлен как моноид, а я делаю для него newtype — мой newtype же перестанет быть моноидом?
Критерий
да, но ты можешь сделать deriving Monoid
Dr. Friedrich
Нет, у тебя есть дерайвинг инстансов для ньютайпов под это же
Можно прям вот с родительского типа задерайвить?
Dr. Friedrich
Тогда лан.
Критерий
и via добавить
Dr. Friedrich
Кажись, в расте это просрали, но я не уверен.
Dr. Friedrich
Мне растоманы поясняли, что так нельзя сделать почему-то.
Dr. Friedrich
Я над ними насмехался, но они не поняли.
Doge
Кажись, в расте это просрали, но я не уверен.
Просрали, я иногда с этого горю
Nikolay
А почему нет?
А почему да?
Dr. Friedrich
А почему да?
Ну потому что можно реализовать Select для чужого типа
Dr. Friedrich
Я пояснил почему да, теперь ты поясни почему нет.
Dr. Friedrich
Ну, я сильно слукавил, разумеется. Но иначе бы не было интересно, согласись.
Doge
Кажись, в расте это просрали, но я не уверен.
В расте нет ни GeneralizedNewtypeDeriving, ни deriving via, от чего у меня подгорает иногда
Nikolay
Я пояснил почему да, теперь ты поясни почему нет.
Значит ли это, что в c# любой класс = тайпкласс?
Dr. Friedrich
Ну потому что можно реализовать Select для чужого типа
И после этого у ентого типа начнёт работать вся вот эта фигня from x where a equals b
Ayrat
И после этого у ентого типа начнёт работать вся вот эта фигня from x where a equals b
Эта фигня же работает на дактайпинге, а не не реализации IEnumerable
Dr. Friedrich
Я бы так назвал только те кейсы, поверх которых можно написать хоть на вид полиморфный код
Ayrat
Как и форЫч, и узинг и эвэйт
Dr. Friedrich
Эта фигня же работает на дактайпинге, а не не реализации IEnumerable
Ну поэтому на самом деле IEnumerable является инстансом этого «тайпкласса», официального названия у которого нету.
Андрей
Значит ли это, что в c# любой класс = тайпкласс?
в C# один из немногих тайпклассов это типа ToString(able)
Doge
Я бы так назвал только те кейсы, поверх которых можно написать хоть на вид полиморфный код
Ну нет, на вид полиморфный код не является полиморфным фактически.
Dr. Friedrich
Ты снова врёшь.
Ayrat
Все врут.
Doge
Ты врёшь.
Нет, тебе полиморфность на внешний вид не даёт этот код переиспользовать
Doge
Собственно нафига она тогда нужна
Dr. Friedrich
> на вид полиморфный код не является полиморфным фактически.
Ayrat
Вот ты врешь, что тебя зовут Фридрих. А он врёт что выглядит как собака
Dr. Friedrich
Вот это утверждение ложно. Строго логически.
Dr. Friedrich
Потому что любой фактически полиморфный код является также полиморфным на вид.
Dr. Friedrich
Не всякий на вид полиморфный код является истинно полиморфным, да.
Dr. Friedrich
Но я уже придумал пример для C#, как эту конкретную полиморфность можно использовать по факту.
Критерий
темплэйты в с++ это полиморфизм?
Dr. Friedrich
Так что ты мне наврал сперва на вид, а потом и фактически.
Nikolay
Нет, не значит.
Ты можешь экстеншн метод для любого класса сделать
Nikolay
И тогда любой класс будет тайпклассом
Критерий
И тогда любой класс будет тайпклассом
что? как? что вообще такое тайпкласс тогда?
Dr. Friedrich
Ты можешь экстеншн метод для любого класса сделать
Для любого класса, но не для любой структуры.
Dr. Friedrich
Doge
Не всякий на вид полиморфный код является истинно полиморфным, да.
Ну о чем и речь. Ты не можешь написать метод в шарпе, которой принимает любой тип с которыми можно работать через LINQ expression'ы, как пример.
Dr. Friedrich
Но на самом деле с оговорками это позволит писать полиморфный код поверх любого класса, ла.
Dr. Friedrich
Смотри
Doge
Я могу это сделать.
Прям интересно, давай
Dr. Friedrich
Два слова: shared library
Dr. Friedrich
Дальше ты меня обвиняешь в читерстве, а я смеюсь.
Doge
Два слова: shared library
Так речь про метод, погоди ка
Dr. Friedrich
Так речь про метод, погоди ка
Метод — это элемент кода, верно?
Doge
Метод — это элемент кода, верно?
Опиши сигнатуру этого метода
Dr. Friedrich
У меня на диске есть .cs-файл, в нём написан метод
Dr. Friedrich
Этот метод я могу заставить выполняться в разных интересных условиях для разных типов
Андрей
Ты можешь экстеншн метод для любого класса сделать
вот да, экстеншн метод это тайпклассы для бедных, их можно использовать если имплементация в скоупе. но нельзя отнаследовать или передать куда либо как констрейнт
Dr. Friedrich
В общем-то весь код в этом методе уже автоматически полиморфный
Dr. Friedrich
Вообще весь
Dr. Friedrich
Да, любой класс в сишарпе — тайпкласс
Dr. Friedrich
И вообще что угодно тайпкласс
Doge
В общем-то весь код в этом методе уже автоматически полиморфный
Как выглядит у него сигнатура, например у того метода, что я выше описывал.
Dr. Friedrich
Как выглядит у него сигнатура, например у того метода, что я выше описывал.
Не знаю чо там ты описывал, пусть будет void Foo(MyList x) {}
Критерий
а где полиморфизм?
Критерий
ну чтоб разные селекты использовать
Dr. Friedrich
А где полиморфизм у хаскельного sum a b = a + b?
Dr. Friedrich
Вот и тут там же полиморфизм
Doge
Не знаю чо там ты описывал, пусть будет void Foo(MyList x) {}
Ну этот метод работает только для типа MyList, где полиморфизм?
Критерий
Num t => t -> t -> t
Dr. Friedrich
Инстанцируешь разными типами