[Haskell-cafe] Using a non fully saturated type family
Ruben Astudillo
ruben.astud at gmail.com
Thu Sep 9 15:35:47 UTC 2021
Hello Cafe.
I am trying to encode a version of sigma types using GADTs for the tag and a
type family as the function between the GADT and the universe of types. My
code looks like this (notice the use of StandaloneKindSignatures).
--- | dependent.hs
{-# language RankNTypes, PolyKinds, TypeFamilies, GADTs #-}
{-# language StandaloneKindSignatures, DataKinds #-}
module Main where
import Data.Kind (Type)
import Data.Functor.Identity
main :: IO ()
main = return ()
type Tag :: Bool -> Type
data Tag b where
STrue :: Tag True
SFalse :: Tag False
type ApplyTag :: Bool -> Type
type family ApplyTag t where
ApplyTag 'True = Int
ApplyTag 'False = Char
type Sigma :: forall k. (k -> Type) -> (k -> Type) -> Type
data Sigma t f where
(:&:) :: forall t f a. t a -> f a -> Sigma t f
ex :: Sigma Tag ApplyTag
ex = STrue :&: 27
The error I get is
dependent.hs:24:7: error:
• The type family ‘ApplyTag’ should have 1 argument, but has been
given none
• In the type signature: ex :: Sigma Tag ApplyTag
|
24 | ex :: Sigma Tag ApplyTag
| ^^^^^^^^^^^^^^^^^^
which is true! How can I recover the intuition of type families being
functions at the type level?
--
Rubén. (pgp: 4EE9 28F7 932E F4AD)
More information about the Haskell-Cafe
mailing list