Comments 22
А где мораль?
Во первых царь изначально ставил некорректные ТЗ, потому что типизацией нельзя пользоваться для валидации данных на этапе компиляции. Надо четко разделять типизацию и валидацию. Время года - это типизация, ограничения по времени года - это валидация. В остальных задачах так же.
Во вторых царь зачем то лез реализацию стороннего продукта. Если бы кузнец был сотрудником это допустимо, но по условиям сказки кузнец все же был подрядчиком. Как результат царь занимался микроменеджментом у подрядчика Кузнеца.
Во общем молодец кузнец что не стал заключать контракт с таким заказчиком.
Этот синьорЦарь не виноват, ему дали строгие интерфейсы, разрешили наследование реализации, насыпали дженериков — вот он и написал библиотеку, в которой порезвился в compile-time, оверинжинирил по полной, попрятал в реализации грабли, да так что первый же мидлкузнец уволился.
Мне кажется мораль такова:
Не наследуй реализацию! Типизация интерфейсов должна быть утиная, чтобы не было соблазна валидировать на типах. Вообще не занимайтесь мета-программированием на типах, кривая дорожка заведет неизвестно куда.
Получается, кузнец ушел на Кипр в Go? Или в Rust? Криптоподковы на нем очень знатные, но на типах можно порезвиться пожестче. Непонятно.
Потому что это нарушение принципа единой ответственности. Типы они предназначены для описания и контроля собственно типов данных, а не для вычислений факториала на этапе компиляции.
Взгляните на задачу про Кощея и представьте что вам надо пользоватся этим в продакшене: вы, блин, все заказы вот так прямо в коде будете прописывать и каждый раз перекомпилировать? Или всё-таки читать из файла/принимать от пользователя? В последнем случае всё это нагромождение типов будет просто бесполезным.
Потому что первые два определяют размер регистра процессора который надо использовать для вычислений. А последний это диапазон значений при которой будет отрабатывать бизнес логика.
Вы путаете типизацию с валидацией. Типизация должна заблокировать сборку при использовании типа short для 8 битного процессора. Потому что у железа просто нету 16 битного регистра. Валидация проверять удовлетворяет ли значение условию.
А в чем смысл такой типизации? При том что x в 99,99% случаев это динамические данные полученные из внешней среды?
Великолепно! Алексей, позвольте выразить мое восхищение! Буду показывать своим студентам
Царю, бы давно пора понять, что раз хочется алгебраических типов данных, надо уже закопать стюардессу и перейти хотя бы на скалу, чем пытаться к джаве синей изолентой сбоку костыли приматывать.
Попробовал на третьей скале
trait Конюх
trait Лекарь
trait Поп
trait Писарь
trait Князь
trait МожетПоднятьТяжесть[-Кто]
given МожетПоднятьТяжесть[Конюх | Поп | Князь] = ???
trait ЗнаетГдеПерстень[-T]
given ЗнаетГдеПерстень[Лекарь | Писарь] = ???
trait ИмеетКлюч[-Кто]
given ИмеетКлюч[Поп | Писарь] = ???
trait Должен[Кто, Кому]
given Должен[Конюх, Лекарь]= ???
given Должен[Поп, Князь]= ???
given Должен[Князь, Писарь]= ???
trait Друзья[A, B]
given Друзья[Лекарь, Князь]= ???
given Друзья[Князь, Лекарь]= ???
given Друзья[Конюх, Поп]= ???
given Друзья[Поп, Конюх]= ???
trait Thief[T]
given [T](using ИмеетКлюч[T], МожетПоднятьТяжесть[T], ЗнаетГдеПерстень[T]): Thief[T] = ???
given [T, U](using Друзья[T, U], МожетПоднятьТяжесть[T], ИмеетКлюч[U], ЗнаетГдеПерстень[U]): Thief[T] = ???
given [T, F, D](using Друзья[T, F], МожетПоднятьТяжесть[T], ЗнаетГдеПерстень[F], Должен[D, T], ИмеетКлюч[D]): Thief[T] = ???
summon[Thief[Писарь]]
summon[Thief[Поп]]
summon[Thief[Конюх]]
summon[Thief[Лекарь]]
summon[Thief[Князь]]
Компилятор (и кстати IDEA тоже) ругается сразу на четыре строчки, а на summon[Thief[Князь]]
не ругается.
Ещё в третьей версии языка появились лямбды для типов
type МожетПоднятьТяжесть[Кто] = Кто match
case Конюх | Поп | Князь => Кто
case _ => Nothing
В идеале хотелось бы использовать факт что `T | Nothing == T` и собрать в одно выражение, чтобы считалось так:
Вор[Писарь] | Вор[Поп] | ... = Nothing | Nothing ... | Князь = Князь
Но я сходу не придумал как сделать последний шаг, где надо перебрать разные варианты кто кому друг и т.п.
Сказка о типизации