For example, consider this simple type family:
type family FromMaybe (a :: k) (m :: Maybe k) :: k
type instance FromMaybe a 'Nothing = a
type instance FromMaybe a ('Just b) = b
With first-class-families, it translates to a data
declaration
and instances for a single Eval
family:
import Fcf
data FromMaybe :: k -> Maybe k -> Exp k
type instance Eval (FromMaybe a 'Nothing) = a
type instance Eval (FromMaybe a ('Just b)) = b
That way, the FromMaybe
constructor can be passed to higher-order fcfs.
Eval (Map (FromMaybe 0) '[ 'Just 1, 'Nothing ]) = '[ 1, 0 ] :: [Nat]
Essential language extensions:
{-# LANGUAGE
DataKinds,
PolyKinds,
TypeFamilies,
TypeInType,
TypeOperators,
UndecidableInstances #-}
Haskell with only one type family (blogpost)
Contributions are welcome. Feel free to open an issue or make a PR on Github!