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

时间:2012-01-19 08:55:20

标签: haskell ghc code-organization

我有一个经常使用大量语言功能的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 提前谢谢。

1 个答案:

答案 0 :(得分:15)

使用cabal作为构建系统,并在Extensions文件的LibraryExecutable部分的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