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