我有一个 Haskell 项目,它经常使用很多语言功能,我希望每个源文件的语言扩展块都相同。这是一个 list ,
{-# 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
的 #include
pragma 行不通!提前致谢。 最佳答案
使用 cabal 作为构建系统,并在 Extensions
文件的 Library
或 Executable
部分的 project.cabal
字段中列出您想要的语言扩展。然后从 Haskell 源文件中删除 LANGUAGE
块。
参见 Cabal User Guide ,包括介绍的第三段。
Ghci 是一切都失败的地方。有人谈论添加 cabal ghci
命令,但同时它有点棘手。
如果你的项目是一个库,你可以运行 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
关于haskell——有什么办法可以滚动你自己的 LANGUAGE 编译指示组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8923317/