Ответ 1
Apfelmus сделал видеоурок для GADT, который может быть полезен.
Я начал читать о GADT в Haskell Wiki, но не очень хорошо понимал это. Вы рекомендуете конкретную книгу или статью в блоге, объясняющую GADT для новичков Haskell?
Apfelmus сделал видеоурок для GADT, который может быть полезен.
Мне нравится пример в руководстве GHC. Это просто, и это иллюстрирует некоторые ключевые моменты:
GADT позволяют использовать систему типов Haskell для моделирования системы типов языка, который вы реализуете ( "язык объектов" )
Это позволяет статической проверке Haskell утверждать, что ваш "компилятор проходит" или что-то не сохраняет тип. Функции, принимающие объектно-язычные термины, могут предполагать, что эти термины хорошо типизированы. Функции, возвращающие термины на языке объектов, необходимы для создания четко типизированных терминов.
Соответствие шаблону конструктору GADT вызывает уточнение типа. eval
имеет тип Term a -> a
в целом, но правая часть для eval (Lit i)
имеет тип Int
, потому что левый конструктор имел тип Term Int
.
Система Haskell не заботится о том, какие типы вы дадите своим конструкторам GADT. Мы могли бы так же легко сделать каждый конструктор в data Term a
дать результат типа Term a
, или Term Bool
, и определение data
все равно пройдет. Но мы не сможем написать eval :: Term a -> a
. Вы выбираете типы тегов GADT для моделирования своей проблемы, так что полезные функции, которые вы хотите записать, хорошо типизированы.
Другие ссылки:
Haskell wiki GADTs для чайников - лучшее объяснение, которое я видел.
Проблема я (и, как я подозреваю, другие) с большинством представлений заключается в том, что они показывают примеры GADT в терминах синтаксиса, что неочевидно до тех пор, пока вы не поймете GADT. Это делает простейшие примеры, на которые все построено особенно сложно, чтобы полностью понять - вы можете догадаться о том, что делают многие из шаблонов, но понимание точной роли каждого утверждения является сложным.
Сообщение "для чайников" анализирует и создает смысл синтаксиса на пути к объяснению его собственных основных примеров, что делает его гораздо более полезной отправной точкой. Я очень рекомендую его.