You need to sign in or sign up before continuing.
DerivingVia and GND should not need UnboxedTuples
Summary
If class methods involve UnboxedTuples, then UnboxedTuples is required to be enabled in a module to derive that class using DerivingVia or GeneralizedNewtypeDeriving.
Steps to reproduce
-- UT.hs
{-# language UnboxedTuples #-}
module UT where
class Tupleable a where
tup :: a -> (# a #)
newtype Boring a = Boring a
instance Tupleable (Boring a) where
tup a = (# a #)
instance Tupleable () where
tup _ = (# () #)
-- DV.hs
{-# language DerivingVia, GeneralizedNewtypeDeriving #-}
module DV where
import UT
data Foo = Foo
deriving Tupleable via Boring Foo
newtype Bar a = Bar ()
deriving newtype Tupleable
GHC says:
[2 of 2] Compiling DV ( DV.hs, DV.o )
DV.hs:6:12: error:
• Illegal unboxed tuple type as function argument: (# Foo #)
Perhaps you intended to use UnboxedTuples
• In the type signature: tup :: Foo -> (# Foo #)
When typechecking the code for ‘tup’
in a derived instance for ‘Tupleable Foo’:
To see the code I am typechecking, use -ddump-deriv
In the instance declaration for ‘Tupleable Foo’
|
6 | deriving Tupleable via Boring Foo
| ^^^^^^^^^
DV.hs:9:20: error:
• Illegal unboxed tuple type as function argument: (# Bar a #)
Perhaps you intended to use UnboxedTuples
• In the type signature: tup :: Bar a -> (# Bar a #)
When typechecking the code for ‘tup’
in a derived instance for ‘Tupleable (Bar a)’:
To see the code I am typechecking, use -ddump-deriv
In the instance declaration for ‘Tupleable (Bar a)’
|
9 | deriving newtype Tupleable
|
Expected behavior
I expect it to compile. Note: if UnboxedSums are used instead of UnboxedTuples, then all seems to be well.
Environment
- GHC version used: 9.2
Optional:
- Operating System:
- System Architecture: