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

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

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

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

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

1 ответ

Решение

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

Хорошо

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

Плохо

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

Гадкий (но необходимый)

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

Точно сказать не могу

  • Обозначение стрелки
  • Посмотреть шаблоны
Другие вопросы по тегам