7

阴谋集团给我的信息不一。当我说:

Extensions: DeriveFunctor

它说:

Warning: Unknown extensions: DeriveFunctor

但是当我说:

GHC-Options: -XDeriveFunctor

它说:

Warning: Instead of 'ghc-options: -XDeriveFunctor' use 'extensions:
DeriveFunctor'

现在我只使用{-# LANGUAGE DeriveFunctor #-}编译指示。

$ 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
4

2 回答 2

7

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

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

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

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

于 2010-10-25T14:46:57.630 回答
4

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

@Tom Lokhorst 是正确的,LANGUAGE pragma 是最佳选择。我不喜欢使用 Cabal 的 Extensions 字段,因为所有模块的所有扩展都处于活动状态,而我通常不希望这样做。

于 2010-10-23T01:07:15.310 回答