(第一次玩这些东西。)
从文档我倾向于认为,如果我启用
DerivingStrategies
扩展,我不需要启用GeneralizedNewtypeDeriving
或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 this-file.hs
(GHC 9.4.8)编译得很好,但不能通过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
GeneralizedNewtypeDeriving
是 GHC2021
语言扩展集的一部分。 GHC 默认使用语言扩展集 GHC2021
。 Cabal 通过组件的 default-language
字段确定它使用的语言扩展集。在你的例子中,你把它遗漏了(这是不好的做法),显然在这种情况下,Cabal 仍然默认使用 Haskell2010
。因此,要解决此问题,您只需设置 default-language
字段即可:
cabal-version: 3.8
name: foo
version: 1.0
executable foo
main-is: main.hs
build-depends: base
default-language: GHC2021