jcreed blog > Some More Thoughts About Types with Internal References
 
	 Some More Thoughts About Types with Internal References
	 Suppose we have a function $F : * \to * \to *$ that takes two type variables
	 and spits out a type. For the moment, let's pretend
	 to be physicists/combinatorialists
	 and assume that
	 $F$ is handed to us in the form of a power series
	 \[F(\pi, \rho) = \sum_{n,m} c_{n,m} \pi^n \rho^m \]
	 I'm going to give away a certain interpretation I intend for
	 such a power series: each
	 \[ c_{n,m} \pi^n \rho^m \]
	 is supposed to mean "there are $c_{n,m}$ ways of being a piece of data of type $F$ that has
	 $n$ many places for references to refer to, and $m$
	 many dangling references to some place elsewhere.
	 Let's call a thing like $F$ — by which I mean merely
	 a type operator with kind $* \to * \to *$ — a referential type.
	 I want to define a binary operation on referential types,
	 that takes $F$ and $G$ and outputs $F \lhd G$,
	 the referential type that is kind of like the product of $F$ and $G$,
	 except each of the dangling references in the $G$-data
	 are allowed (but not required)
	 to refer to places in the $F$-data.
	 
	 Here's an example:
	 
	 If we set $F(\pi, \rho) = \pi^2\rho^3$ and $G(\pi, \rho) = \pi^1\rho^2$,
	 then $(F \lhd G)(\pi, \rho) = \pi^4\rho^3(\rho + 3)^2$.
	 We have just as many places (3 + 1 = 4)
	 as the places from $F$ and $G$ combined, and we have at least 3 dangling
	 referenecs coming from $F$, and for each dangling reference of $G$ either
	 we leave it dangling ($\rho + \cdots$) or we pick one of $F$'s places
	 for it to connect to ($\cdots + 3$) and we must make this choice
	 for both of the dangling references of $G$ ($(\cdots)^2$).
	 
	 In general, we say that if
	 \[F(\pi, \rho) = \sum_{n,m} c_{n,m} \pi^n \rho^m \]
	 \[G(\pi, \rho) = \sum_{n',m'} d_{n',m'} \pi^{n'} \rho^{m'} \]
	 then
	 \[(F \lhd G)(\pi, \rho) = \sum_{n,n',m,m'} c_{n,m} d_{n',m'} \pi^{n + n'} \rho^{m}(\rho + n)^{m'} \]
	 We could also define an operation that symmetrically allowed
	 dangling references in $F$ to refer to places in $G$; this would
	 be something like
	 \[(F \bowtie G)(\pi, \rho) = \sum_{n,n',m,m'} c_{n,m} d_{n',m'} \pi^{n + n'} (\rho + n')^{m}(\rho + n)^{m'} \]
	 But I'm not going to consider this for now.
	 Expressing Binary DAGs
	 Ther reason is that the asymmetric right-to-left reference definition
	 is I think what I need to express the referential type of
	 binary trees whose leaves are of type $\alpha$ with sharing of subnodes.
	 I just postulate that I have a type-recursion operator $\mu$
	 at kind $* \to * \to *$, and I can say
	 \[ \mathrm{rDAG}_\alpha : * \to * \to * = \mu (\beta : * \to * \to *) . (\Lambda \pi.\Lambda \rho .  \rho + \pi * (\alpha + (\beta \lhd \beta))) \]
	 If I wish to extract the ordinary type of DAGs with leaves $\alpha$,
	 I just need to define
	 \[ \mathrm{DAG}_\alpha = \mathrm{rDAG}_\alpha(1, 0) \]
	 Here's a way of thinking about this definition: a DAG is either a
	 reference to some other node earlier in the tree ($\rho + \cdots$) or
	 else it is a node being described for the first time, which makes
	 it a referrable place $(\pi * \cdots)$ and that node can either be
	 a leaf $(\alpha + \cdots)$ or it can be a binary node; and references
	 used in the right child can point back at places found in the left child
	 $(\cdots + \beta \lhd \beta)$.
	 
	 The raw type of DAGs plugs in $1$ for $\pi$ to express that at the
	 end of the day, there is no data stored at each referrable place,
	 and plugs in $0$ for $\rho$ to express that all references must ultimately
	 be resolved to somewhere else in the DAG, and not be external anymore.
	 Thinking Analytically about $\lhd$
	 I'd like to have some kind of analytic/generatingfunction understanding
	 of what $\lhd$ is doing.
	 Simplified Version
	 Let's warm up with the less-than-fully
	 general problem of taking
	 \[F(\pi) = \sum_{n} c_n \pi^n\]
	 \[G(\rho) = \sum_{m} d_m \rho^m \]
	 and trying to build the type
	 \[H(\pi) = \sum_{n,m} c_n d_m n^m \pi^n \]
	 $H$ expresses all the ways we can resolve all the references in
	 $G$ to some place in $F$; we have to make $m$ choices among $n$
	 places. It also records the fact that we still have the $n$ places remaining
	 from $F$.
	 
	 I think to myself, hm, I could get some $n$s downstairs if I applied
	 the differential operator $\pi {\partial\over \partial\pi}$ to $F$ some number of times.
	 \[(\pi {\partial\over \partial\pi})^i F(\pi) = \sum_{n} c_n n^i \pi^n\]
	 but the number of times I need to apply this is dependent on $m$!
	 So maybe let me form the differential operator
	 \[
	 {1\over 1 - \pi D_\pi} = 1 + \pi{\partial \over \partial \pi}
+ \left(\pi{\partial \over \partial \pi}\right)^2
+ \left(\pi{\partial \over \partial \pi}\right)^3 + \cdots
	 \]
	 and observe that
	 \[{1\over 1 - \pi D_\pi}  F(\pi) = \sum_{n,i} c_n n^i \pi^n \]
	 and
  	 \[{1\over 1 - \pi D_\pi}  F(\pi) G(\rho) = \sum_{n,m,i} c_n n^i \pi^n \rho^m\]
	 at this point I can try pulling auxiliary-variable tricks, by introducing $h$, and
	 saying
  	 \[{1\over 1 - h\pi D_\pi}  F(\pi) G(1/h) = \sum_{n,m,i} c_n n^i \pi^n \rho^m h^{i-m}\]
	 and pulling out the $h^0$ coefficient of the resulting powerseries gives
  	 \[\left({1\over 1 - h\pi D_\pi}  F(\pi) G(1/h)\right)\bigg|_{h^0} =
	 \sum_{n,m} c_n n^m \pi^n  = H\]
	 Less Simplified Version
 This $n^m$ at least gives us a way of building the final term of
	 the binomial expansion of  $(\rho + n)^{m}$. How about the second-to-last
	 term? That would be
	 \[(\rho + n)^{m} = \rho^{m} + m \rho^{m-1} n + \cdots +
	 \left( m \atop k\right) \rho^{m-k} n^k + \cdots +
	 \textcolor{blue}{m \rho n^{m-1}} + n^{m}\]
	 To pull that $m$ out, we'll want to differentiate $G$ with respect to $\rho$. And
	 we'll want to adjust what we do with $h$ to get the $m-1$ in the exponent of $n$.
	 
	 Actually, let's change the variable name on the outside to make things slightly
	 clearer: we say that our current goal is to express
	 \[H(\pi, \nu) = \sum_{n,m} c_n d_m (m \nu n^{m-1}) \pi^n\]
	 in terms of
	 \[F(\pi) = \sum_{n} c_n \pi^n\]
	 \[G(\rho) = \sum_{m} d_m \rho^m \]
	 We do this by observing
  	 \[\left({1\over 1 - h\pi D_\pi}  F\right) \left(\nu  D_\rho G (1/h)\right) \]
	 \[=
	 \left( \sum_i  h^i(\pi D_\pi)^i  \sum_{n} c_n \pi^n \right) \left(\nu
	 D_\rho \sum_{m} d_m \rho^m \right)\bigg|_{\rho = 1/h}
	 \]
	 \[=
	 \left( \sum_{n,i}  h^i  c_n n^i \pi^n \right) \left(\nu \sum_{m} d_m m h^{1-m} \right)
	 \]
	 \[=  \sum_{n,i,m}  c_n d_m n^i \pi^n \nu  m h^{i + 1-m} 	\]
	 So we just need to take the $0$-coefficient of $h$ to see that
  	 \[\left({1\over 1 - h\pi D_\pi}  F\right) \left(\nu  D_\rho G(1/h)\right)
	 \bigg|_{h^0} = H(\pi, \nu)\]
	 More Coefficients
	 How about the third-to-last term of the binomial expansion?
	 \[(\nu + n)^{m} = \nu^{m} + m \nu^{m-1} n + \cdots +
	 \left( m \atop k\right) \nu^{m-k} n^k + \cdots +
	 \textcolor{blue}{m(m-1) \nu^2 n^{m-2} / 2} + m \nu n^{m-1} + n^{m}\]
	 Here I seem to be a bit stuck, because I don't know how to
	 accomplish that division by 2 type theoretically. I'm going to forge ahead anyway.
  	 \[\left({1\over 1 - h\pi D_\pi}  F\right) \left((\nu^2 / 2)  D^2_\rho G(1/h)\right)
	 \bigg|_{h^0} \]
  	 \[= \left(  \sum_{n,i} c_n n^i h^i \pi^n\right) (\nu^2 m (m-1) / 2)  \sum_{m} d_m h^{2-m}
	 \bigg|_{h^0} \]
  	 \[=  \sum_{n,m,i} c_n n^i \pi^n (\nu^2 m (m-1) / 2) d_m h^{i + 2-m}	 \bigg|_{h^0} \]
  	 \[=  \sum_{n,m} c_n d_m   \pi^n (m (m-1) \nu^2 n^{m-2} / 2)  \]
	 All the Binomial Coefficients
	 Ok, so I guess the pattern is somehow that I want the differential operator
	 \[e^{\nu D_\rho} = 1 + \nu D_\rho + {\nu^2 D^2_\rho\over 2} + {\nu^3 D^3_\rho\over 3!} + \cdots \]
	 in the sense that
  	 \[\left({1\over 1 - h\pi D_\pi}  F\right) e^{\nu D_\rho} G(1/h)\bigg|_{h^0} \]
  	 \[=\sum_{n,i} c_n n^i h^i \pi^n \left(\sum_j{\nu^j D_\rho^j\over j!} \sum_m d_m \rho^m \right)_{\rho = 1/h}\bigg|_{h^0} \]
  	 \[=\sum_{n,i} c_n n^i h^i \pi^n \left(\sum_j{\nu^j m! \over (m-j)!j!} \sum_m d_m \rho^{m-j} \right)_{\rho = 1/h}\bigg|_{h^0} \]
  	 \[=\sum_{n,i} c_n n^i h^i \pi^n \left(\sum_j \nu^j \left( m \atop j\right)  \sum_m d_m \rho^{m-j} \right)_{\rho = 1/h}\bigg|_{h^0} \]
  	 \[=\sum_{n,m,i,j} c_nd_m n^i \pi^n  \nu^j \left( m \atop j\right)    h^{i + j-m} \bigg|_{h^0} \]
  	 \[=\sum_{n,m,j} c_nd_m n^{m-j} \pi^n  \nu^j \left( m \atop j\right)     \]
  	 \[=\sum_{n,m} c_nd_m  \pi^n  (\nu + n)^m     \]
	 
	 Oh,
	 but the
	 internet tells me that this operator accomplishes nothing more
	 than shifting the function it's applied to by $\nu$. So I should be able to calculate just as easily that
	 \[\left({1\over 1 - h\pi D_\pi}  F\right)  G(\nu + 1/h)\bigg|_{h^0} \]
  	 \[=\sum_{n,i} c_n n^i h^i \pi^n  \sum_m d_m (\nu + 1/h)^m  \bigg|_{h^0} \]
  	 \[=\sum_{n,m,i,j} c_nd_m n^i \pi^n  \nu^j \left( m \atop j\right)    h^{i + j-m} \bigg|_{h^0} \]
  	 \[=\sum_{n,m,j} c_nd_m n^{m-j} \pi^n  \nu^j \left( m \atop j\right)     \]
  	 \[=\sum_{n,m} c_nd_m  \pi^n  (\nu + n)^m     \]
	 Nice!
	 Defining $\lhd$ analytically
	 Now that I don't have to differentiate with respect to $\rho$, I can abandon inventing a separate variable $\nu$ to keep track
	 of what's going on.
	 So let's say we have the general case of
	 \[F(\pi, \rho) = \sum_{n,m} c_{n,m} \pi^n \rho^m \]
	 \[G(\pi, \rho) = \sum_{n',m'} d_{n',m'} \pi^{n'} \rho^{m'} \]
	 then we claim
	 \[(F \lhd G)(\pi, \rho) = \sum_{n,n',m,m'} c_{n,m} d_{n',m'} \pi^{n + n'} \rho^{m}(\rho + n)^{m'} \]
	 can be given by
	 \[(F \lhd G)(\pi, \rho) =
	 \left({1\over 1 - h\pi D_\pi}  F (\pi, \rho)\right) \left(  G(\pi, \rho + h^{-1})\right)\bigg|_{h^0} \]
	 for we can compute
\[	 \left({1\over 1 - h\pi D_\pi}  F (\pi, \rho)\right) \left(  G(\pi, \rho + h^{-1})\right)\bigg|_{h^0} \]
\[=	 \left( \sum_{n,m,i} c_{n,m} \pi^n \rho^m h^i n^i \right) \left(  \sum_{n',m'} d_{n',m'} \pi^{n'} (\rho + h^{-1})^{m'}\right)\bigg|_{h^0} \]
\[	=  \sum_{n,m,i,n',m',j} c_{n,m}\pi^n \rho^m h^i n^i   d_{n',m'} \pi^{n'} \left( m' \atop j \right) \rho^j  h^{j-m'}\bigg|_{h^0} \]
\[	=  \sum_{n,m,n',m',j} c_{n,m}\pi^n \rho^m  n^{m'-j}   d_{n',m'} \pi^{n'} \left( m' \atop j \right) \rho^j   \]
\[	=  \sum_{n,m,n',m',j} c_{n,m}\pi^n \rho^m    d_{n',m'} \pi^{n'} (\rho + n)^{m'}   \]
as required.