haskell - 任何方式来推动你自己的LANGUAGE组合语法?

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源文件中删除该块.LibraryExecutableproject.cabalLANGUAGE

请参阅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)