【问题标题】:Haskell language extensions: pragma vs. compiler flag?Haskell 语言扩展:pragma 与编译器标志?
【发布时间】:2015-11-18 00:12:57
【问题描述】:

要在项目的所有文件中使用语言扩展名,例如 UnicodeSyntax,有两个选项:

  • 每个源文件中都有一个编译指示: {-# LANGUAGE UnicodeSyntax #-}
  • .cabal 文件的每个部分(库、可执行文件、测试)中添加extensions: UnicodeSyntax

是否有任何理由或最佳实践来选择其中之一?

我正在使用stack 和他们的标准new-template 用于简单的包。

【问题讨论】:

  • 请注意,您可以有选择性:对于每个源文件,您可以启用不同的扩展名...
  • 另外:你使用Makefile吗?
  • 同意@CommuSoft,但如果我在所有文件中使用扩展名,编译器标志似乎可以减少重复。我想知道编译器标志是否是某种不好的做法。
  • 我不明白为什么要在某些 Makefile 或 shell 脚本中包含标志,否则其他程序员将很难“猜测”正确的标志。请注意,一个潜在的优势可能是分析程序(如可以解析man 页面的fish)如果标志不可用,则可能已经发出警告。
  • 因为 my.cabal 包含:ghc-options: «some options» 它听起来确实是 ghc 特定的,并且不便携,而不是 pragma。

标签: haskell haskell-stack


【解决方案1】:

就个人而言,我总是在每个使用它们的文件中列出所有语言扩展名。然后,您只需查看代码即可准确判断特定代码正在使用哪些扩展。这意味着我可以立即判断,例如,这段代码是否使用 Template Haskell 做某事。而且我不必查看任何相关文件来弄清楚这一点。这也意味着我可以从命令行手动编译该模块,而无需记住我需要哪些扩展。

我想有话要说,因为能够浏览 Cabal 规范以了解特定包使用了哪些扩展。

【讨论】:

  • 最好有一个 required-extensions 部分让 cabal 在模块请求未列出的扩展时使其失败/警告,并在构建完成并且从未请求列出的扩展时发出警告.
猜你喜欢
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
相关资源
最近更新 更多