gat*_*ado 12 haskell code-organization ghc
我有一个经常使用许多语言功能的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 #-}
Run Code Online (Sandbox Code Playgroud)
也许对某些人来说这是不好的做法,但我认为语言扩展是我经常编写代码的"Haskell +"的一部分.而且,我希望它在模块之间是相同的.例如,NoImplicitPrelude
语言显着改变,我希望所有模块都统一.
问题:如何在不将语言块复制粘贴到每个文件中的情况下如何实现此目的?我经常学习新的语言功能,将其添加到模块A
,然后开始处理模块B
,并意识到我必须从模块中复制语言块,这很烦人A
.
仅仅是CPP
因为一个没有做到这#include
一点的pragma !提前致谢.
dav*_*420 15
使用cabal作为构建系统,并在文件或文件部分的Extensions
字段中列出所需的语言扩展名.然后从Haskell源文件中删除该块.Library
Executable
project.cabal
LANGUAGE
请参阅Cabal用户指南,包括简介的第3段.
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
Run Code Online (Sandbox Code Playgroud)
...在开发模式下有条件地暴露额外的模块:
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
Run Code Online (Sandbox Code Playgroud)
...并在运行时显式启用开发模式cabal configure
:
$ cabal configure -f development
Run Code Online (Sandbox Code Playgroud)