Size: a a a

🎄.NET Talks: Evergreen🎄

2020 March 12

Т8

Т-34 85 in 🎄.NET Talks: Evergreen🎄
Dr. Friedrich von Never
Слушай, а и правда хорошо выглядит
HKT по-прежнему не нужны, как я понимаю?
источник

DS

Doge Shibu in 🎄.NET Talks: Evergreen🎄
Т-34 85
HKT по-прежнему не нужны, как я понимаю?
HKT - это то, что позволяет переиспользовать код в большей мере, чем без него возможно.
источник

DS

Doge Shibu in 🎄.NET Talks: Evergreen🎄
Я уже приводил пример выше.
источник

DS

Doge Shibu in 🎄.NET Talks: Evergreen🎄
Т-34 85
HKT по-прежнему не нужны, как я понимаю?
HKT тут - чтобы реализовать кучу хелперов один раз для тайпкласса какого-нибудь функтора, а потом переиспользовать между всеми их реализациями
источник

DS

Doge Shibu in 🎄.NET Talks: Evergreen🎄
Т.е. куча методов, например, можно было бы переиспользовать между LINQ to objects и Rx
источник

DS

Doge Shibu in 🎄.NET Talks: Evergreen🎄
Если про дотнет говорить
источник

DS

Doge Shibu in 🎄.NET Talks: Evergreen🎄
Если про F#, то кучу скопированных методов в модулях List и Array можно было бы не копировать
источник

DS

Doge Shibu in 🎄.NET Talks: Evergreen🎄
Как ещё пример - это более эффективная работа с коллекциями, если её делать на Functor, Foldable и Traversable.

Т.к. это тайпклассы, то дофига динамических вызовов связанных с IEnumerable можно было бы избежать.
источник

DS

Doge Shibu in 🎄.NET Talks: Evergreen🎄
Т-34 85
HKT по-прежнему не нужны, как я понимаю?
Ну с HKT в дотнете другая проблема. Reified дженерики. Придется как-то их начиться засовывать в рантайм и иметь их поддержку в рантайме.
источник

Т8

Т-34 85 in 🎄.NET Talks: Evergreen🎄
Doge Shibu
Как ещё пример - это более эффективная работа с коллекциями, если её делать на Functor, Foldable и Traversable.

Т.к. это тайпклассы, то дофига динамических вызовов связанных с IEnumerable можно было бы избежать.
Это всё круто, но есть ли какая-нибудь реальная задача и 2 подхода (с и без), выраженных кодом (можно с элементами псевдокода для демонстрации)?
источник

Т8

Т-34 85 in 🎄.NET Talks: Evergreen🎄
А то получается, что прав Фридрих, это оверкилл
источник

DS

Doge Shibu in 🎄.NET Talks: Evergreen🎄
Т-34 85
А то получается, что прав Фридрих, это оверкилл
Т.е. убирание копипасты методов в либах - это оверкилл?
источник

DS

Doge Shibu in 🎄.NET Talks: Evergreen🎄
Может от дженериков откажемся заодно
источник

Т8

Т-34 85 in 🎄.NET Talks: Evergreen🎄
Doge Shibu
Т.е. убирание копипасты методов в либах - это оверкилл?
Пример из жизни, пожалуйста. Где и как возникла проблема, какие её масштабы
источник

Dv

Dr. Friedrich von Never in 🎄.NET Talks: Evergreen🎄
Т-34 85
HKT по-прежнему не нужны, как я понимаю?
Мы по-прежнему этого не знаем, нам всё ещё не показали, зачем.
источник

Dv

Dr. Friedrich von Never in 🎄.NET Talks: Evergreen🎄
Doge Shibu
Может от дженериков откажемся заодно
Как видишь, это даёт преимущества — ну, если верить авторам Scala 🤷‍♂️
источник

Dv

Dr. Friedrich von Never in 🎄.NET Talks: Evergreen🎄
Они говорят, что без женериков (на JVM) им проще язык поднимать, чем с женериками (на CLR).
источник

DS

Doge Shibu in 🎄.NET Talks: Evergreen🎄
Т-34 85
Пример из жизни, пожалуйста. Где и как возникла проблема, какие её масштабы
Ну ок, пример из жизни напрямую. Это чуть отдельный подхода, но HKT он требует. Пусть у нас есть большой конфиг, в нём куча вложенных полей, они потенциально опциональны.

Есть сложная логика мерджа конфига, которая приводит в конце к тому, что опциональных значений нет.

Вариант без HKT - мы либо делаем структуру с опциональными значениями и её версию без опциональности. Таким образом у нас дублируется достаточно большой набор структур:
// В реальности конфиги на много десятков полей суммарно
final case class Config(address : String, featureConfig: FeatureConfig, ...)
final case class FeatureConfig(...)

final case class OptionalConfig(address: Option[String], featureConfig: Option[OptionalFeatureConfig])
final case class OptionalFeatureConfig

def merge(example: Config, external: OptinalConfig): Config = ???

Либо оставляем только опциональную и нам в бизнес логике придется руками постоянно кастовать значения из нуллябельных в не нуллябельные тем или иным способом.

Вариант с HKT:
final case class Config[F[_]](address : F[String], featureConfig: F[FeatureConfig[F]], ...)

def merge(example: Config[Id], external: Config[Option]): Config[Id] = ???
источник

Dv

Dr. Friedrich von Never in 🎄.NET Talks: Evergreen🎄
Так что, если ты искал по-настоящему абсурдную идею, то мог бы предложить что-нибудь другое. От функций отказаться или от классов :)
источник

DS

Doge Shibu in 🎄.NET Talks: Evergreen🎄
Dr. Friedrich von Never
Они говорят, что без женериков (на JVM) им проще язык поднимать, чем с женериками (на CLR).
Но дженерики в языке есть - вопрос только в реализации их в целевом байткоде
источник