Skip to content

KnownNat and friends are derivable

Summary

Using polymorphic data families, DerivingVia, and StandaloneDeriving it is possible to create new instances of KnownNat, KnownSymbol, and KnownChar. This breaks the safety of sameNat, sameSybol, and sameChar, as well as eqTypeRep and testEquality.

Steps to reproduce

{-# language DataKinds #-}
{-# language DerivingVia #-}
{-# language TypeFamilies #-}

import GHC.TypeLits

data family Z :: k

deriving via 0 instance KnownNat Z

And essentially the same thing for KnownSymbol and KnownChar.

Expected behavior

It seems DerivingVia allows deriving via not representationally equal types as long as the types of the methods involved end up being representationally equal. This can be useful, but the KnownX type classes should not be derivable this way as it breaks the assumption that KnownX instances correspond 1-to-1 with types.

Environment

  • GHC version used: 9.2.1 and HEAD
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information