问题 haskell - 任何方式来推广自己的LANGUAGE组合语言?


我有一个经常使用许多语言功能的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 with a #include 不  诀窍!提前致谢。


12290
2018-01-19 08:55


起源

以前的相关问题: stackoverflow.com/questions/6005382/... - gatoatigrado
我强烈建议不要包括 OverlappingInstances 在您的默认扩展名列表中。 - ehird
@ehird,好点;它虽然偶尔使用。 - gatoatigrado


答案:


使用cabal作为您的构建系统,并列出您想要的语言扩展 Extensions 的领域 Library 要么 Executable 你的部分 project.cabal 文件。然后删除 LANGUAGE 阻止您的Haskell源文件。

Cabal用户指南,包括引言的第三段。


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

14
2018-01-19 09:00



看起来不错。只有一个问题:我如何使用ghci? (最好是项目中的任何模块 - 我不想每次都编辑cabal文件) - gatoatigrado
看我的编辑。我是否正确理解了您每次都不想编辑cabal文件的观点? - dave4420
很抱歉不清楚。编辑肯定是有用的,但我认为不是我正在寻找的。假设我正在研究模块 A。然后,没有阴谋,我可以输入 ghci A,它会尝试加载。我可以重装 :r,直到它工作,然后继续工作模块 B,通过打字 :l B (或退出并运行 ghci B)。 - gatoatigrado
我不知道。如何编辑cabal文件有帮助? - dave4420