Очевидно, что есть более простое решение. И оно давно известно (WITH).
У WITH есть 2 фатальных недостатка. И второй неоднократно осуждали - возможность порушить пресловутую герметичность типов. Можно допиливать, накладывая всякие ограничения (и усложнения, хе-хе!). Но мне захотелось чего-то еще лучшего и естественного (IF намного менее громоздко, нежели WITH, не говоря о просто выражениях а-ля "(x IS T) & x.field"). Кроме того, в моем решении есть прицел на ненулевые указатели и OPTIONAL типы - для которых такой подход также единообразно будет работать.
Простота достигается с помощью разделения и специализации. (Разделяй и властвуй)
У тебя же с точностью наоборот. Попытка впихнуть невпихуемое.
Не понял - еще раз, где мое решение не просто? Оно даже в коде реализации достаточно простое. А при использовании так вообще - максимально естественно - проверил тип, получил к нему доступ.
А на счет простоты математики не понял. Выражение может быть сколь угодно сложным.
Оно может быть сколь угодно сложным, но для получения результата достаточно выбросить все, кроме IS, &, OR, ~. После этого все получается просто
Представь, что ты проверяешь тип в сложном выражении и потом кастаешь его - на свой страх и риск, а тут у тебя компилятор гарантирует, что все правильно, да еще и кастать не надо! Счастье же ш и расслабон!
Значит ты либо должен сделать полный вывод и компиляцию раскладов (не представляю возможно ли такое), либо врубать неопределенность при первом шухере..., но в чем тогда смысл? По сравнению с WITH это похоже на использование скотча.
Попробуй придумать выражение, вывод которого очевиден программисту, но на котором будет тупить компилятор? Может я правда что-то упустил.
P.S. Конечно это не хаскель
Решение
очень простое - поэтому мне и странно противопоставление идеям оберона.