Материал для обучения GADT

Я начал читать о GADT в Haskell Wiki, но не очень хорошо понимал это. Вы рекомендуете конкретную книгу или статью в блоге, объясняющую GADT для новичков Haskell?

Ответы

Ответ 2

Мне нравится пример в руководстве 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 для моделирования своей проблемы, так что полезные функции, которые вы хотите записать, хорошо типизированы.

Ответ 4

Haskell wiki GADTs для чайников - лучшее объяснение, которое я видел.

Проблема я (и, как я подозреваю, другие) с большинством представлений заключается в том, что они показывают примеры GADT в терминах синтаксиса, что неочевидно до тех пор, пока вы не поймете GADT. Это делает простейшие примеры, на которые все построено особенно сложно, чтобы полностью понять - вы можете догадаться о том, что делают многие из шаблонов, но понимание точной роли каждого утверждения является сложным.

Сообщение "для чайников" анализирует и создает смысл синтаксиса на пути к объяснению его собственных основных примеров, что делает его гораздо более полезной отправной точкой. Я очень рекомендую его.