Здравствуйте, vdimas, Вы писали:
V>Они имеют тип ()->MyEnum. Это тип ф-ии, возвращающей значение MyEnum.
Этот тезис неплохо бы подтвердить сессией GHCi или что у тебя там установлено.
Ничто не подтверждает, что тип ()->MyEnum.
V>Зря ты рассматриваешь вырожденный случай, добавь туда параметр:
V>V>data MyNum a = One | Two | Three a
V>
V>И посмотри, что тебе выдаст Three.
Смотри ниже.
EC>>Если добавить аргументов конструкторам значений, то с точки зрения типов ничего не изменится.
V>Ты бы сначала добавил.
Так добавил, результат тот же, тип всё равно
один:
*Main> :i MyNum
data MyNum = One Int | Two String
*Main> :t One 1
One 1 :: MyNum
*Main> :t Two "2"
Two "2" :: MyNum
V>>>Да, алгебраические типы — очень удобная модель как раз для тех задач, где мы сегодня используем динамическое приведение в языках без оного. Внутренний механизм идентичен (даже для Хаскеля), но степень контроля компилятором значительно выше.
EC>>Система типов и внутренний механизм её реализующий — это как бы очень разные вещи.
V>Фиг там. Есть некая вычислительная модель, напр. модель алгебраических типов. И как она реализуется я показывал на листинге результата компиляции IDL. Вот конкретика не важна, а суть должна соответствовать вычислительной модели.
EC>>Механизм знать полезно, но то, что он реализует важнее.
V>В случае алгебраических типов он 1-в-1 реализует "то, что он реализует".
EC>>Я не понимаю почему ты не хочешь провести границу между абстракцией и её реализацией.
V>А я не понимаю твоего упорства — всё более чем прозрачно.
V>И как раз об абстракции и говорил в первом утверждении, что полиморфизм по алгебраическим типам — это классика динамической типизации. Могу усилить — это наилучший на сегодня способ использования динамической типизации.
Давай ты приведёшь хоть какую-то иллюстрацию, только не умозрительную, а вывод интерпретатора или что-то в этом роде из которой будет видно, что в рассматриваемом наме примере участвуют хотя бы 2 хаскельных типа.
А то тип вроде один, а ты говоришь оприведении. К какому типу мы приводим, если он один?