对于任何.hs文件,您可以指定您所依赖的语言扩展名:
{-# LANGUAGE Foo, Bar, Baz #-}
cabalized项目还可以在.cabal文件中基于每个项目指定语言扩展名:
extensions: Foo, Bar, Baz
其中哪些被认为是“最佳做法”?是否应使用.cabal文件中列出的所有扩展名,作为记录您的包与哪些编译器兼容的形式?或者是否应该基于每个文件记录所有扩展名,以便明确哪些文件取决于哪些扩展名?在这两个地方广泛记录怎么样?或者是介于两者之间的最佳实践?
答案 0 :(得分:7)
这取决于他们使用了多少。如果在项目的每个模块中使用扩展,则可能需要将其放在cabal文件中;例如,如果你在任何地方都使用C预处理程序指令,那么将CPP
放在extensions
字段中而不是一遍又一遍地列出它是有意义的,如果你的实例中有很多复杂的实例声明模块,将FlexibleInstances
放在那里也是合理的。
但是“危险”扩展(例如UndecidableInstances
)和仅在少数地方使用的扩展应该放在文件的顶部:前者用于文档(即“这里是龙”),后者对于文档和保持扩展的影响是隔离的,所以你不要意外地使用扩展的效果,而你不打算在另一个模块中。
一般情况下,我将错误放在文件的顶部,并且在反复指定扩展名时仅使用extensions
字段会让人讨厌。
答案 1 :(得分:0)
好的,问答都很老。所以我对扩展状态进行了一些更新。如果您在许多模块中使用了一些无害的语言扩展(例如-XRecordWildCards
,-XDeriveDataTypeable
,-XTypeVariables
),或者发现将{-# LANGUAGE ... #-}
pragma放在最顶层时很烦人(因为您可能不知道某些允许您自动放置语言编译指示的IDE或工具,那么您应该使用default-extensions:
字段。请注意,还有other-extensions:
字段在我看来非常混乱,不应该使用。请参阅examples here。