Что касается вашего вопроса 2 (как кодировать варианты использования GADT в Haskell 98), вы можете посмотреть на эту статью 2006 года Сульцманом и Вангом: GADTless programming in Haskell 98.
Как и работа OCaml, на которую вы ссылаетесь, это работает путем факторизации GADT через тип равенства. Существуют различные способы определения типа равенства; они используют форму равенства Лейбница как для OCaml, что позволяет заменить через любое применение оператора типа в виде * -> *
.
В зависимости от того, как определяется тип проверки правильности GADT-эквивалентов, это может быть недостаточно выразительным, чтобы охватить все примеры GADT: контролер может применять правила рассуждений о равенстве, которые не обязательно фиксируются этим определением. Например, a*b = c*d
подразумевает a = c
и b = d
: эта форма декомпозиции не возникает, если вы применяете только конструкторы типов в виде * -> *
. Позже в 2010 году Oleg discussed, как вы можете использовать семейства типов для применения «деконструкторов типа» через равенство Лейбница, получая свойства разложения для этого определения, - но, конечно, это снова за пределами Haskell 98.
Это то, что нужно помнить типа: ваш язык является полным для равенства лейбниц, в том смысле, что он может выразить то, что может сделать специалист по решению равенства?
Даже если вы найдете кодировку типа равенства, которая достаточно выразительна, у вас появятся очень практические проблемы удобства: при использовании GADT все применения свидетельства о равенстве выводятся из аннотаций типа. С этой явной кодировкой у вас будет гораздо больше работы.
Наконец (не каламбур), много случаев использования в GADTs может быть в равной степени выражены tagless-final embeddings (опять же Олега), что IIRC часто может быть сделано в Haskell 98. blog post Мартин Ван Steenbergen, что доны указывает в комментарии ответа в этом духе, но Олег значительно улучшил эту технику.
@ is7s: как я могу это сделать? В настоящее время я обнимаюсь с опцией '-98'. – Pteromys
Люди - GHC-специфические языковые расширения недоступны в Hugs. –