Re[38]: Проблемы организации OR-мапинга
От: vdimas Россия  
Дата: 29.04.09 05:23
Оценка:
Здравствуйте, 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>Я не понимаю почему ты не хочешь провести границу между абстракцией и её реализацией.


А я не понимаю твоего упорства — всё более чем прозрачно.

И как раз об абстракции и говорил в первом утверждении, что полиморфизм по алгебраическим типам — это классика динамической типизации. Могу усилить — это наилучший на сегодня способ использования динамической типизации.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.