[Haskell-cafe] type level function with different return kinds

Zoran Bošnjak zoran.bosnjak at via.si
Sat Apr 5 22:27:04 UTC 2025


Dear haskellers,
is it possible to write a type/kind level function that returns types of 
different kinds for different inputs. Either by using open/closed type 
families, a typeclass, extensions or any other type level magic. 
Something like this:

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}

import GHC.TypeLits

data A = A1 | A2
data B = B1 | B2

type family F (n :: Nat) where
     F 0 = 'A1
     F 1 = 'A2
     F 2 = 'B1
     F 3 = 'B2

The problem with this approach is that (F 0) and (F 1) are ok, but not 
in combination with (F 2). The error says:
     • Expected kind ‘A’, but ‘'B1’ has kind ‘B’

If I instead write:
type family F (n :: Nat) :: k where
... I get compile error already on the (F 0) line
     • Expected kind ‘k’, but ‘'A1’ has kind ‘A’

Any ideas how to remove the "same kind" restriction or how to workaround 
it?

I am using ghc 9.6.6.

regards,
Zoran


More information about the Haskell-Cafe mailing list