从文档中,我倾向于认为,如果启用该DerivingStrategies
扩展,我不需要启用GeneralizedNewtypeDeriving
or DeriveAnyClass
,也不需要启用我当前在§6.6.7.1之前列出的任何其他扩展,例如DerivingVia
。
然而,这个玩具示例
{-# LANGUAGE DerivingStrategies #-}
newtype MyNum = MyNum Int
deriving stock (Eq, Ord, Show, Read)
deriving newtype (Num, Enum, Real, Integral)
main :: IO ()
main = print $ MyNum 0
通过(GHC 9.4.8)编译得很好ghc this-file.hs
,但不能通过cabal build
(Cabal 3.10.2.1),因为在后一种情况下,还需要我添加
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
有什么线索吗?
foo.cabal
我正在使用的虚拟文件是
cabal-version: 3.8
name: foo
version: 1.0
executable foo
main-is: main.hs
build-depends: base
您确实需要启用各个扩展。
DerivingStrategies
只为您提供新的语法来指定您想要的派生策略。GHC 不需要您启用的原因
GeneralizedNewtypeDeriving
是因为它是语言扩展集的一部分,并且 GHC默认GHC2021
使用语言扩展集。GHC2021
default-language
Cabal 通过组件字段确定它使用的语言扩展集。在您的示例中,您将其遗漏了(这是不好的做法),并且显然 CabalHaskell2010
在这种情况下仍然默认使用。因此,要解决此问题,您只需设置该default-language
字段即可: