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