Pela documentação, estou inclinado a pensar que, se eu habilitar a DerivingStrategies
extensão, não preciso habilitar GeneralizedNewtypeDeriving
or DeriveAnyClass
, nem qualquer outra extensão listada atualmente antes de §6.6.7.1 , por exemplo DerivingVia
.
No entanto, este exemplo de brinquedo
{-# LANGUAGE DerivingStrategies #-}
newtype MyNum = MyNum Int
deriving stock (Eq, Ord, Show, Read)
deriving newtype (Num, Enum, Real, Integral)
main :: IO ()
main = print $ MyNum 0
compila muito bem via ghc this-file.hs
(GHC 9.4.8), mas não via cabal build
(Cabal 3.10.2.1), porque neste último caso, também é necessário que eu adicione
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
Alguma pista do porquê disso?
O foo.cabal
arquivo fictício que estou usando é
cabal-version: 3.8
name: foo
version: 1.0
executable foo
main-is: main.hs
build-depends: base
Você precisa habilitar as extensões individuais.
DerivingStrategies
fornece apenas uma nova sintaxe para especificar qual estratégia de derivação você deseja.A razão pela qual o GHC não exige que você ative
GeneralizedNewtypeDeriving
é porque ele faz parte doGHC2021
conjunto de extensões de idioma e o GHC usa o conjunto de extensões de idiomaGHC2021
por padrão.Cabal determina o conjunto de extensões de linguagem que usa por meio do
default-language
campo de seus componentes. No seu exemplo você o deixou de fora (o que é uma má prática) e aparentemente o Cabal ainda usaHaskell2010
por padrão nesse caso. Então, para corrigir isso, você pode simplesmente definir odefault-language
campo: