对于任何.hs文件,您可以像这样指定您所依赖的语言扩展名:
{-# LANGUAGE Foo, Bar, Baz #-}
标准化项目还可以在.cabal文件中按项目指定语言扩展名:
extensions: Foo, Bar, Baz
其中哪些被认为是“最佳实践”?是否应将所有使用的扩展名都列在.cabal文件中,以书面形式说明您的软件包与哪些编译器兼容?还是应该按文件逐个记录所有扩展名,以便弄清楚哪些文件依赖于哪些扩展名?在这两个地方进行大量记录该怎么办?还是最佳实践介于两者之间?
最佳答案
这取决于它们的使用量。如果在项目的每个模块中都使用扩展名,则可能需要将其放入cabal文件中。例如,如果您到处都使用C预处理程序指令,则仅将CPP
放入extensions
字段中而不是一遍又一遍地列出它是有意义的,并且如果您的模块中有很多复杂的实例声明,则可以合理地放置里面也有FlexibleInstances
。
但是,“危险的”扩展名(例如UndecidableInstances
)以及仅在几个地方使用的扩展名应该放在文件的顶部:前者用于记录文档(即“here be dragons”),后者用于记录文档并保持其效果。扩展名是隔离的,因此您不会在不打算在另一个模块中使用的情况下意外地使用了扩展名的效果。
通常,我会把它们放在文件的顶部是错误的,并且一遍又一遍地指定扩展名时仅使用extensions
字段会很烦人。
关于haskell - 在俗称的项目中指定扩展名的约定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9541107/