关于在cabalized项目中指定扩展的公约

时间:2012-03-02 22:13:04

标签: haskell ghc cabal language-extension

对于任何.hs文件,您可以指定您所依赖的语言扩展名:

{-# LANGUAGE Foo, Bar, Baz #-}

cabalized项目还可以在.cabal文件中基于每个项目指定语言扩展名:

extensions: Foo, Bar, Baz

其中哪些被认为是“最佳做法”?是否应使用.cabal文件中列出的所有扩展名,作为记录您的包与哪些编译器兼容的形式?或者是否应该基于每个文件记录所有扩展名,以便明确哪些文件取决于哪些扩展名?在这两个地方广泛记录怎么样?或者是介于两者之间的最佳实践?

2 个答案:

答案 0 :(得分:7)

这取决于他们使用了多少。如果在项目的每个模块中使用扩展,则可能需要将其放在cabal文件中;例如,如果你在任何地方都使用C预处理程序指令,那么将CPP放在extensions字段中而不是一遍又一遍地列出它是有意义的,如果你的实例中有很多复杂的实例声明模块,将FlexibleInstances放在那里也是合理的。

但是“危险”扩展(例如UndecidableInstances)和仅在少数地方使用的扩展应该放在文件的顶部:前者用于文档(即“这里是龙”),后者对于文档和保持扩展的影响是隔离的,所以你不要意外地使用扩展的效果,而你不打算在另一个模块中。

一般情况下,我将错误放在文件的顶部,并且在反复指定扩展名时仅使用extensions字段会让人讨厌。

答案 1 :(得分:0)

好的,问答都很老。所以我对扩展状态进行了一些更新。如果您在许多模块中使用了一些无害的语言扩展(例如-XRecordWildCards-XDeriveDataTypeable-XTypeVariables),或者发现将{-# LANGUAGE ... #-} pragma放在最顶层时很烦人(因为您可能不知道某些允许您自动放置语言编译指示的IDE或工具,那么您应该使用default-extensions:字段。请注意,还有other-extensions:字段在我看来非常混乱,不应该使用。请参阅examples here