我有一个 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 文件的 LibraryExecutable 部分的 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/

10-15 19:18