2009-04-29 2 views
75

Как я изучаю Haskell, я вижу, что в реальной жизни используется много language extensions. Как новичок, я должен научиться их использовать, или я должен избегать их любой ценой? Я вижу, что он нарушает совместимость с Haskell   98 и ограничивает код только в значительной степени GHC. Однако, если я просматриваю пакеты в Hackage, я вижу, что большинство из них - GHC-only.Должен ли я использовать расширения GHC Haskell или нет?

Итак, что такое отношение сообщества к использованию языковых расширений?

И если использование расширений в порядке, как я могу различать расширения, которые я могу использовать «безопасно» (те, которые могут стать частью следующего стандарта Haskell) из тех, которые в основном «экспериментальные»? Например, я полагаю, что -XDisambiguateRecordFields приятный и полезный, но может ли он быть поддержан в будущем?

+0

Я лично не беспокоюсь об этой совместимости; GHC настолько хорош, что это мейнстрим - даже для людей, которые просто отказываются от соответствия мейнстриму (Haskellers). – MasterMastic

ответ

69

Есть некоторые расширения GHC, которые слишком хороши для жизни. Среди моих любимых видов

  • классы типа Многопараметрические
  • переменные типа Scoped
  • высшего ранга
  • Обобщенные алгебраические типы данных (GADTs)

Из них действительно Обязательным является многопараметрической типа.

Некоторые расширения GHC являются очень спекулятивными и экспериментальными, и вы можете использовать их с осторожностью. Хорошим способом идентифицировать стабильное и надежное расширение является то, чтобы увидеть, будет ли он намечен для включения в Haskell Prime, который, как надеется, станет преемником Haskell 98.

I второе предложение дона Стюарта о том, что каждое расширение должно быть отмечено с помощью LANGUAGE прагма в исходном файле. Не используйте расширения с использованием параметров командной строки.

+2

Спасибо! Я буду избегать параметров командной строки для включения расширений. – sastanin

+0

Я не могу себе представить, что у меня нет классов типов параметров или типов с более высоким рейтингом. – alternative

+6

Не следует ли обновлять этот ответ для Haskell 2010? – Henrik

19

Вообще говоря, люди действительно используют расширения GHC довольно сильно, потому что они настолько полезны, и Haskell 98 довольно старый. Когда есть более современные стандарты, люди могут приложить больше усилий, чтобы придерживаться этого.

Статус предложения для следующего стандарта here.

+0

Благодарим вас за ответ и за ссылку. Я предполагаю, что отклоненное предложение следует избегать. – sastanin

+0

Ну, может быть довольно широкий диапазон причин отклонения, поэтому, если вы действительно хотите использовать что-то, копайте немного больше деталей. Но это хорошее эмпирическое правило. –

51

Да, используйте соответствующие расширения.

Но обязательно включите их преднамеренно - только когда вы решите, что в них нуждаетесь. Сделайте это на основе каждого модуля через {-# LANGUAGE Rank2Types #-} (например).

4

Другие ответы здесь хорошие. Я бы добавил, что расширения GHC не так уязвимы для будущего (*), поскольку они могут быть, потому что GHC, кажется, далеко и самый популярный компилятор Haskell, и я не вижу, чтобы это скоро менялось.

(*) как в противостоянии «будущий»