For any .hs file, you can specify the language extensions you rely on like so:
{-# LANGUAGE Foo, Bar, Baz #-}
A cabalized project can also specify language extensions on a per-project basis in the .cabal file:
extensions: Foo, Bar, Baz
Which of these is considered "best practice"? Should all extensions used be listed in the .cabal file, as a form of documenting which compilers your package is compatible with? Or should all extensions be noted on a per-file basis, for the sake of making clear which files depend on which extensions? What about extensively documenting in both places? Or is best practice somewhere in-between?