Haskell - любой способ бросить свою собственную группу прагм LANGUAGE?

У меня есть проект Haskell, который регулярно использует множество языковых функций, и я хочу, чтобы блок расширения языка для каждого исходного файла был таким же. Вот список,

{-# LANGUAGE Arrows,
             BangPatterns,
             DefaultSignatures,
             DeriveDataTypeable,
             DeriveFunctor,
             EmptyDataDecls,
             FlexibleContexts,
             FlexibleInstances,
             FunctionalDependencies,
             GADTs,
             GeneralizedNewtypeDeriving,
             MultiParamTypeClasses,
             NamedFieldPuns,
             NoImplicitPrelude,
             NoMonomorphismRestriction,
             OverlappingInstances,
             RankNTypes,
             RebindableSyntax,
             ScopedTypeVariables,
             StandaloneDeriving,
             TemplateHaskell,
             TypeFamilies,
             TypeOperators,
             TypeSynonymInstances,
             UndecidableInstances,
             ViewPatterns #-}

Может быть, для некоторых это плохая практика, но я считаю, что языковые расширения являются частью "Haskell +", которые я обычно пишу в коде. И я хочу, чтобы это было одинаково для модулей. Например, NoImplicitPrelude резко меняет язык, и я хочу, чтобы он был равномерным для всех модулей.

Вопрос: Как я могу достичь этого, не копируя языковой блок в каждый файл? Меня раздражает то, как я часто участвую в новой языковой функции, добавляю ее в модуль A, затем начинаю работать над модулем B и понимаю, что мне нужно скопировать языковой блок из модуля A.

Просто FYI прагма CPP с #include не делает этого трюка! Спасибо заранее.

Ответ 1

Используйте cabal как свою систему сборки и перечислите расширения языка, которые вы хотите в поле Extensions раздела Library или Executable вашего файла project.cabal. Затем удалите блок LANGUAGE из исходных файлов Haskell.

См. Руководство пользователя Cabal, включая третий абзац введения.


Ghci - это место, где все падает. Существует разговор о добавлении команды cabal ghci, но в то же время это немного нехорошо.

Если ваш проект является библиотекой, вы можете запустить ghci -package-conf dist/package.conf.inplace.

Если вы хотите загрузить неэкспонированные модули в ghci, я бы определил флаг "mode mode" в вашем project.cabal:

Flag development
  Description:          Development mode: expose all modules, enable warnings.
  Default:              False

... условно выставлять дополнительные модули в режиме разработки:

Library
  Exposed-modules:      My.Module, My.Module.Extra
  if flag(development)
    Exposed-modules:    My.Module.Hidden, My.Module.Secret
    GHC-Options:        -Wall
  -- plus your extensions, etc

... и явно включить режим разработки при запуске cabal configure:

$ cabal configure -f development