Pull to refresh

Comments 22

А где мораль?
Во первых царь изначально ставил некорректные ТЗ, потому что типизацией нельзя пользоваться для валидации данных на этапе компиляции. Надо четко разделять типизацию и валидацию. Время года - это типизация, ограничения по времени года - это валидация. В остальных задачах так же.
Во вторых царь зачем то лез реализацию стороннего продукта. Если бы кузнец был сотрудником это допустимо, но по условиям сказки кузнец все же был подрядчиком. Как результат царь занимался микроменеджментом у подрядчика Кузнеца.

Во общем молодец кузнец что не стал заключать контракт с таким заказчиком.

Этот синьорЦарь не виноват, ему дали строгие интерфейсы, разрешили наследование реализации, насыпали дженериков — вот он и написал библиотеку, в которой порезвился в compile-time, оверинжинирил по полной, попрятал в реализации грабли, да так что первый же мидлкузнец уволился.
Мне кажется мораль такова:
Не наследуй реализацию! Типизация интерфейсов должна быть утиная, чтобы не было соблазна валидировать на типах. Вообще не занимайтесь мета-программированием на типах, кривая дорожка заведет неизвестно куда.


Получается, кузнец ушел на Кипр в Go? Или в Rust? Криптоподковы на нем очень знатные, но на типах можно порезвиться пожестче. Непонятно.

UFO just landed and posted this here

Потому что это нарушение принципа единой ответственности. Типы они предназначены для описания и контроля собственно типов данных, а не для вычислений факториала на этапе компиляции.
Взгляните на задачу про Кощея и представьте что вам надо пользоватся этим в продакшене: вы, блин, все заказы вот так прямо в коде будете прописывать и каждый раз перекомпилировать? Или всё-таки читать из файла/принимать от пользователя? В последнем случае всё это нагромождение типов будет просто бесполезным.

UFO just landed and posted this here
UFO just landed and posted this here

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

UFO just landed and posted this here

Вы путаете типизацию с валидацией. Типизация должна заблокировать сборку при использовании типа short для 8 битного процессора. Потому что у железа просто нету 16 битного регистра. Валидация проверять удовлетворяет ли значение условию.

UFO just landed and posted this here

Простой пример почему это не так. Вы не можете запустить 64 битную программу на 32 битной системе. Там есть четкой деление что вы делаете и типы под эти задачи, 32 битные для 32 битных систем, 64 битные для 64 битных систем, и автотипы значение которых выбирается от платформы компиляции.

UFO just landed and posted this here

А в чем смысл такой типизации? При том что x в 99,99% случаев это динамические данные полученные из внешней среды?

UFO just landed and posted this here

Вы допускаете ровно ту же ошибку что и царь из этой сказки. Пытаетесь делать валидацию средствами типизации.

В рантайме нету типизации. Она существует только на этапе написания кода, в некоторых языках еще в мете сборки для рефлексии.

UFO just landed and posted this here

Великолепно! Алексей, позвольте выразить мое восхищение! Буду показывать своим студентам

Присоединюсь к мысли, что великолепно.

Но в реальном проекте я бы такое увидеть не хотел...

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

Конкретно алгебраические типы данных тут бы не помогли

Попробовал на третьей скале

  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 ... | Князь = Князь

Но я сходу не придумал как сделать последний шаг, где надо перебрать разные варианты кто кому друг и т.п.

Sign up to leave a comment.

Articles