DeriveFunctor是一个公认的扩展吗?Cabal似乎很困惑

Oll*_*ers 7 build-process haskell ghc cabal

Cabal正在给我混合信息.当我说:

Extensions: DeriveFunctor
Run Code Online (Sandbox Code Playgroud)

它说:

Warning: Unknown extensions: DeriveFunctor
Run Code Online (Sandbox Code Playgroud)

但当我说:

GHC-Options: -XDeriveFunctor
Run Code Online (Sandbox Code Playgroud)

它说:

Warning: Instead of 'ghc-options: -XDeriveFunctor' use 'extensions:
DeriveFunctor'
Run Code Online (Sandbox Code Playgroud)

现在我只想使用{-# LANGUAGE DeriveFunctor #-}pragma.

$ cabal --version
cabal-install version 0.8.2
using version 1.8.0.6 of the Cabal library 
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.12.3
$ basename $(mdfind haskell-platform | grep .dmg)
haskell-platform-2010.2.0.0.i386.dmg
Run Code Online (Sandbox Code Playgroud)

Dun*_*tts 7

您仍然可以extensions: DeriveFunctor在.cabal文件中使用.是的,它不是Cabal目前已知的扩展,但您仍然可以使用它,只要编译器识别它,它就可以工作.事实上,Cabal将检查编译器是否确实识别了扩展,即使Cabal本身并不知道它.

模块中有一个扩展的中央注册表Language.Haskell.Extension.此注册表的目的是使不同的编译器在实现相同的扩展时可以就相同的名称达成一致.我们过去曾遇到过不同编译器的作者意外地给同一扩展概念赋予不同名称的案例.并非所有扩展都需要注册.有意义的是不注册仍然具有高度实验性的扩展,例如DPH扩展"PArr"仍未注册.Hackage要求所有上传的包只使用已知的已注册扩展,这是有道理的,因为如果扩展已经足够准备好在分布式包中使用,那么可以注册.

在这种特殊情况下,GHC开发人员似乎忘记了注册扩展.

同样值得注意的是,从Cabal-1.10开始,该extensions领域被分成两部分:default-extensionsother-extensions.这解决了John在他的回答中指出的问题,即之前的行为是所有模块的所有扩展都是活动的,我们承认这是一个错误.该other-extensions字段允许LANGUAGE列出某些模块中使用的扩展(即使用pragma).Cabal最终将强制列出它们,就像它要求列出所有包依赖项一样.语言依赖性也是依赖性.


Joh*_*n L 4

根据Hackage 文档,从 Cabal-1.8.0.6 开始,DeriveFunctor无法识别。它是 GHC 的一个相对较新的补充,并且似乎没有广泛使用,所以我并不惊讶它会被 Cabal 忽视。这可能应该作为针对 Cabal 的错误(功能请求?)提交。

@Tom Lokhorst 是对的,语言编译指示是最好的选择。我不喜欢使用 Cabal 的扩展字段,因为这样所有扩展都对所有模块都有效,这是我通常不想要的。