我有一个经常使用大量语言功能的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
复制语言块,这很烦人。
仅使用CPP
pragma #include
提前谢谢。
答案 0 :(得分:15)
使用cabal作为构建系统,并在Extensions
文件的Library
或Executable
部分的project.cabal
字段中列出所需的语言扩展名。然后从Haskell源文件中删除LANGUAGE
块。
请参阅Cabal User Guide,包括简介的第三段。
Ghci就是它倒塌的地方。有关于添加cabal ghci
命令的说法,但与此同时它有点icky。
如果您的项目是库,则可以运行ghci -package-conf dist/package.conf.inplace
。
如果你想在ghci中加载未曝光的模块,我会在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