Какие расширения Haskell (GHC) должны использовать/избегать пользователей?

У меня был опыт несколько раз, когда GHC сказал мне использовать расширение, только чтобы узнать, что при использовании этого расширения я сделал код намного сложнее, когда простой рефактор позволил мне придерживаться Haskell 98 (теперь 2010) и имеет более прямое решение.

С другой стороны, есть также случаи, когда GADT или Rank2Types (редко RankNTypes) делают намного меньше работы и намного более чистый код.

Какие расширения обычно затушевывают возможность лучшего дизайна и которые обычно улучшают его? Если некоторые из них выполняют оба действия, что должен искать пользователь (убедитесь, что это правда или не соответствует решению, которое они намереваются), прежде чем принимать решение об использовании этого расширения?

(См. также Должен ли я использовать расширения GHC Haskell или нет?)

Ответ 1

Специальный список морально "хороших" расширений и морально "плохих" - это эстетическое суждение!

Хороший

  • GADTs
  • Учет параллельных списков
  • Защиты шаблонов
  • Монады.
  • Секции кортежей
  • Запись диких карт
  • Пустое объявление объявляет
  • Экзистенциальные типы
  • Генерация обобщенного нового типа
  • MPTCs + FDs
  • Типы семейств
  • Явное количественное определение
  • Полиморфизм более высокого ранга
  • Лексически охваченные тиварами
  • Шаблоны взлома

Плохой

  • Понятия SQL
  • Неявные параметры

Уродливый (но обязательно)

  • Шаблон Haskell
  • Unboxed типы и кортежи
  • Неразрешимые, перекрывающиеся и некогерентные экземпляры - обычно означает, что у вас неправильное определение.

Не уверен

  • Обозначение стрелки
  • Просмотр шаблонов