[Haskell-cafe] Polykinded promoted types

Gautier DI FOLCO gautier.difolco at gmail.com
Tue Dec 9 23:09:40 UTC 2014

2014-12-09 2:35 GMT+01:00 Richard Eisenberg <eir at cis.upenn.edu>:

> While it's true that Maybe's kind is (* -> *), there still may be a better
> answer to your question, which asks, "Is there a way to get a polykinded
> promoted type?" Maybe isn't polykinded, but it's also not promoted. With
> data Proxy a = P
> we get (Proxy :: k -> *). But that's not promoted either. On the other
> hand we have ('Just :: k -> Maybe k), which is promoted and polykinded, but
> maybe not what you want.
> Does this help?


In fact my problem occurs when I try to describe (Iso)morphisms:
type Cons1 (e :: k1) (n :: k2) = Product e n
type Nil1 = Void

type Cons2 e n = Just (Product e n)
type Nil2 = Nothing

data List3 a = Nil3 | Cons3 a (List3 a)

type family List1_List2 a where
  List1_List2 (Cons1 a b) = Cons2 a (List1_List2 b)
  List1_List2 Nil1 = Nil2

type family List2_List1 a where
  List2_List1 (Cons2 a b) = Cons1 a (List2_List1 b)
  List2_List1 Nil2 = Nil1

type family List2_List3 a where
  List2_List3 (Cons2 a b) = Cons3 a (List2_List3 b)
  List2_List3 Nil2 = Nil3

type family List3_List2 a where
  List3_List2 (Cons3 a b) = Cons2 a (List3_List2 b)
  List3_List2 Nil3 = Nil2

type List1_List3 a = List2_List3 (List1_List2 a)
type List3_List1 a = List2_List1 (List3_List2 a)

There is an Isomorphism between List1 and List2 (List1_List2 (List2_List1
a) == a and List2_List1 (List1_List2 a) == a) but not between List3 and the
others due to it's * kind.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20141210/5a2d4f5c/attachment.html>

More information about the Haskell-Cafe mailing list