Здравствуйте, vdimas, Вы писали:
V>В этом примере One, Two — конструкторы алгебраического типа. Каждый из них конструирует обобщенный тип MyNum, заворачивая в него пустой тупл.
Какой ещё обобщённый тип? Т.е. там есть ещё и его конкретизации? GHCi считает иначе:
*Main> :t One
One :: MyNum
*Main> :t Two
Two :: MyNum
По его мнению One и Two имеют одинаковый тип — MyNum, что можно увидеть парой строк выше.
Нет там больше никаких других типов.
V>Случай вырожденный, размеченное объединение для всех своих значений состоит из собс-но кода разметки и ничего более, т.е. такое использование близко к enum из C++ или C#.
Если добавить аргументов конструкторам значений, то с точки зрения типов ничего не изменится.
V>Да, алгебраические типы — очень удобная модель как раз для тех задач, где мы сегодня используем динамическое приведение в языках без оного. Внутренний механизм идентичен (даже для Хаскеля), но степень контроля компилятором значительно выше.
Система типов и внутренний механизм её реализующий — это как бы очень разные вещи.
Механизм знать полезно, но то, что он реализует важнее.
Я не понимаю почему ты не хочешь провести границу между абстракцией и её реализацией.
Надо бы это обсуждение в ДП снести — может хардкорные функциональщики подтянутся.
now playing: Gui Boratto — Beluga