如果我显式启用 DerivingStrategies,为什么 Cabal 与 GHC 不同,不会自动启用 GeneralizedNewtypeDeriving?

Enr*_*lis 3 haskell typeclass ghc cabal language-extension

文档中我倾向于认为,如果我启用扩展DerivingStrategies,我不需要启用GeneralizedNewtypeDerivingor DeriveAnyClass,也不需要启用我当前在\xc2\xa76.6.7.1之前列出的任何其他扩展,例如DerivingVia

\n

然而,这个玩具示例

\n
{-# LANGUAGE DerivingStrategies #-}\n\nnewtype MyNum = MyNum Int\n deriving stock (Eq, Ord, Show, Read)\n deriving newtype (Num, Enum, Real, Integral)\n\nmain :: IO ()\nmain = print $ MyNum 0\n
Run Code Online (Sandbox Code Playgroud)\n

通过(GHC 9.4.8)编译得很好ghc this-file.hs,但不能通过cabal build(Cabal 3.10.2.1)编译,因为在后一种情况下,还需要我添加

\n
{-# LANGUAGE GeneralizedNewtypeDeriving #-}\n
Run Code Online (Sandbox Code Playgroud)\n

有什么线索吗?

\n
\n

foo.cabal我正在使用的虚拟文件是

\n
cabal-version:   3.8\nname:            foo\nversion:         1.0\n\nexecutable foo\n    main-is:          main.hs\n    build-depends:    base\n
Run Code Online (Sandbox Code Playgroud)\n

Nou*_*are 6

您确实需要启用各个扩展。DerivingStrategies只为您提供新的语法来指定您想要的派生策略。

GHC 不需要您启用的原因GeneralizedNewtypeDeriving是因为它是语言扩展集的一部分,并且 GHC默认GHC2021使用语言扩展集。GHC2021

default-languageCabal 通过组件字段确定它使用的语言扩展集。在您的示例中,您将其遗漏了(这是不好的做法),并且显然 CabalHaskell2010在这种情况下仍然默认使用。因此,要解决此问题,您只需设置该default-language字段即可:

cabal-version:   3.8
name:            foo
version:         1.0

executable foo
    main-is:          main.hs
    build-depends:    base
    default-language: GHC2021
Run Code Online (Sandbox Code Playgroud)