title: Can we obtain the identity, constant, and fixpoint datatype constructors for arbitrary type-producing kinds?
body: <p>Here are some type constructors:</p>
  <pre><code>type T0 = Type
  
  type I0 :: T0 -&gt; T0
  data I0 x = I0 { getI0 :: x }
  
  type K0 :: T0 -&gt; (T0 -&gt; T0)
  data K0 x y = K0 { getK0 :: x }
  
  type Mu0 :: (T0 -&gt; T0) -&gt; T0
  data Mu0 f = Mu0 { unMu0 :: f (Mu0 f) }
  </code></pre>
  <p>Here are some more type constructors:</p>
  <pre><code>type T1 = Type -&gt; Type
  
  type I1 :: T1 -&gt; T1
  data I1 f x = I1 { getI1 :: f x }
  
  type K1 :: T1 -&gt; (T1 -&gt; T1)
  data K1 f g x = K1 { getK1 :: f x }
  
  type Mu1 :: (T1 -&gt; T1) -&gt; T1
  data Mu1 ff x = Mu1 { unMu1 :: ff (Mu1 ff) x }
  </code></pre>
  <p>We can organize these type constructors into a data family:</p>
  <pre><code>class Context (k :: Type)
    where
    data I :: k -&gt; k
    data K :: k -&gt; (k -&gt; k)
    data Mu :: (k -&gt; k) -&gt; k
  
  instance Context Type
    where
    data I x = I0 { getI0 :: x }
    data K x y = K0 { getK0 :: x }
    data Mu f = Mu0 { getMu0 :: f (Mu0 f) }
  
  instance Context (Type -&gt; Type)
    where
    data I f x = I1 { getI1 :: f x }
    data K f g x = K1 { getK1 :: f x }
    data Mu ff x = Mu1 { unMu1 :: ff (Mu1 ff) x }
  
  instance Context (Type -&gt; Type -&gt; Type)
    ...
  
  instance Context ((Type -&gt; Type) -&gt; Type)
    ...
  </code></pre>
  <p>These definitions are an example of ad-hoc polymorphism, in that I must laboriously instantiate the class on a case by case basis for each <code>Type</code>-producing kind I can think of. Is it possible to define these datatype constructors in a <em>parametrically</em> polymorphic way, so that we have datatype constructors of kind:</p>
  <pre><code>type I :: forall k. k -&gt; k
  type K :: forall k. k -&gt; (k -&gt; k)
  type Mu :: forall k. (k -&gt; k) -&gt; k
  </code></pre>
  <p>which I can instantiate at any <code>Type</code> producing kind without further ceremony (e.g. instantiating a class for said kind)?</p>