Hello all,
I'm trying to port typeclasses to kind-level, here are my data types:
-- newtype Fix f a = Fix (f (Fix f a))
-- data Mu f = In (f (Mu f))
data Fix (f :: k1 -> k0) (n :: k1) = Fx
data Maybe a = Nothing | Just a
If I try to create type families to represent Functors, I end up with this:
-- type family MapFix (f :: (* -> k) -> * -> k) a :: * where
-- type family MapFix f a where
type family MapFix (f :: (k0 -> k1) -> k0 -> k1) (a :: k2) :: * where
MapFix f (Fix a n) = Fix (f a) (MapFix f n)
-- type family MapMaybe (f :: k -> k) (a :: Maybe k) :: Maybe k where
-- type family MapMaybe f a where
type family MapMaybe (f :: k0 -> k1) (a :: Maybe k0) :: Maybe k1 where
MapMaybe f ('Just a) = 'Just (f a)
MapMaybe f 'Nothing = 'Nothing
But I can't defined a single open type family for these two data types.
I think I lack of parametric kinds, for example: `
k p` could let me fit `
Maybe k`. Currently, in the way I see kinds, on `
k0 -> k1` allow me to parameterize kinds, but `
Maybe k` doesn't fit.
I know that this is certainly unclear, don't hesitate to ask me for clarifications.
I also know that my `
Fix` sucks, any good idea on how to do it is welcome :)
Also, if you have any links to have a deeper insight of Kinds it will save me from mental illness.
Thanks in advance for your help,
Regards.