From 457429e3b8034c2b99511aaf64bc194c1517e053 Mon Sep 17 00:00:00 2001 From: Sergei Winitzki Date: Tue, 1 Oct 2019 18:51:03 -0700 Subject: [PATCH] fix problems with arrows --- sofp-src/sofp-appendices.lyx | 414 +++---- sofp-src/sofp-appendices.tex | 325 +++--- sofp-src/sofp-applicative.lyx | 261 +++-- sofp-src/sofp-applicative.tex | 230 ++-- sofp-src/sofp-coinductive.lyx | 3 - sofp-src/sofp-curry-howard.lyx | 950 ++++++++-------- sofp-src/sofp-curry-howard.tex | 917 ++++++++-------- sofp-src/sofp-disjunctions.lyx | 8 +- sofp-src/sofp-disjunctions.tex | 4 +- sofp-src/sofp-draft.pdf | Bin 3542670 -> 3545048 bytes sofp-src/sofp-essays.lyx | 5 +- sofp-src/sofp-essays.tex | 2 +- sofp-src/sofp-filterable.lyx | 232 ++-- sofp-src/sofp-filterable.tex | 218 ++-- sofp-src/sofp-free-type.lyx | 391 ++++--- sofp-src/sofp-free-type.tex | 360 +++---- sofp-src/sofp-functors.lyx | 510 +++++---- sofp-src/sofp-functors.tex | 496 ++++----- sofp-src/sofp-higher-order-functions.lyx | 451 ++++---- sofp-src/sofp-higher-order-functions.tex | 412 +++---- sofp-src/sofp-induction.lyx | 4 +- sofp-src/sofp-irregular.lyx | 3 - sofp-src/sofp-monads.lyx | 274 +++-- sofp-src/sofp-monads.tex | 242 ++--- sofp-src/sofp-nameless-functions.lyx | 13 +- sofp-src/sofp-nameless-functions.tex | 10 +- sofp-src/sofp-preface.lyx | 10 +- sofp-src/sofp-preface.tex | 4 +- sofp-src/sofp-recursive.lyx | 3 - sofp-src/sofp-summary.lyx | 3 - sofp-src/sofp-transformers.lyx | 1251 +++++++++++----------- sofp-src/sofp-transformers.tex | 1220 ++++++++++----------- sofp-src/sofp-traversable.lyx | 107 +- sofp-src/sofp-traversable.tex | 98 +- sofp-src/sofp-typeclasses.lyx | 906 ++++++++-------- sofp-src/sofp-typeclasses.tex | 848 +++++++-------- sofp-src/sofp.lyx | 3 - sofp-src/sofp.pdf | Bin 5457618 -> 5459962 bytes sofp-src/sofp.tex | 3 - 39 files changed, 5585 insertions(+), 5606 deletions(-) diff --git a/sofp-src/sofp-appendices.lyx b/sofp-src/sofp-appendices.lyx index c125d26f1..07e57b915 100644 --- a/sofp-src/sofp-appendices.lyx +++ b/sofp-src/sofp-appendices.lyx @@ -109,16 +109,12 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} \def\mathunderline#1#2{\color{#1}\underline{{\color{black}#2}}\color{black}} % The LyX document will define a macro \gunderline{#1} that will use \mathunderline with the color `greenunder`. %\def\gunderline#1{\mathunderline{greenunder}{#1}} % This is now defined by LyX itself with GUI support. - \end_preamble \options open=any,numbers=noenddot,index=totoc,bibliography=totoc,listof=totoc,fontsize=10pt \use_default_options true @@ -453,7 +449,7 @@ status open \end_layout \begin_layout Description -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset the function type, mapping from @@ -468,7 +464,7 @@ status open \end_layout \begin_layout Description -\begin_inset Formula $x^{:A}\Rightarrow f$ +\begin_inset Formula $x^{:A}\rightarrow f$ \end_inset a nameless function (as a value). @@ -849,7 +845,7 @@ status open \end_inset is -\begin_inset Formula $x\Rightarrow g(f(x))$ +\begin_inset Formula $x\rightarrow g(f(x))$ \end_inset . @@ -877,7 +873,7 @@ f andThen g \end_inset is -\begin_inset Formula $x\Rightarrow f(g(x))$ +\begin_inset Formula $x\rightarrow f(g(x))$ \end_inset . @@ -1041,7 +1037,7 @@ diagonal \end_inset function of type -\begin_inset Formula $\forall A.\,A\Rightarrow A\times A$ +\begin_inset Formula $\forall A.\,A\rightarrow A\times A$ \end_inset @@ -1087,8 +1083,8 @@ Seq(a, b, c) \begin_layout Description \begin_inset Formula $\begin{array}{||cc|} -x\Rightarrow x & \bbnum 0\\ -\bbnum 0 & a\Rightarrow a\times a +x\rightarrow x & \bbnum 0\\ +\bbnum 0 & a\rightarrow a\times a \end{array}$ \end_inset @@ -1542,7 +1538,7 @@ status open \end_layout \begin_layout Standard -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset means a function type from @@ -1570,7 +1566,7 @@ A => B \end_layout \begin_layout Standard -\begin_inset Formula $x^{:A}\Rightarrow y$ +\begin_inset Formula $x^{:A}\rightarrow y$ \end_inset means a nameless function with argument @@ -1625,7 +1621,7 @@ status open \end_inset or -\begin_inset Formula $\text{id}^{:A\Rightarrow A}$ +\begin_inset Formula $\text{id}^{:A\rightarrow A}$ \end_inset , or else should be unambiguous from the context. @@ -1665,7 +1661,7 @@ equal by definition \end_layout \begin_layout Itemize -\begin_inset Formula $f\triangleq(x^{:\text{Int}}\Rightarrow x+10)$ +\begin_inset Formula $f\triangleq(x^{:\text{Int}}\rightarrow x+10)$ \end_inset is a definition of a function @@ -1810,6 +1806,44 @@ unfunctor . \end_layout +\begin_layout Standard +\begin_inset Formula $\wedge$ +\end_inset + + (conjunction), +\begin_inset Formula $\vee$ +\end_inset + + (disjunction), and +\begin_inset Formula $\Rightarrow$ +\end_inset + + (implication) are used in formulas of Boolean as well as constructive logic + in Chapter +\begin_inset space ~ +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "chap:3-3-The-formal-logic-curry-howard" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +, e.g. +\begin_inset space ~ +\end_inset + + +\begin_inset Formula $\alpha\wedge\beta$ +\end_inset + +, where Greek letters stand for logical propositions. +\end_layout + \begin_layout Standard \begin_inset Formula $\text{fmap}_{F}$ \end_inset @@ -1895,7 +1929,7 @@ two \end_inset is written in full as -\begin_inset Formula $\text{fmap}_{F}^{A,B}:\left(A\Rightarrow B\right)\Rightarrow F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $\text{fmap}_{F}^{A,B}:\left(A\rightarrow B\right)\rightarrow F^{A}\rightarrow F^{B}$ \end_inset . @@ -1940,7 +1974,7 @@ pure . This function has type signature -\begin_inset Formula $A\Rightarrow F^{A}$ +\begin_inset Formula $A\rightarrow F^{A}$ \end_inset that contains a type parameter @@ -1983,7 +2017,7 @@ pure The type signature of that function is then \begin_inset Formula \[ -\text{pu}_{F}^{1+P^{A}}:\bbnum 1+P^{A}\Rightarrow F^{\bbnum 1+P^{A}}\quad. +\text{pu}_{F}^{1+P^{A}}:\bbnum 1+P^{A}\rightarrow F^{\bbnum 1+P^{A}}\quad. \] \end_inset @@ -2014,7 +2048,7 @@ flatMap with the type signature \begin_inset Formula \[ -\text{flm}_{F}:\left(A\Rightarrow F^{B}\right)\Rightarrow F^{A}\Rightarrow F^{B}\quad. +\text{flm}_{F}:\left(A\rightarrow F^{B}\right)\rightarrow F^{A}\rightarrow F^{B}\quad. \] \end_inset @@ -2062,7 +2096,7 @@ flatten with the type signature \begin_inset Formula \[ -\text{ftn}_{F}:F^{F^{A}}\Rightarrow F^{A}\quad. +\text{ftn}_{F}:F^{F^{A}}\rightarrow F^{A}\quad. \] \end_inset @@ -2313,7 +2347,7 @@ forward composition \end_inset ) is the function defined as -\begin_inset Formula $x\Rightarrow g(f(x))$ +\begin_inset Formula $x\rightarrow g(f(x))$ \end_inset . @@ -2354,7 +2388,7 @@ backward composition \end_inset ) is the function defined as -\begin_inset Formula $x\Rightarrow f(g(x))$ +\begin_inset Formula $x\rightarrow f(g(x))$ \end_inset . @@ -2555,8 +2589,8 @@ x\triangleright f\bef g=x\triangleright\left(f\bef g\right),\quad\quad & x\trian Some examples of reasoning in the pipe notation: \begin_inset Formula \begin{align*} - & \left(a\Rightarrow a\triangleright f\right)=\left(a\Rightarrow f(a)\right)=f\quad,\\ - & f\triangleright\left(y\Rightarrow a\triangleright y\right)=a\triangleright f=f(a)\quad,\\ + & \left(a\rightarrow a\triangleright f\right)=\left(a\rightarrow f(a)\right)=f\quad,\\ + & f\triangleright\left(y\rightarrow a\triangleright y\right)=a\triangleright f=f(a)\quad,\\ & f(y(x))=x\triangleright y\triangleright f\neq x\triangleright\left(y\triangleright f\right)=f(y)(x)\quad. \end{align*} @@ -2588,7 +2622,7 @@ The correspondence between the forward composition and the backward composition: . For a function -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset , the application of @@ -2638,7 +2672,7 @@ lifting to the functor composition \end_inset and produces a function of type -\begin_inset Formula $H^{G^{A}}\Rightarrow H^{G^{B}}$ +\begin_inset Formula $H^{G^{A}}\rightarrow H^{G^{B}}$ \end_inset . @@ -2713,7 +2747,7 @@ x.map(p).map(q) . For a function -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset , the application of @@ -2767,15 +2801,15 @@ h.contramap(f) . This is a binary operation working on two Kleisli functions of types -\begin_inset Formula $A\Rightarrow M^{B}$ +\begin_inset Formula $A\rightarrow M^{B}$ \end_inset and -\begin_inset Formula $B\Rightarrow M^{C}$ +\begin_inset Formula $B\rightarrow M^{C}$ \end_inset and yields a new function of type -\begin_inset Formula $A\Rightarrow M^{C}$ +\begin_inset Formula $A\rightarrow M^{C}$ \end_inset . @@ -2820,7 +2854,7 @@ diagonal \end_inset function of type -\begin_inset Formula $\forall A.\,A\Rightarrow A\times A$ +\begin_inset Formula $\forall A.\,A\rightarrow A\times A$ \end_inset . @@ -2998,20 +3032,16 @@ Array(a, b, c) \end_layout \begin_layout Standard -\begin_inset Formula $f^{:Z+A\Rightarrow Z+A\times A}\triangleq\begin{array}{||cc|} -z\Rightarrow z & \bbnum 0\\ -\bbnum 0 & a\Rightarrow a\times a +\begin_inset Formula $f^{:Z+A\rightarrow Z+A\times A}\triangleq\begin{array}{||cc|} +z\rightarrow z & \bbnum 0\\ +\bbnum 0 & a\rightarrow a\times a \end{array}\,$ \end_inset is the -\begin_inset Quotes eld -\end_inset - +\series bold matrix notation -\begin_inset Quotes erd -\end_inset - +\series default \begin_inset Index idx status open @@ -3075,15 +3105,7 @@ s in the function's code, corresponding to the different parts of the input \end_layout \begin_layout Standard -A -\begin_inset Quotes eld -\end_inset - -type-annotated matrix -\begin_inset Quotes erd -\end_inset - - writes out all parts of the disjunctive types in a separate +A matrix may show all parts of the disjunctive types in separate \begin_inset Quotes eld \end_inset @@ -3102,17 +3124,17 @@ type column : \begin_inset Formula \begin{equation} -f\triangleq\begin{array}{|c||cc|} +f^{:Z+A\Rightarrow Z+A\times A}\triangleq\begin{array}{|c||cc|} & Z & A\times A\\ \hline Z & \text{id} & \bbnum 0\\ -A & \bbnum 0 & a\Rightarrow a\times a +A & \bbnum 0 & a\rightarrow a\times a \end{array}\quad. \end{equation} \end_inset This notation clearly indicates the input and the output types of the function - and is useful at the initial stages of reasoning about the code. + and is useful at some stages of reasoning about the code. The vertical double line separates input types from the function code. In the code above, the \begin_inset Quotes eld @@ -3122,7 +3144,7 @@ type column \begin_inset Quotes erd \end_inset - shows the parts of the input disjunction type + shows the parts of the input disjunctive type \begin_inset Formula $Z+A$ \end_inset @@ -3135,7 +3157,7 @@ type row \begin_inset Quotes erd \end_inset - shows the parts of the output disjunction type + shows the parts of the output disjunctive type \begin_inset Formula $Z+A\times A$ \end_inset @@ -3200,11 +3222,11 @@ In the matrix notation, the function \[ g\triangleq\begin{array}{|c||c|} & A\\ -\hline Z & \_\Rightarrow e^{:A}\\ -A\times A & a_{1}\times a_{2}\Rightarrow a_{1}\oplus a_{2} +\hline Z & \_\rightarrow e^{:A}\\ +A\times A & a_{1}\times a_{2}\rightarrow a_{1}\oplus a_{2} \end{array}\quad,\quad\quad g\triangleq\begin{array}{||c|} -\_\Rightarrow e^{:A}\\ -a_{1}\times a_{2}\Rightarrow a_{1}\oplus a_{2} +\_\rightarrow e^{:A}\\ +a_{1}\times a_{2}\rightarrow a_{1}\oplus a_{2} \end{array}\quad. \] @@ -3224,17 +3246,17 @@ The forward composition \begin{align*} f\bef g & =\begin{array}{||cc|} \text{id} & \bbnum 0\\ -\bbnum 0 & a\Rightarrow a\times a +\bbnum 0 & a\rightarrow a\times a \end{array}\,\bef\,\begin{array}{||c|} -\_\Rightarrow e^{:A}\\ -a_{1}\times a_{2}\Rightarrow a_{1}\oplus a_{2} +\_\rightarrow e^{:A}\\ +a_{1}\times a_{2}\rightarrow a_{1}\oplus a_{2} \end{array}\\ & =\,\begin{array}{||c|} -\text{id}\bef(\_\Rightarrow e^{:A})\\ -\left(a\Rightarrow a\times a\right)\bef\left(a_{1}\times a_{2}\Rightarrow a_{1}\oplus a_{2}\right) +\text{id}\bef(\_\rightarrow e^{:A})\\ +\left(a\rightarrow a\times a\right)\bef\left(a_{1}\times a_{2}\rightarrow a_{1}\oplus a_{2}\right) \end{array}=\begin{array}{||c|} -\_\Rightarrow e^{:A}\\ -a\Rightarrow a\oplus a +\_\rightarrow e^{:A}\\ +a\rightarrow a\oplus a \end{array}\quad. \end{align*} @@ -3266,9 +3288,9 @@ and the computation \[ x\triangleright f\bef g=\begin{array}{||cc|} z^{:Z} & \bbnum 0\end{array}\,\triangleright\,\begin{array}{||c|} -\_\Rightarrow e^{:A}\\ -a\Rightarrow a\oplus a -\end{array}=z\triangleright(\_\Rightarrow e)=e\quad. +\_\rightarrow e^{:A}\\ +a\rightarrow a\oplus a +\end{array}=z\triangleright(\_\rightarrow e)=e\quad. \] \end_inset @@ -3286,7 +3308,11 @@ s of the \end_layout \begin_layout Standard -To use the matrix notation with backward compositions ( +To use the matrix notation with +\emph on +backward +\emph default + compositions ( \begin_inset Formula $f\circ g$ \end_inset @@ -3304,26 +3330,30 @@ To use the matrix notation with backward compositions ( \begin{align*} g\circ f & =\begin{array}{|c|cc|} & Z & A\times A\\ -\hline\hline A & \_\Rightarrow e^{:A} & a_{1}\times a_{2}\Rightarrow a_{1}\oplus a_{2} +\hline\hline A & \_\rightarrow e^{:A} & a_{1}\times a_{2}\rightarrow a_{1}\oplus a_{2} \end{array}\,\circ\,\begin{array}{|c|cc|} & Z & A\\ \hline\hline Z & \text{id} & \bbnum 0\\ -A\times A & \bbnum 0 & a\Rightarrow a\times a +A\times A & \bbnum 0 & a\rightarrow a\times a \end{array}\\ & =\,\begin{array}{|cc|} -\hline\hline \text{id}\bef(\_\Rightarrow e^{:A}) & \left(a\Rightarrow a\times a\right)\bef\left(a_{1}\times a_{2}\Rightarrow a_{1}\oplus a_{2}\right)\end{array}=\begin{array}{|cc|} -\hline\hline \_\Rightarrow e^{:A} & a\Rightarrow a\oplus a\end{array}\quad.\\ +\hline\hline \text{id}\bef(\_\rightarrow e^{:A}) & \left(a\rightarrow a\times a\right)\bef\left(a_{1}\times a_{2}\rightarrow a_{1}\oplus a_{2}\right)\end{array}=\begin{array}{|cc|} +\hline\hline \_\rightarrow e^{:A} & a\rightarrow a\oplus a\end{array}\quad.\\ (g\circ f)(x) & =\begin{array}{|cc|} -\hline\hline \_\Rightarrow e^{:A} & a\Rightarrow a\oplus a\end{array}\,\begin{array}{|c|} +\hline\hline \_\rightarrow e^{:A} & a\rightarrow a\oplus a\end{array}\,\begin{array}{|c|} \hline\hline z^{:Z}\\ \bbnum 0 -\end{array}=(\_\Rightarrow e^{:A})(z)=e\quad. +\end{array}=(\_\rightarrow e^{:A})(z)=e\quad. \end{align*} \end_inset -The forward composition seems to be easier to read and to reason about in - the matrix notation. +The +\emph on +forward +\emph default + composition seems to be easier to read and to reason about in the matrix + notation. \end_layout \begin_layout Chapter @@ -3359,12 +3389,12 @@ A mathematical notation developed in this book for deriving properties of \end_inset or -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset . Nameless functions are denoted by -\begin_inset Formula $x^{:A}\Rightarrow f$ +\begin_inset Formula $x^{:A}\rightarrow f$ \end_inset , products by @@ -3874,7 +3904,7 @@ Kleisli arrow Kleisli arrow. A function with type signature -\begin_inset Formula $A\Rightarrow M^{B}$ +\begin_inset Formula $A\rightarrow M^{B}$ \end_inset for some fixed monad @@ -3896,7 +3926,7 @@ a morphism from the Kleisli category corresponding to the monad . The standard monadic method -\begin_inset Formula $\text{pure}_{M}:A\Rightarrow M^{A}$ +\begin_inset Formula $\text{pure}_{M}:A\rightarrow M^{A}$ \end_inset has the type signature of a Kleisli function. @@ -3905,15 +3935,15 @@ a morphism from the Kleisli category corresponding to the monad \end_inset , is a binary operation that combines two Kleisli functions (of types -\begin_inset Formula $A\Rightarrow M^{B}$ +\begin_inset Formula $A\rightarrow M^{B}$ \end_inset and -\begin_inset Formula $B\Rightarrow M^{C}$ +\begin_inset Formula $B\rightarrow M^{C}$ \end_inset ) into a new Kleisli function (of type -\begin_inset Formula $A\Rightarrow M^{C}$ +\begin_inset Formula $A\rightarrow M^{C}$ \end_inset ). @@ -4340,7 +4370,7 @@ A mathematical notation for type expressions developed in this book for \end_inset , and function types by -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset . @@ -4354,7 +4384,7 @@ A mathematical notation for type expressions developed in this book for . The function arrow -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset groups weaker than @@ -4369,7 +4399,7 @@ A mathematical notation for type expressions developed in this book for This means \begin_inset Formula \[ -Z+A\Rightarrow Z+A\times A\quad\text{is the same as}\quad\left(Z+A\right)\Rightarrow\left(Z+\left(A\times A\right)\right)\quad. +Z+A\rightarrow Z+A\times A\quad\text{is the same as}\quad\left(Z+A\right)\rightarrow\left(Z+\left(A\times A\right)\right)\quad. \] \end_inset @@ -4394,7 +4424,7 @@ type F[A] = Either[(A, A => Option[Int]), String => List[A]] is written in the type notation as \begin_inset Formula \[ -F^{A}\triangleq A\times\left(A\Rightarrow\bbnum 1+\text{Int}\right)+(\text{String}\Rightarrow\text{List}^{A})\quad. +F^{A}\triangleq A\times\left(A\rightarrow\bbnum 1+\text{Int}\right)+(\text{String}\rightarrow\text{List}^{A})\quad. \] \end_inset @@ -4577,7 +4607,7 @@ algebra \end_inset is a function with type signature -\begin_inset Formula $F^{A}\Rightarrow A$ +\begin_inset Formula $F^{A}\rightarrow A$ \end_inset , where @@ -4629,7 +4659,7 @@ algebra \end_inset , and then a function of type -\begin_inset Formula $A\times A\Rightarrow A$ +\begin_inset Formula $A\times A\rightarrow A$ \end_inset may be interpreted as a @@ -4723,7 +4753,7 @@ algebra that of a monoid), but these operations will not be commutative or distributive. Also, there is not necessarily a function with type -\begin_inset Formula $F^{A}\Rightarrow A$ +\begin_inset Formula $F^{A}\rightarrow A$ \end_inset , as required for Definition @@ -4951,7 +4981,7 @@ final tagless \end_inset ) is the type expression -\begin_inset Formula $\forall E^{\bullet}.\,(S^{E^{\bullet}}\leadsto E^{\bullet})\Rightarrow E^{A}$ +\begin_inset Formula $\forall E^{\bullet}.\,(S^{E^{\bullet}}\leadsto E^{\bullet})\rightarrow E^{A}$ \end_inset that uses a higher-order type constructor @@ -5189,7 +5219,7 @@ product \begin_layout Standard Function type: -\begin_inset Formula $\text{Int}\Rightarrow\text{String}$ +\begin_inset Formula $\text{Int}\rightarrow\text{String}$ \end_inset @@ -5292,7 +5322,7 @@ Function type: \size footnotesize \color blue Int -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset String @@ -5308,11 +5338,11 @@ def f: \end_inset (Int -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset String) = x -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset "Value is " + x.toString @@ -5388,7 +5418,7 @@ Boolean = x match { \end_inset case Left(i) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset i > 0 @@ -5396,7 +5426,7 @@ Boolean = x match { \end_inset case Right(_) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset false @@ -6000,7 +6030,7 @@ or \size footnotesize \color blue A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset B @@ -6032,7 +6062,7 @@ implies \begin_inset Text \begin_layout Plain Layout -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset @@ -6109,7 +6139,7 @@ def dupl[A]: \end_inset A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset (A, A) @@ -6118,11 +6148,11 @@ A \color inherit . The type of this function, -\begin_inset Formula $A\Rightarrow A\times A$ +\begin_inset Formula $A\rightarrow A\times A$ \end_inset , corresponds to the theorem -\begin_inset Formula $\forall A:A\Rightarrow A\wedge A$ +\begin_inset Formula $\forall A:A\rightarrow A\wedge A$ \end_inset @@ -6370,7 +6400,7 @@ Int \end_inset Int) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset x.toString + "abc" @@ -6382,7 +6412,7 @@ Int) \size footnotesize \color blue Int -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset String @@ -6390,7 +6420,7 @@ Int \size default \color inherit and is represented by the sequent -\begin_inset Formula $\emptyset\vdash\text{Int}\Rightarrow\text{String}$ +\begin_inset Formula $\emptyset\vdash\text{Int}\rightarrow\text{String}$ \end_inset @@ -6462,7 +6492,7 @@ Use: \begin_layout Standard Function type -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset @@ -6474,7 +6504,7 @@ Create: if we have \end_inset then we will have -\begin_inset Formula $\emptyset\vdash A\Rightarrow B$ +\begin_inset Formula $\emptyset\vdash A\rightarrow B$ \end_inset @@ -6482,7 +6512,7 @@ Create: if we have \begin_layout Standard Use: -\begin_inset Formula $A\Rightarrow B,A\vdash B$ +\begin_inset Formula $A\rightarrow B,A\vdash B$ \end_inset @@ -6510,7 +6540,7 @@ Create: \begin_layout Standard Use: -\begin_inset Formula $A+B,A\Rightarrow C,B\Rightarrow C\vdash C$ +\begin_inset Formula $A+B,A\rightarrow C,B\rightarrow C\vdash C$ \end_inset @@ -6657,11 +6687,11 @@ to the right \end_layout \begin_layout Standard -\begin_inset Formula $A\Rightarrow B\Rightarrow C$ +\begin_inset Formula $A\rightarrow B\rightarrow C$ \end_inset means -\begin_inset Formula $A\Rightarrow\left(B\Rightarrow C\right)$ +\begin_inset Formula $A\rightarrow\left(B\rightarrow C\right)$ \end_inset @@ -6672,11 +6702,11 @@ precedence order: implication, disjunction, conjunction \end_layout \begin_layout Standard -\begin_inset Formula $A+B\times C\Rightarrow D$ +\begin_inset Formula $A+B\times C\rightarrow D$ \end_inset means -\begin_inset Formula $\left(A+\left(B\times C\right)\right)\Rightarrow D$ +\begin_inset Formula $\left(A+\left(B\times C\right)\right)\rightarrow D$ \end_inset @@ -6688,11 +6718,11 @@ Quantifiers: implicitly, all our type variables are universally quantified \begin_layout Standard When we write -\begin_inset Formula $A\Rightarrow B\Rightarrow A$ +\begin_inset Formula $A\rightarrow B\rightarrow A$ \end_inset , we mean -\begin_inset Formula $\forall A:\forall B:A\Rightarrow B\Rightarrow A$ +\begin_inset Formula $\forall A:\forall B:A\rightarrow B\rightarrow A$ \end_inset @@ -6719,7 +6749,7 @@ What theorems can we derive in this logic? \begin_layout Standard Example: -\begin_inset Formula $A\Rightarrow B\Rightarrow A$ +\begin_inset Formula $A\rightarrow B\rightarrow A$ \end_inset @@ -6759,7 +6789,7 @@ create function \end_inset , get -\begin_inset Formula $A\vdash B\Rightarrow A$ +\begin_inset Formula $A\vdash B\rightarrow A$ \end_inset @@ -6779,15 +6809,15 @@ create function \end_inset and -\begin_inset Formula $B\Rightarrow A$ +\begin_inset Formula $B\rightarrow A$ \end_inset , get the final sequent -\begin_inset Formula $\emptyset\vdash A\Rightarrow B\Rightarrow A$ +\begin_inset Formula $\emptyset\vdash A\rightarrow B\rightarrow A$ \end_inset showing that -\begin_inset Formula $A\Rightarrow B\Rightarrow A$ +\begin_inset Formula $A\rightarrow B\rightarrow A$ \end_inset is a @@ -6847,7 +6877,7 @@ create function \end_inset rule gives the function -\begin_inset Formula $y^{B}\Rightarrow x^{A}$ +\begin_inset Formula $y^{B}\rightarrow x^{A}$ \end_inset @@ -6863,7 +6893,7 @@ create function \end_inset rule gives -\begin_inset Formula $x^{A}\Rightarrow\left(y^{B}\Rightarrow x\right)$ +\begin_inset Formula $x^{A}\rightarrow\left(y^{B}\rightarrow x\right)$ \end_inset @@ -6879,11 +6909,11 @@ def f[A, B]: \end_inset A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset B -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset A = (x: @@ -6891,7 +6921,7 @@ A \end_inset A) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset (y: @@ -6899,7 +6929,7 @@ A) \end_inset B) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset x @@ -6964,7 +6994,7 @@ Code \begin_inset Text \begin_layout Plain Layout -\begin_inset Formula $\forall A:A\Rightarrow A$ +\begin_inset Formula $\forall A:A\rightarrow A$ \end_inset @@ -6999,7 +7029,7 @@ A = x \begin_inset Text \begin_layout Plain Layout -\begin_inset Formula $\forall A:A\Rightarrow1$ +\begin_inset Formula $\forall A:A\rightarrow1$ \end_inset @@ -7030,7 +7060,7 @@ A): Unit = () \begin_inset Text \begin_layout Plain Layout -\begin_inset Formula $\forall A\forall B:A\Rightarrow A+B$ +\begin_inset Formula $\forall A\forall B:A\rightarrow A+B$ \end_inset @@ -7061,7 +7091,7 @@ Either[A,B] = Left(x) \begin_inset Text \begin_layout Plain Layout -\begin_inset Formula $\forall A\forall B:A\times B\Rightarrow A$ +\begin_inset Formula $\forall A\forall B:A\times B\rightarrow A$ \end_inset @@ -7096,7 +7126,7 @@ A = p._1 \begin_inset Text \begin_layout Plain Layout -\begin_inset Formula $\forall A\forall B:A\Rightarrow B\Rightarrow A$ +\begin_inset Formula $\forall A\forall B:A\rightarrow B\rightarrow A$ \end_inset @@ -7121,11 +7151,11 @@ A): \end_inset B -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset A = (y:B) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset x @@ -7155,7 +7185,7 @@ Examples of non-theorems: \end_inset -\begin_inset Formula $\forall A:1\Rightarrow A$ +\begin_inset Formula $\forall A:1\rightarrow A$ \end_inset ; @@ -7167,7 +7197,7 @@ Examples of non-theorems: \end_inset -\begin_inset Formula $\quad\forall A\forall B:A+B\Rightarrow A$ +\begin_inset Formula $\quad\forall A\forall B:A+B\rightarrow A$ \end_inset ; @@ -7175,7 +7205,7 @@ Examples of non-theorems: \end_inset -\begin_inset Formula $\forall A\forall B:A\Rightarrow A\times B$ +\begin_inset Formula $\forall A\forall B:A\rightarrow A\times B$ \end_inset ; @@ -7183,7 +7213,7 @@ Examples of non-theorems: \end_inset -\begin_inset Formula $\quad\forall A\forall B:(A\Rightarrow B)\Rightarrow A$ +\begin_inset Formula $\quad\forall A\forall B:(A\rightarrow B)\rightarrow A$ \end_inset @@ -7195,7 +7225,7 @@ Given a type's formula, can we implement it in code? Not obvious. \begin_layout Standard Example: -\begin_inset Formula $\forall A\forall B:((((A\Rightarrow B)\Rightarrow A)\Rightarrow A)\Rightarrow B)\Rightarrow B$ +\begin_inset Formula $\forall A\forall B:((((A\rightarrow B)\rightarrow A)\rightarrow A)\rightarrow B)\rightarrow B$ \end_inset @@ -7258,7 +7288,7 @@ Disjunction works very differently from Boolean logic \begin_layout Standard Example: -\begin_inset Formula $A\Rightarrow B+C\vdash(A\Rightarrow B)+(A\Rightarrow C)$ +\begin_inset Formula $A\rightarrow B+C\vdash(A\rightarrow B)+(A\rightarrow C)$ \end_inset does not hold in IPL @@ -7278,15 +7308,15 @@ We cannot implement a function with this type: \size footnotesize \color blue def q[A,B,C](f: A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Either[B, C]): Either[A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset B, A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset C] @@ -7310,11 +7340,11 @@ But \size footnotesize \color blue Either[A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset B, A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset C] @@ -7338,7 +7368,7 @@ Implication works somewhat differently \begin_layout Standard Example: -\begin_inset Formula $\left(\left(A\Rightarrow B\right)\Rightarrow A\right)\Rightarrow A$ +\begin_inset Formula $\left(\left(A\rightarrow B\right)\rightarrow A\right)\rightarrow A$ \end_inset holds in Boolean logic but not in IPL @@ -7368,7 +7398,7 @@ Conjunction works the same as in Boolean logic Example: \begin_inset Formula \[ -A\Rightarrow B\times C\vdash\left(A\Rightarrow B\right)\times\left(A\Rightarrow C\right) +A\rightarrow B\times C\vdash\left(A\rightarrow B\right)\times\left(A\rightarrow C\right) \] \end_inset @@ -7558,7 +7588,7 @@ status open \end_layout \begin_layout Itemize -\begin_inset Formula $\Gamma,A\Rightarrow B,A\vdash B$ +\begin_inset Formula $\Gamma,A\rightarrow B,A\vdash B$ \end_inset @@ -7579,7 +7609,7 @@ status open \end_layout \begin_layout Itemize -\begin_inset Formula $\Gamma,A+B,A\Rightarrow C,B\Rightarrow C\vdash C$ +\begin_inset Formula $\Gamma,A+B,A\rightarrow C,B\rightarrow C\vdash C$ \end_inset @@ -7623,7 +7653,7 @@ status open \begin_layout Plain Layout \begin_inset Formula \[ -\frac{\Gamma,A\vdash B}{\Gamma\vdash A\Rightarrow B} +\frac{\Gamma,A\vdash B}{\Gamma\vdash A\rightarrow B} \] \end_inset @@ -7696,7 +7726,7 @@ complete and sound calculus \begin_inset Formula \begin{align*} \text{(}X\text{ is atomic)\,}\frac{}{\Gamma,{\color{blue}X}\vdash X}\:Id & \qquad\frac{}{\Gamma\vdash{\color{blue}\top}}\,\top\\ -\frac{\Gamma,A\Rightarrow B\vdash A\quad\;\Gamma,B\vdash C}{\Gamma,{\color{blue}A\Rightarrow B}\vdash C}\:L\Rightarrow & \qquad\frac{\Gamma,A\vdash B}{\Gamma\vdash{\color{blue}A\Rightarrow B}}\,R\Rightarrow\\ +\frac{\Gamma,A\rightarrow B\vdash A\quad\;\Gamma,B\vdash C}{\Gamma,{\color{blue}A\rightarrow B}\vdash C}\:L\rightarrow & \qquad\frac{\Gamma,A\vdash B}{\Gamma\vdash{\color{blue}A\rightarrow B}}\,R\rightarrow\\ \frac{\Gamma,A\vdash C\quad\;\Gamma,B\vdash C}{\Gamma,{\color{blue}A+B}\vdash C}\:L+ & \qquad\frac{\Gamma\vdash A_{i}}{\Gamma\vdash{\color{blue}A_{1}+A_{2}}}\,R+_{i}\\ \frac{\Gamma,A_{i}\vdash C}{\Gamma,{\color{blue}A_{1}\times A_{2}}\vdash C}\:L\times_{i} & \qquad\frac{\Gamma\vdash A\quad\;\Gamma\vdash B}{\Gamma\vdash{\color{blue}A\times B}}\,R\times \end{align*} @@ -7744,7 +7774,7 @@ Proof search example I \begin_layout Standard Example: to prove -\begin_inset Formula $\left(\left(R\Rightarrow R\right)\Rightarrow Q\right)\Rightarrow Q$ +\begin_inset Formula $\left(\left(R\rightarrow R\right)\rightarrow Q\right)\rightarrow Q$ \end_inset @@ -7752,7 +7782,7 @@ Example: to prove \begin_layout Standard Root sequent -\begin_inset Formula $S_{0}:\emptyset\vdash\left(\left(R\Rightarrow R\right)\Rightarrow Q\right)\Rightarrow Q$ +\begin_inset Formula $S_{0}:\emptyset\vdash\left(\left(R\rightarrow R\right)\rightarrow Q\right)\rightarrow Q$ \end_inset @@ -7763,11 +7793,11 @@ Root sequent \end_inset with rule -\begin_inset Formula $R\Rightarrow$ +\begin_inset Formula $R\rightarrow$ \end_inset yields -\begin_inset Formula $S_{1}:\left(R\Rightarrow R\right)\Rightarrow Q\vdash Q$ +\begin_inset Formula $S_{1}:\left(R\rightarrow R\right)\rightarrow Q\vdash Q$ \end_inset @@ -7778,11 +7808,11 @@ Root sequent \end_inset with rule -\begin_inset Formula $L\Rightarrow$ +\begin_inset Formula $L\rightarrow$ \end_inset yields -\begin_inset Formula $S_{2}:\left(R\Rightarrow R\right)\Rightarrow Q\vdash R\Rightarrow R$ +\begin_inset Formula $S_{2}:\left(R\rightarrow R\right)\rightarrow Q\vdash R\rightarrow R$ \end_inset and @@ -7813,15 +7843,15 @@ Sequent \end_inset with rule -\begin_inset Formula $L\Rightarrow$ +\begin_inset Formula $L\rightarrow$ \end_inset yields -\begin_inset Formula $S_{4}:\left(R\Rightarrow R\right)\Rightarrow Q\vdash R\Rightarrow R$ +\begin_inset Formula $S_{4}:\left(R\rightarrow R\right)\rightarrow Q\vdash R\rightarrow R$ \end_inset and -\begin_inset Formula $S_{5}:Q\vdash R\Rightarrow R$ +\begin_inset Formula $S_{5}:Q\vdash R\rightarrow R$ \end_inset @@ -7864,11 +7894,11 @@ So we backtrack (erase \end_inset with rule -\begin_inset Formula $R\Rightarrow$ +\begin_inset Formula $R\rightarrow$ \end_inset yields -\begin_inset Formula $S_{6}:\left(R\Rightarrow R\right)\Rightarrow Q;R\vdash R$ +\begin_inset Formula $S_{6}:\left(R\rightarrow R\right)\rightarrow Q;R\vdash R$ \end_inset @@ -7896,7 +7926,7 @@ Therefore we have proved \begin_layout Standard Since -\begin_inset Formula $\left(\left(R\Rightarrow R\right)\Rightarrow Q\right)\Rightarrow Q$ +\begin_inset Formula $\left(\left(R\rightarrow R\right)\rightarrow Q\right)\rightarrow Q$ \end_inset is derived from no premises, it is a theorem @@ -7926,7 +7956,7 @@ Vorobieff-Hudelmaier-Dyckhoff, 1950-1990 \begin_layout Standard The Gentzen calculus LJ will loop if rule -\begin_inset Formula $L\Rightarrow$ +\begin_inset Formula $L\rightarrow$ \end_inset is applied @@ -7938,7 +7968,7 @@ The Gentzen calculus LJ will loop if rule \begin_layout Standard The calculus LJT keeps all rules of LJ except rule -\begin_inset Formula $L\Rightarrow$ +\begin_inset Formula $L\rightarrow$ \end_inset @@ -7946,7 +7976,7 @@ The calculus LJT keeps all rules of LJ except rule \begin_layout Standard Replace rule -\begin_inset Formula $L\Rightarrow$ +\begin_inset Formula $L\rightarrow$ \end_inset by pattern-matching on @@ -7954,16 +7984,16 @@ Replace rule \end_inset in the premise -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset : \begin_inset Formula \begin{align*} -\text{(}X\text{ is atomic)\,}\frac{\Gamma,X,B\vdash D}{\Gamma,X,{\color{blue}X\Rightarrow B}\vdash D}\:L\Rightarrow_{1}\\ -\frac{\Gamma,A\Rightarrow B\Rightarrow C\vdash D}{\Gamma,{\color{blue}(A\times B)\Rightarrow C}\vdash D}\:L\Rightarrow_{2}\\ -\frac{\Gamma,A\Rightarrow C,B\Rightarrow C\vdash D}{\Gamma,{\color{blue}(A+B)\Rightarrow C}\vdash D}\:L\Rightarrow_{3}\\ -\frac{\Gamma,B\Rightarrow C\vdash A\Rightarrow B\quad\quad\Gamma,C\vdash D}{\Gamma,{\color{blue}(A\Rightarrow B)\Rightarrow C}\vdash D}\:L\Rightarrow_{4} +\text{(}X\text{ is atomic)\,}\frac{\Gamma,X,B\vdash D}{\Gamma,X,{\color{blue}X\rightarrow B}\vdash D}\:L\rightarrow_{1}\\ +\frac{\Gamma,A\rightarrow B\rightarrow C\vdash D}{\Gamma,{\color{blue}(A\times B)\rightarrow C}\vdash D}\:L\rightarrow_{2}\\ +\frac{\Gamma,A\rightarrow C,B\rightarrow C\vdash D}{\Gamma,{\color{blue}(A+B)\rightarrow C}\vdash D}\:L\rightarrow_{3}\\ +\frac{\Gamma,B\rightarrow C\vdash A\rightarrow B\quad\quad\Gamma,C\vdash D}{\Gamma,{\color{blue}(A\rightarrow B)\rightarrow C}\vdash D}\:L\rightarrow_{4} \end{align*} \end_inset @@ -8016,7 +8046,7 @@ It is obvious that it is obvious \begin_layout Standard Rule -\begin_inset Formula $L\Rightarrow_{4}$ +\begin_inset Formula $L\rightarrow_{4}$ \end_inset is based on the key theorem: @@ -8024,7 +8054,7 @@ Rule \begin_inset Formula \[ -\left(\left(A\Rightarrow B\right)\Rightarrow C\right)\Rightarrow\left(A\Rightarrow B\right)\,\Longleftrightarrow\,\left(B\Rightarrow C\right)\Rightarrow\left(A\Rightarrow B\right) +\left(\left(A\rightarrow B\right)\rightarrow C\right)\rightarrow\left(A\rightarrow B\right)\,\Longleftrightarrow\,\left(B\rightarrow C\right)\rightarrow\left(A\rightarrow B\right) \] \end_inset @@ -8034,7 +8064,7 @@ Rule \begin_layout Standard The key theorem for rule -\begin_inset Formula $L\Rightarrow_{4}$ +\begin_inset Formula $L\rightarrow_{4}$ \end_inset is attributed to Vorobieff (1958): @@ -8070,7 +8100,7 @@ A stepping stone to this theorem: \begin_inset Formula \[ -\left(\left(A\Rightarrow B\right)\Rightarrow C\right)\Rightarrow B\Rightarrow C +\left(\left(A\rightarrow B\right)\rightarrow C\right)\rightarrow B\rightarrow C \] \end_inset @@ -8082,7 +8112,7 @@ Proof ( obviously \emph default trivial): -\begin_inset Formula $f^{\left(A\Rightarrow B\right)\Rightarrow C}\Rightarrow b^{B}\Rightarrow f\:(x^{A}\Rightarrow b)$ +\begin_inset Formula $f^{\left(A\rightarrow B\right)\rightarrow C}\rightarrow b^{B}\rightarrow f\:(x^{A}\rightarrow b)$ \end_inset @@ -8147,7 +8177,7 @@ Sequent in a proof follows from an axiom or from a transforming rule \begin_layout Standard The two axioms are fixed expressions, -\begin_inset Formula $x^{A}\Rightarrow x$ +\begin_inset Formula $x^{A}\rightarrow x$ \end_inset and @@ -8163,7 +8193,7 @@ Each rule has a proof transformer \emph default function: -\begin_inset Formula $\text{PT}_{R\Rightarrow}$ +\begin_inset Formula $\text{PT}_{R\rightarrow}$ \end_inset , @@ -8178,9 +8208,9 @@ Examples of proof transformer functions: \begin_inset Formula \begin{align*} \frac{\Gamma,A\vdash C\quad\;\Gamma,B\vdash C}{\Gamma,{\color{blue}A+B}\vdash C}\:L+\\ -PT_{L+}(t_{1}^{A\Rightarrow C},t_{2}^{B\Rightarrow C})=x^{A+B}\Rightarrow & \ x\ \text{match}\begin{cases} -a^{A}\Rightarrow t_{1}(a)\\ -b^{B}\Rightarrow t_{2}(b) +PT_{L+}(t_{1}^{A\rightarrow C},t_{2}^{B\rightarrow C})=x^{A+B}\rightarrow & \ x\ \text{match}\begin{cases} +a^{A}\rightarrow t_{1}(a)\\ +b^{B}\rightarrow t_{2}(b) \end{cases} \end{align*} @@ -8189,8 +8219,8 @@ b^{B}\Rightarrow t_{2}(b) \begin_inset Formula \begin{align*} -\frac{\Gamma,A\Rightarrow B\Rightarrow C\vdash D}{\Gamma,{\color{blue}(A\times B)\Rightarrow C}\vdash D}\:L\Rightarrow_{2}\\ -PT_{L\Rightarrow_{2}}(f^{\left(A\Rightarrow B\Rightarrow C\right)\Rightarrow D})=g^{A\times B\Rightarrow C}\Rightarrow & f\,(x^{A}\Rightarrow y^{B}\Rightarrow g(x,y)) +\frac{\Gamma,A\rightarrow B\rightarrow C\vdash D}{\Gamma,{\color{blue}(A\times B)\rightarrow C}\vdash D}\:L\rightarrow_{2}\\ +PT_{L\rightarrow_{2}}(f^{\left(A\rightarrow B\rightarrow C\right)\rightarrow D})=g^{A\times B\rightarrow C}\rightarrow & f\,(x^{A}\rightarrow y^{B}\rightarrow g(x,y)) \end{align*} \end_inset @@ -8247,11 +8277,11 @@ Example: to prove \begin_inset Formula \begin{align*} -S_{6}:\left(R\Rightarrow R\right)\Rightarrow Q;R\vdash R\quad(\text{axiom }Id)\quad & t_{6}(rrq,r)=r\\ -S_{2}:\left(R\Rightarrow R\right)\Rightarrow Q\vdash\left(R\Rightarrow R\right)\quad\text{PT}_{R\Rightarrow}(t_{6})\quad & t_{2}(rrq)=\left(r\Rightarrow t_{6}(rrq,r)\right)\\ +S_{6}:\left(R\rightarrow R\right)\rightarrow Q;R\vdash R\quad(\text{axiom }Id)\quad & t_{6}(rrq,r)=r\\ +S_{2}:\left(R\rightarrow R\right)\rightarrow Q\vdash\left(R\rightarrow R\right)\quad\text{PT}_{R\rightarrow}(t_{6})\quad & t_{2}(rrq)=\left(r\rightarrow t_{6}(rrq,r)\right)\\ S_{3}:Q\vdash Q\quad(\text{axiom }Id)\quad & t_{3}(q)=q\\ -S_{1}:\left(R\Rightarrow R\right)\Rightarrow Q\vdash Q\quad\text{PT}_{L\Rightarrow}(t_{2},t_{3})\quad & t_{1}(rrq)=t_{3}(rrq(t_{2}(rrq)))\\ -S_{0}:\emptyset\vdash\left(\left(R\Rightarrow R\right)\Rightarrow Q\right)\Rightarrow Q\quad\text{PT}_{R\Rightarrow}(t_{1})\quad & t_{0}=\left(rrq\Rightarrow t_{1}(rrq)\right) +S_{1}:\left(R\rightarrow R\right)\rightarrow Q\vdash Q\quad\text{PT}_{L\rightarrow}(t_{2},t_{3})\quad & t_{1}(rrq)=t_{3}(rrq(t_{2}(rrq)))\\ +S_{0}:\emptyset\vdash\left(\left(R\rightarrow R\right)\rightarrow Q\right)\rightarrow Q\quad\text{PT}_{R\rightarrow}(t_{1})\quad & t_{0}=\left(rrq\rightarrow t_{1}(rrq)\right) \end{align*} \end_inset @@ -8267,8 +8297,8 @@ The proof expression for is then obtained as \begin_inset Formula \begin{align*} -t_{0} & =rrq\Rightarrow t_{3}\left(rrq\left(t_{2}\left(rrq\right)\right)\right)=rrq\Rightarrow rrq(r\Rightarrow t_{6}\left(rrq,r\right)\\ - & =rrq\Rightarrow rrq\left(r\Rightarrow r\right) +t_{0} & =rrq\rightarrow t_{3}\left(rrq\left(t_{2}\left(rrq\right)\right)\right)=rrq\rightarrow rrq(r\rightarrow t_{6}\left(rrq,r\right)\\ + & =rrq\rightarrow rrq\left(r\rightarrow r\right) \end{align*} \end_inset @@ -8276,7 +8306,7 @@ t_{0} & =rrq\Rightarrow t_{3}\left(rrq\left(t_{2}\left(rrq\right)\right)\right)= Simplified final code having the required type: \begin_inset Formula \[ -t_{0}:\left(\left(R\Rightarrow R\right)\Rightarrow Q\right)\Rightarrow Q=\left(rrq\Rightarrow rrq\left(r\Rightarrow r\right)\right) +t_{0}:\left(\left(R\rightarrow R\right)\rightarrow Q\right)\rightarrow Q=\left(rrq\rightarrow rrq\left(r\rightarrow r\right)\right) \] \end_inset @@ -8412,7 +8442,7 @@ Here is an explicit example of obtaining an incorrect result when using Consider the formula \begin_inset Formula \begin{equation} -\left(A\Rightarrow B+C\right)\Rightarrow\left(A\Rightarrow B\right)+\left(A\Rightarrow C\right)\label{eq:abc-example-classical-logic} +\left(A\rightarrow B+C\right)\rightarrow\left(A\rightarrow B\right)+\left(A\rightarrow C\right)\label{eq:abc-example-classical-logic} \end{equation} \end_inset @@ -8420,7 +8450,7 @@ Here is an explicit example of obtaining an incorrect result when using or, putting in all the parentheses for clarity, \begin_inset Formula \[ -\left(A\Rightarrow\left(B+C\right)\right)\Rightarrow\left(\left(A\Rightarrow B\right)+\left(A\Rightarrow C\right)\right)\quad. +\left(A\rightarrow\left(B+C\right)\right)\rightarrow\left(\left(A\rightarrow B\right)+\left(A\rightarrow C\right)\right)\quad. \] \end_inset diff --git a/sofp-src/sofp-appendices.tex b/sofp-src/sofp-appendices.tex index 92ec0e0ad..a97124386 100644 --- a/sofp-src/sofp-appendices.tex +++ b/sofp-src/sofp-appendices.tex @@ -25,8 +25,8 @@ \section{Summary of notations for types and code} \item [{$A\times B$}] a product (tuple) type. In Scala, this type is \lstinline!(A,B)! \item [{$a^{:A}\times b^{:B}$}] value of a tuple type $A\times B$. In Scala, \lstinline!(a, b)! -\item [{$A\Rightarrow B$}] the function type, mapping from $A$ to $B$ -\item [{$x^{:A}\Rightarrow f$}] a nameless function (as a value). In Scala, +\item [{$A\rightarrow B$}] the function type, mapping from $A$ to $B$ +\item [{$x^{:A}\rightarrow f$}] a nameless function (as a value). In Scala, \lstinline!{ x:A => f }! \item [{$\text{id}$}] the identity function; in Scala, \lstinline!identity[A]! \item [{$\triangleq$}] ``equal by definition'' @@ -56,10 +56,10 @@ \section{Summary of notations for types and code} In Scala 3, \lstinline![A] => P[A]! \item [{$\exists A.P^{A}$}] an existentially quantified type expression. In Scala, \lstinline!{ type A; val x: P[A] }! -\item [{$\bef$}] the forward composition of functions: $f\bef g$ is $x\Rightarrow g(f(x))$. +\item [{$\bef$}] the forward composition of functions: $f\bef g$ is $x\rightarrow g(f(x))$. In Scala, \lstinline!f andThen g! \item [{$\circ$}] the backward composition of functions: $f\circ g$ is -$x\Rightarrow f(g(x))$. In Scala, \lstinline!f compose g! +$x\rightarrow f(g(x))$. In Scala, \lstinline!f compose g! \item [{$\circ$}] the backward composition of type constructors: $F\circ G$ is $F^{G^{\bullet}}$ \item [{$\triangleright$}] use a value as the argument of a function: @@ -71,15 +71,15 @@ \section{Summary of notations for types and code} \item [{$f^{\downarrow H}$}] a function $f$ raised to a contrafunctor \item [{$\diamond_{M}$}] the Kleisli product operation for the monad $M$ \item [{$\oplus$}] the binary operation of a monoid. In Scala, \lstinline!x |+| y! -\item [{$\Delta$}] the ``diagonal'' function of type $\forall A.\,A\Rightarrow A\times A$ +\item [{$\Delta$}] the ``diagonal'' function of type $\forall A.\,A\rightarrow A\times A$ \item [{$\nabla_{1},\nabla_{2},...$}] the projections from a tuple to its first, second, ..., parts \item [{$\boxtimes$}] pair product of functions, $(f\boxtimes g)(a\times b)=f(a)\times g(b)$ \item [{$\left[a,b,c\right]$}] an ordered sequence of values. In Scala, \lstinline!Seq(a, b, c)! \item [{$\begin{array}{||cc|} -x\Rightarrow x & \bbnum 0\\ -\bbnum 0 & a\Rightarrow a\times a +x\rightarrow x & \bbnum 0\\ +\bbnum 0 & a\rightarrow a\times a \end{array}$}] a function that works with disjunctive types \end{description} @@ -131,23 +131,23 @@ \section{Detailed explanations} $^{:A}$ and $^{:B}$ may be omitted if the types are unambiguous from the context. -$A\Rightarrow B$ means a function type from $A$ to $B$. In Scala, +$A\rightarrow B$ means a function type from $A$ to $B$. In Scala, this is the function type \lstinline!A => B!. -$x^{:A}\Rightarrow y$ means a nameless function with argument $x$ +$x^{:A}\rightarrow y$ means a nameless function with argument $x$ of type $A$ and function body $y$. (Usually, the body $y$ will be an expression that uses $x$. In Scala, this is \lstinline!{ x: A => y }!. Type annotation $^{:A}$ may be omitted if the type is unambiguous from the context. $\text{id}$ means the identity function. The type of its argument -should be either specified as $\text{id}^{A}$ or $\text{id}^{:A\Rightarrow A}$, +should be either specified as $\text{id}^{A}$ or $\text{id}^{:A\rightarrow A}$, or else should be unambiguous from the context. In Scala, \lstinline!identity[A]! corresponds to $\text{id}^{A}$. $\triangleq$ means ``equal by definition''. Examples: \begin{itemize} -\item $f\triangleq(x^{:\text{Int}}\Rightarrow x+10)$ is a definition of +\item $f\triangleq(x^{:\text{Int}}\rightarrow x+10)$ is a definition of a function $f$. In Scala, this is \lstinline!val f = { x: Int => x + 10 }!. \item $F^{A}\triangleq\bbnum 1+A$ is a definition of a type constructor $F$. In Scala, this is \lstinline!type F[A] = Option[A]!. @@ -173,6 +173,11 @@ \section{Detailed explanations} \end{lstlisting} defines an unfunctor\index{unfunctor}, which is denoted by $F^{A}\triangleq\bbnum 1^{:F^{\text{Int}}}+A^{:F^{A\times\text{String}}}$. +$\wedge$ (conjunction), $\vee$ (disjunction), and $\Rightarrow$ +(implication) are used in formulas of Boolean as well as constructive +logic in Chapter~\ref{chap:3-3-The-formal-logic-curry-howard}, e.g.~$\alpha\wedge\beta$, +where Greek letters stand for logical propositions. + $\text{fmap}_{F}$ means the standard method $\text{fmap}$ of the \lstinline!Functor! typeclass, implemented for the functor $F$. In Scala, this may be written as \texttt{}\lstinline!Functor[F].fmap!. @@ -180,13 +185,13 @@ \section{Detailed explanations} the subscript ``$F$'' is not a type parameter of $\text{fmap}_{F}$. The method $\text{fmap}_{F}$ actually has \emph{two} type parameters, which can be written out as $\text{fmap}_{F}^{A,B}$. Then the type -signature of $\text{fmap}$ is written in full as $\text{fmap}_{F}^{A,B}:\left(A\Rightarrow B\right)\Rightarrow F^{A}\Rightarrow F^{B}$. +signature of $\text{fmap}$ is written in full as $\text{fmap}_{F}^{A,B}:\left(A\rightarrow B\right)\rightarrow F^{A}\rightarrow F^{B}$. For clarity, we may sometimes write out the type parameters $A,B$ in the expression $\text{fmap}_{F}^{A,B}$, but in most cases these type parameters $A$, $B$ can be omitted without loss of clarity. $\text{pu}_{F}$ denotes a monad $F$'s method \lstinline!pure!. -This function has type signature $A\Rightarrow F^{A}$ that contains +This function has type signature $A\rightarrow F^{A}$ that contains a type parameter $A$. In the code notation, the type parameter may be either omitted or denoted as $\text{pu}_{F}^{A}$. If we are using the \lstinline!pure! method with a complicated type, e.g. $\bbnum 1+P^{A}$, @@ -194,14 +199,14 @@ \section{Detailed explanations} parameter for clarity and write $\text{pu}_{F}^{\bbnum 1+P^{A}}$. The type signature of that function is then \[ -\text{pu}_{F}^{1+P^{A}}:\bbnum 1+P^{A}\Rightarrow F^{\bbnum 1+P^{A}}\quad. +\text{pu}_{F}^{1+P^{A}}:\bbnum 1+P^{A}\rightarrow F^{\bbnum 1+P^{A}}\quad. \] But in most cases we will not need to write out the type parameters. $\text{flm}_{F}$ denotes a monad $F$'s method \lstinline!flatMap! with the type signature \[ -\text{flm}_{F}:\left(A\Rightarrow F^{B}\right)\Rightarrow F^{A}\Rightarrow F^{B}\quad. +\text{flm}_{F}:\left(A\rightarrow F^{B}\right)\rightarrow F^{A}\rightarrow F^{B}\quad. \] Note that Scala's standard \lstinline!flatMap! type signature is not curried. The curried method $\text{flm}_{F}$ is easier to use @@ -210,7 +215,7 @@ \section{Detailed explanations} $\text{ftn}_{F}$ denotes a monad $F$'s method \lstinline!flatten! with the type signature \[ -\text{ftn}_{F}:F^{F^{A}}\Rightarrow F^{A}\quad. +\text{ftn}_{F}:F^{F^{A}}\rightarrow F^{A}\quad. \] $F^{\bullet}$ means the type constructor $F$ understood as a type-level @@ -244,11 +249,11 @@ \section{Detailed explanations} $\bef$ means the forward composition\index{forward composition} of functions: $f\bef g$ (reads ``$f$ before $g$'') is the function -defined as $x\Rightarrow g(f(x))$. +defined as $x\rightarrow g(f(x))$. $\circ$ means the backward composition\index{backward composition} of functions: $f\circ g$ (reads ``$f$ after $g$'') is the function -defined as $x\Rightarrow f(g(x))$. +defined as $x\rightarrow f(g(x))$. $\circ$ with type constructors means their (backward) composition, for example $F\circ G$ denotes the type constructor $F^{G^{\bullet}}$. @@ -274,8 +279,8 @@ \section{Detailed explanations} \end{align*} Some examples of reasoning in the pipe notation: \begin{align*} - & \left(a\Rightarrow a\triangleright f\right)=\left(a\Rightarrow f(a)\right)=f\quad,\\ - & f\triangleright\left(y\Rightarrow a\triangleright y\right)=a\triangleright f=f(a)\quad,\\ + & \left(a\rightarrow a\triangleright f\right)=\left(a\rightarrow f(a)\right)=f\quad,\\ + & f\triangleright\left(y\rightarrow a\triangleright y\right)=a\triangleright f=f(a)\quad,\\ & f(y(x))=x\triangleright y\triangleright f\neq x\triangleright\left(y\triangleright f\right)=f(y)(x)\quad. \end{align*} The correspondence between the forward composition and the backward @@ -286,12 +291,12 @@ \section{Detailed explanations} \end{align*} $f^{\uparrow G}$ means a function $f$ lifted to a functor $G$. -For a function $f^{:A\Rightarrow B}$, the application of $f^{\uparrow G}$ +For a function $f^{:A\rightarrow B}$, the application of $f^{\uparrow G}$ to a value $g^{:G^{A}}$ is written as $f^{\uparrow G}(g)$ or as $g\triangleright f^{\uparrow G}$. In Scala, this is \lstinline!g.map(f)!. Nested lifting (i.e.~lifting to the functor composition $H\circ G$) can be written as $f^{\uparrow G\uparrow H}$, which means $\left(f^{\uparrow G}\right)^{\uparrow H}$ -and produces a function of type $H^{G^{A}}\Rightarrow H^{G^{B}}$. +and produces a function of type $H^{G^{A}}\rightarrow H^{G^{B}}$. Applying a nested lifting to a value $h$ of type $H^{G^{A}}$ is written as $f^{\uparrow G\uparrow H}h$ or $h\triangleright f^{\uparrow G\uparrow H}$. In Scala, this is \lstinline!h.map(_.map(f))!. The functor composition @@ -303,22 +308,22 @@ \section{Detailed explanations} and the notation $x\triangleright p^{\uparrow G}\triangleright q^{\uparrow G}$. $f^{\downarrow H}$ means a function $f$ lifted to a contrafunctor -$H$. For a function $f^{:A\Rightarrow B}$, the application of $f^{\downarrow H}$ +$H$. For a function $f^{:A\rightarrow B}$, the application of $f^{\downarrow H}$ to a value $h:H^{B}$ is written as $f^{\downarrow H}h$ or $h\triangleright f^{\downarrow H}$, and yields a value of type $H^{A}$. In Scala, this is \lstinline!h.contramap(f)!. Nested lifting is denoted as $f^{\downarrow H\uparrow G}\triangleq(f^{\downarrow H})^{\uparrow G}$. $\diamond_{M}$ means the Kleisli product operation for a given monad $M$. This is a binary operation working on two Kleisli functions -of types $A\Rightarrow M^{B}$ and $B\Rightarrow M^{C}$ and yields -a new function of type $A\Rightarrow M^{C}$. +of types $A\rightarrow M^{B}$ and $B\rightarrow M^{C}$ and yields +a new function of type $A\rightarrow M^{C}$. $\oplus$ means the binary operation of a monoid, for example $x\oplus y$. The specific monoid type should be defined for this expression to make sense. For example, in Scala the monoidal operation is usually denoted by \lstinline!x |+| y!. -$\Delta$ means the ``diagonal'' function of type $\forall A.\,A\Rightarrow A\times A$. +$\Delta$ means the ``diagonal'' function of type $\forall A.\,A\rightarrow A\times A$. There is only one implementation of this type signature, \begin{lstlisting} def delta[A](a: A): (A, A) = (a, a) @@ -357,10 +362,10 @@ \section{Detailed explanations} \lstinline!Vector(a, b, c)!, \lstinline!Array(a, b, c)!, or another collection type. -$f^{:Z+A\Rightarrow Z+A\times A}\triangleq\begin{array}{||cc|} -z\Rightarrow z & \bbnum 0\\ -\bbnum 0 & a\Rightarrow a\times a -\end{array}\,$ is the ``matrix notation''\index{matrix notation} for a function +$f^{:Z+A\rightarrow Z+A\times A}\triangleq\begin{array}{||cc|} +z\rightarrow z & \bbnum 0\\ +\bbnum 0 & a\rightarrow a\times a +\end{array}\,$ is the \textbf{matrix notation}\index{matrix notation} for a function whose input and/or output type is a disjunctive type. In Scala, the function $f$ is implemented as \begin{lstlisting} @@ -376,21 +381,21 @@ \section{Detailed explanations} output disjunctive type. If the the output type is not disjunctive, there will be only one column. -A ``type-annotated matrix'' writes out all parts of the disjunctive -types in a separate ``type row'' and ``type column'': +A matrix may show all parts of the disjunctive types in separate ``type +row'' and ``type column'': \begin{equation} -f\triangleq\begin{array}{|c||cc|} +f^{:Z+A\Rightarrow Z+A\times A}\triangleq\begin{array}{|c||cc|} & Z & A\times A\\ \hline Z & \text{id} & \bbnum 0\\ -A & \bbnum 0 & a\Rightarrow a\times a +A & \bbnum 0 & a\rightarrow a\times a \end{array}\quad. \end{equation} This notation clearly indicates the input and the output types of -the function and is useful at the initial stages of reasoning about -the code. The vertical double line separates input types from the -function code. In the code above, the ``type column'' shows the -parts of the input disjunction type $Z+A$. The ``type row'' shows -the parts of the output disjunction type $Z+A\times A$. +the function and is useful at some stages of reasoning about the code. +The vertical double line separates input types from the function code. +In the code above, the ``type column'' shows the parts of the input +disjunctive type $Z+A$. The ``type row'' shows the parts of the +output disjunctive type $Z+A\times A$. The matrix notation is adapted to \emph{forward} function compositions ($f\bef g$). Assume that $A$ is a monoid type, and consider the @@ -407,11 +412,11 @@ \section{Detailed explanations} \[ g\triangleq\begin{array}{|c||c|} & A\\ -\hline Z & \_\Rightarrow e^{:A}\\ -A\times A & a_{1}\times a_{2}\Rightarrow a_{1}\oplus a_{2} +\hline Z & \_\rightarrow e^{:A}\\ +A\times A & a_{1}\times a_{2}\rightarrow a_{1}\oplus a_{2} \end{array}\quad,\quad\quad g\triangleq\begin{array}{||c|} -\_\Rightarrow e^{:A}\\ -a_{1}\times a_{2}\Rightarrow a_{1}\oplus a_{2} +\_\rightarrow e^{:A}\\ +a_{1}\times a_{2}\rightarrow a_{1}\oplus a_{2} \end{array}\quad. \] The forward composition $f\bef g$ is computed by forward-composing @@ -420,17 +425,17 @@ \section{Detailed explanations} \begin{align*} f\bef g & =\begin{array}{||cc|} \text{id} & \bbnum 0\\ -\bbnum 0 & a\Rightarrow a\times a +\bbnum 0 & a\rightarrow a\times a \end{array}\,\bef\,\begin{array}{||c|} -\_\Rightarrow e^{:A}\\ -a_{1}\times a_{2}\Rightarrow a_{1}\oplus a_{2} +\_\rightarrow e^{:A}\\ +a_{1}\times a_{2}\rightarrow a_{1}\oplus a_{2} \end{array}\\ & =\,\begin{array}{||c|} -\text{id}\bef(\_\Rightarrow e^{:A})\\ -\left(a\Rightarrow a\times a\right)\bef\left(a_{1}\times a_{2}\Rightarrow a_{1}\oplus a_{2}\right) +\text{id}\bef(\_\rightarrow e^{:A})\\ +\left(a\rightarrow a\times a\right)\bef\left(a_{1}\times a_{2}\rightarrow a_{1}\oplus a_{2}\right) \end{array}=\begin{array}{||c|} -\_\Rightarrow e^{:A}\\ -a\Rightarrow a\oplus a +\_\rightarrow e^{:A}\\ +a\rightarrow a\oplus a \end{array}\quad. \end{align*} Applying a function to a value of a disjunctive type such as $x:Z+A$ @@ -444,15 +449,15 @@ \section{Detailed explanations} \[ x\triangleright f\bef g=\begin{array}{||cc|} z^{:Z} & \bbnum 0\end{array}\,\triangleright\,\begin{array}{||c|} -\_\Rightarrow e^{:A}\\ -a\Rightarrow a\oplus a -\end{array}=z\triangleright(\_\Rightarrow e)=e\quad. +\_\rightarrow e^{:A}\\ +a\rightarrow a\oplus a +\end{array}=z\triangleright(\_\rightarrow e)=e\quad. \] Since the standard rules of matrix multiplication are associative, the properties of the $\triangleright$-notation such as $x\triangleright(f\bef g)=(x\triangleright f)\triangleright g$ are guaranteed to hold. -To use the matrix notation with backward compositions ($f\circ g$), +To use the matrix notation with \emph{backward} compositions ($f\circ g$), all function matrices need to be transposed. (A standard identity of matrix calculus is that the transposition reverses the order of composition, $\left(AB\right)^{T}=B^{T}A^{T}$.) The argument types @@ -462,30 +467,30 @@ \section{Detailed explanations} \begin{align*} g\circ f & =\begin{array}{|c|cc|} & Z & A\times A\\ -\hline\hline A & \_\Rightarrow e^{:A} & a_{1}\times a_{2}\Rightarrow a_{1}\oplus a_{2} +\hline\hline A & \_\rightarrow e^{:A} & a_{1}\times a_{2}\rightarrow a_{1}\oplus a_{2} \end{array}\,\circ\,\begin{array}{|c|cc|} & Z & A\\ \hline\hline Z & \text{id} & \bbnum 0\\ -A\times A & \bbnum 0 & a\Rightarrow a\times a +A\times A & \bbnum 0 & a\rightarrow a\times a \end{array}\\ & =\,\begin{array}{|cc|} -\hline\hline \text{id}\bef(\_\Rightarrow e^{:A}) & \left(a\Rightarrow a\times a\right)\bef\left(a_{1}\times a_{2}\Rightarrow a_{1}\oplus a_{2}\right)\end{array}=\begin{array}{|cc|} -\hline\hline \_\Rightarrow e^{:A} & a\Rightarrow a\oplus a\end{array}\quad.\\ +\hline\hline \text{id}\bef(\_\rightarrow e^{:A}) & \left(a\rightarrow a\times a\right)\bef\left(a_{1}\times a_{2}\rightarrow a_{1}\oplus a_{2}\right)\end{array}=\begin{array}{|cc|} +\hline\hline \_\rightarrow e^{:A} & a\rightarrow a\oplus a\end{array}\quad.\\ (g\circ f)(x) & =\begin{array}{|cc|} -\hline\hline \_\Rightarrow e^{:A} & a\Rightarrow a\oplus a\end{array}\,\begin{array}{|c|} +\hline\hline \_\rightarrow e^{:A} & a\rightarrow a\oplus a\end{array}\,\begin{array}{|c|} \hline\hline z^{:Z}\\ \bbnum 0 -\end{array}=(\_\Rightarrow e^{:A})(z)=e\quad. +\end{array}=(\_\rightarrow e^{:A})(z)=e\quad. \end{align*} -The forward composition seems to be easier to read and to reason about -in the matrix notation. +The \emph{forward} composition seems to be easier to read and to reason +about in the matrix notation. \chapter{Glossary of terms\label{chap:Appendix-Glossary-of-terms}} \begin{description} \item [{Code~notation}] \index{code notation}A mathematical notation developed in this book for deriving properties of code in functional programs. Variables have optional type annotations, such as $x^{:A}$ -or $f^{:A\Rightarrow B}$. Nameless functions are denoted by$x^{:A}\Rightarrow f$, +or $f^{:A\rightarrow B}$. Nameless functions are denoted by$x^{:A}\rightarrow f$, products by $a\times b$, and values of a disjunctive type $A+B$ are written as $x^{:A}+\bbnum 0^{:B}$ or $\bbnum 0^{:A}+y^{:B}$. Functions working with disjunctive types are denoted by matrices. @@ -540,13 +545,13 @@ \chapter{Glossary of terms\label{chap:Appendix-Glossary-of-terms}} block needs to be at least a functor but does not have to be a monad.) \item [{Kleisli~function}] \index{Kleisli function}Also called a Kleisli morphism\index{Kleisli morphism} or a \index{Kleisli arrow}Kleisli -arrow. A function with type signature $A\Rightarrow M^{B}$ for some +arrow. A function with type signature $A\rightarrow M^{B}$ for some fixed monad $M$. More verbosely, ``a morphism from the Kleisli category -corresponding to the monad $M$''. The standard monadic method $\text{pure}_{M}:A\Rightarrow M^{A}$ +corresponding to the monad $M$''. The standard monadic method $\text{pure}_{M}:A\rightarrow M^{A}$ has the type signature of a Kleisli function. The Kleisli product operation, $\diamond_{M}$, is a binary operation that combines two -Kleisli functions (of types $A\Rightarrow M^{B}$ and $B\Rightarrow M^{C}$) -into a new Kleisli function (of type $A\Rightarrow M^{C}$). +Kleisli functions (of types $A\rightarrow M^{B}$ and $B\rightarrow M^{C}$) +into a new Kleisli function (of type $A\rightarrow M^{C}$). \item [{\index{method}Method}] This word is used in two ways: 1) A method$_{1}$ is a Scala function defined as a member of a typeclass. For example, \lstinline!flatMap! is a method defined in the \lstinline!Monad! @@ -589,12 +594,12 @@ \chapter{Glossary of terms\label{chap:Appendix-Glossary-of-terms}} \item [{Type~notation}] \index{type notation}A mathematical notation for type expressions developed in this book for easier reasoning about types in functional programs. Disjunctive types are denoted by $+$, -product types by $\times$, and function types by $\Rightarrow$. +product types by $\times$, and function types by $\rightarrow$. The unit type is denoted by $\bbnum 1$, and the void type by $\bbnum 0$. -The function arrow $\Rightarrow$ groups weaker than $+$, which in +The function arrow $\rightarrow$ groups weaker than $+$, which in turn groups weaker than $\times$. This means \[ -Z+A\Rightarrow Z+A\times A\quad\text{is the same as}\quad\left(Z+A\right)\Rightarrow\left(Z+\left(A\times A\right)\right)\quad. +Z+A\rightarrow Z+A\times A\quad\text{is the same as}\quad\left(Z+A\right)\rightarrow\left(Z+\left(A\times A\right)\right)\quad. \] Type parameters are denoted by superscripts. As an example, the Scala definition\texttt{} @@ -603,7 +608,7 @@ \chapter{Glossary of terms\label{chap:Appendix-Glossary-of-terms}} \end{lstlisting} is written in the type notation as \[ -F^{A}\triangleq A\times\left(A\Rightarrow\bbnum 1+\text{Int}\right)+(\text{String}\Rightarrow\text{List}^{A})\quad. +F^{A}\triangleq A\times\left(A\rightarrow\bbnum 1+\text{Int}\right)+(\text{String}\rightarrow\text{List}^{A})\quad. \] \item [{\index{unfunctor}Unfunctor}] A type constructor that cannot possibly be a functor, nor a contrafunctor, nor a profunctor. An example is @@ -640,12 +645,12 @@ \section{On the current misuse of the term ``algebra''} \paragraph{Definition 1.} -An ``algebra'' is a function with type signature $F^{A}\Rightarrow A$, +An ``algebra'' is a function with type signature $F^{A}\rightarrow A$, where $F^{A}$ is some fixed functor. This definition comes from category theory, where such types are called \textbf{$F$-algebras\index{$F$-algebra}}. There is no direct connection between this ``algebra'' and Definition~0, except when the functor $F$ is defined by $F^{A}\triangleq A\times A$, -and then a function of type $A\times A\Rightarrow A$ may be interpreted +and then a function of type $A\times A\rightarrow A$ may be interpreted as a ``multiplication'' operation (however, $A$ is a type and not a vector space, and there are no distributivity or commutativity laws). It is better to call such functions ``$F$-algebras'', emphasizing @@ -666,7 +671,7 @@ \section{On the current misuse of the term ``algebra''} of ``algebra''. The type $F^{A}$ may admit some binary or unary operations (e.g.~that of a monoid), but these operations will not be commutative or distributive. Also, there is not necessarily a function -with type $F^{A}\Rightarrow A$, as required for Definition~1. Rather, +with type $F^{A}\rightarrow A$, as required for Definition~1. Rather, the the word ``algebra'' refers to ``school-level algebra'' with polynomials, since these data types are built from sums and products of types. If the data contains a function type, e.g.~\lstinline!Option[Int => A]!, @@ -697,7 +702,7 @@ \section{On the current misuse of the term ``algebra''} \paragraph{Definition 4.} The Church encoding of a free monad (also known as the ``final tagless\index{final tagless} -style of programming'') is the type expression $\forall E^{\bullet}.\,(S^{E^{\bullet}}\leadsto E^{\bullet})\Rightarrow E^{A}$ +style of programming'') is the type expression $\forall E^{\bullet}.\,(S^{E^{\bullet}}\leadsto E^{\bullet})\rightarrow E^{A}$ that uses a higher-order type constructor $S$ parameterized by a \emph{type constructor} parameter $E$. The sub-expression $S^{E^{\bullet}}\leadsto E^{\bullet}$ can be viewed as an $S$-algebra in the category of type constructors @@ -739,7 +744,7 @@ \section{Slides} Tuple (``product'') type: $\text{Int}\times\text{String}$ -Function type: $\text{Int}\Rightarrow\text{String}$ +Function type: $\text{Int}\rightarrow\text{String}$ Disjunction (``sum'') type: $\text{Int}+\text{String}$ @@ -758,11 +763,11 @@ \section{Slides} Use: \texttt{\textcolor{blue}{\footnotesize{}val y:\ String = pair.\_2}}{\footnotesize\par} -Function type: \texttt{\textcolor{blue}{\footnotesize{}Int $\Rightarrow$ +Function type: \texttt{\textcolor{blue}{\footnotesize{}Int $\rightarrow$ String}}{\footnotesize\par} -Create: \texttt{\textcolor{blue}{\footnotesize{}def f:\ (Int $\Rightarrow$ -String) = x $\Rightarrow$ \textquotedbl Value is \textquotedbl{} +Create: \texttt{\textcolor{blue}{\footnotesize{}def f:\ (Int $\rightarrow$ +String) = x $\rightarrow$ \textquotedbl Value is \textquotedbl{} + x.toString}} Use: \texttt{\textcolor{blue}{\footnotesize{}val y:\ String = f(123)}}{\footnotesize\par} @@ -778,9 +783,9 @@ \section{Slides} Use: \texttt{\textcolor{blue}{\footnotesize{}val z:\ Boolean = x match \{}}~\\ -\texttt{\textcolor{blue}{\footnotesize{} case Left(i) $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{} case Left(i) $\rightarrow$ i > 0}}~\\ -\texttt{\textcolor{blue}{\footnotesize{} case Right(\_) $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{} case Right(\_) $\rightarrow$ false}}~\\ \texttt{\textcolor{blue}{\footnotesize{}\}}}{\footnotesize\par} @@ -875,7 +880,7 @@ \section{Slides} \hline \texttt{\textcolor{blue}{\footnotesize{}Either{[}A, B{]}}} & ${\cal CH}(A)$ \emph{or} ${\cal CH}(B)$ & $A\vee B$; $A+B$\tabularnewline \hline -\texttt{\textcolor{blue}{\footnotesize{}A $\Rightarrow$ B}} & ${\cal CH}(A)$ \emph{implies} ${\cal CH}(B)$ & $A\Rightarrow B$\tabularnewline +\texttt{\textcolor{blue}{\footnotesize{}A $\rightarrow$ B}} & ${\cal CH}(A)$ \emph{implies} ${\cal CH}(B)$ & $A\rightarrow B$\tabularnewline \hline \texttt{\textcolor{blue}{\footnotesize{}Unit}} & \emph{True} & 1\tabularnewline \hline @@ -886,8 +891,8 @@ \section{Slides} a function type means $\forall T$ Example: \texttt{\textcolor{blue}{\footnotesize{}def dupl{[}A{]}:\ A -$\Rightarrow$ (A, A)}}. The type of this function, $A\Rightarrow A\times A$, -corresponds to the theorem $\forall A:A\Rightarrow A\wedge A$ +$\rightarrow$ (A, A)}}. The type of this function, $A\rightarrow A\times A$, +corresponds to the theorem $\forall A:A\rightarrow A\wedge A$ Translating language constructions into the logic I @@ -933,10 +938,10 @@ \section{Slides} that uses an \texttt{\textcolor{blue}{\footnotesize{}x:\ Int}} and is represented by the sequent $\text{Int}\vdash\text{String}$ -\texttt{\textcolor{blue}{\footnotesize{}(x:\ Int) $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{}(x:\ Int) $\rightarrow$ x.toString + \textquotedbl abc\textquotedbl}} is an expression -of type \texttt{\textcolor{blue}{\footnotesize{}Int $\Rightarrow$ -String}} and is represented by the sequent $\emptyset\vdash\text{Int}\Rightarrow\text{String}$ +of type \texttt{\textcolor{blue}{\footnotesize{}Int $\rightarrow$ +String}} and is represented by the sequent $\emptyset\vdash\text{Int}\rightarrow\text{String}$ Sequents only describe the \emph{types} of expressions and their parts @@ -957,17 +962,17 @@ \section{Slides} Use: $A\times B\vdash A$ and also $A\times B\vdash B$ -Function type $A\Rightarrow B$ +Function type $A\rightarrow B$ -Create: if we have $A\vdash B$ then we will have $\emptyset\vdash A\Rightarrow B$ +Create: if we have $A\vdash B$ then we will have $\emptyset\vdash A\rightarrow B$ -Use: $A\Rightarrow B,A\vdash B$ +Use: $A\rightarrow B,A\vdash B$ Disjunction type $A+B$ Create: $A\vdash A+B$ and also $B\vdash A+B$ -Use: $A+B,A\Rightarrow C,B\Rightarrow C\vdash C$ +Use: $A+B,A\rightarrow C,B\rightarrow C\vdash C$ Unit type $1$ @@ -1002,15 +1007,15 @@ \section{Slides} the implication operation associates \emph{to the right} -$A\Rightarrow B\Rightarrow C$ means $A\Rightarrow\left(B\Rightarrow C\right)$ +$A\rightarrow B\rightarrow C$ means $A\rightarrow\left(B\rightarrow C\right)$ precedence order: implication, disjunction, conjunction -$A+B\times C\Rightarrow D$ means $\left(A+\left(B\times C\right)\right)\Rightarrow D$ +$A+B\times C\rightarrow D$ means $\left(A+\left(B\times C\right)\right)\rightarrow D$ Quantifiers: implicitly, all our type variables are universally quantified -When we write $A\Rightarrow B\Rightarrow A$, we mean $\forall A:\forall B:A\Rightarrow B\Rightarrow A$ +When we write $A\rightarrow B\rightarrow A$, we mean $\forall A:\forall B:A\rightarrow B\rightarrow A$ The logic of types I @@ -1019,16 +1024,16 @@ \section{Slides} What theorems can we derive in this logic? -Example: $A\Rightarrow B\Rightarrow A$ +Example: $A\rightarrow B\rightarrow A$ Start with an axiom $A\vdash A$; add an unused extra premise $B$: $A,B\vdash A$ -Use the ``create function'' rule with $B$ and $A$, get $A\vdash B\Rightarrow A$ +Use the ``create function'' rule with $B$ and $A$, get $A\vdash B\rightarrow A$ -Use the ``create function'' rule with $A$ and $B\Rightarrow A$, -get the final sequent $\emptyset\vdash A\Rightarrow B\Rightarrow A$ -showing that $A\Rightarrow B\Rightarrow A$ is a \textbf{theorem} +Use the ``create function'' rule with $A$ and $B\rightarrow A$, +get the final sequent $\emptyset\vdash A\rightarrow B\rightarrow A$ +showing that $A\rightarrow B\rightarrow A$ is a \textbf{theorem} since it is derived from no premises What code does this describe? @@ -1039,13 +1044,13 @@ \section{Slides} The unused premise $B$ corresponds to unused variable $y^{B}$ of type $B$ -The ``create function'' rule gives the function $y^{B}\Rightarrow x^{A}$ +The ``create function'' rule gives the function $y^{B}\rightarrow x^{A}$ -The second ``create function'' rule gives $x^{A}\Rightarrow\left(y^{B}\Rightarrow x\right)$ +The second ``create function'' rule gives $x^{A}\rightarrow\left(y^{B}\rightarrow x\right)$ Scala code: \texttt{\textcolor{blue}{\footnotesize{}def f{[}A, B{]}:\ A -$\Rightarrow$ B $\Rightarrow$ A = (x:\ A) $\Rightarrow$ (y:\ B) -$\Rightarrow$ x}}{\footnotesize\par} +$\rightarrow$ B $\rightarrow$ A = (x:\ A) $\rightarrow$ (y:\ B) +$\rightarrow$ x}}{\footnotesize\par} Any code expression's type can be translated into a sequent @@ -1060,20 +1065,20 @@ \section{Slides} \textbf{Proposition} & \textbf{Code}\tabularnewline \hline \hline -$\forall A:A\Rightarrow A$ & \texttt{\textcolor{blue}{\footnotesize{}def identity{[}A{]}(x:\ A):\ A +$\forall A:A\rightarrow A$ & \texttt{\textcolor{blue}{\footnotesize{}def identity{[}A{]}(x:\ A):\ A = x}}\tabularnewline \hline -$\forall A:A\Rightarrow1$ & \texttt{\textcolor{blue}{\footnotesize{}def toUnit{[}A{]}(x:\ A): Unit +$\forall A:A\rightarrow1$ & \texttt{\textcolor{blue}{\footnotesize{}def toUnit{[}A{]}(x:\ A): Unit = ()}}\tabularnewline \hline -$\forall A\forall B:A\Rightarrow A+B$ & \texttt{\textcolor{blue}{\footnotesize{}def inLeft{[}A,B{]}(x:A):\ Either{[}A,B{]} +$\forall A\forall B:A\rightarrow A+B$ & \texttt{\textcolor{blue}{\footnotesize{}def inLeft{[}A,B{]}(x:A):\ Either{[}A,B{]} = Left(x)}}\tabularnewline \hline -$\forall A\forall B:A\times B\Rightarrow A$ & \texttt{\textcolor{blue}{\footnotesize{}def first{[}A,B{]}(p:\ (A,B)):\ A +$\forall A\forall B:A\times B\rightarrow A$ & \texttt{\textcolor{blue}{\footnotesize{}def first{[}A,B{]}(p:\ (A,B)):\ A = p.\_1}}\tabularnewline \hline -$\forall A\forall B:A\Rightarrow B\Rightarrow A$ & \texttt{\textcolor{blue}{\footnotesize{}def const{[}A,B{]}(x:\ A):\ B$\Rightarrow$A -= (y:B)$\Rightarrow$x}}\tabularnewline +$\forall A\forall B:A\rightarrow B\rightarrow A$ & \texttt{\textcolor{blue}{\footnotesize{}def const{[}A,B{]}(x:\ A):\ B$\rightarrow$A += (y:B)$\rightarrow$x}}\tabularnewline \hline \end{tabular} \par\end{center} @@ -1081,13 +1086,13 @@ \section{Slides} Also, non-theorems \emph{cannot be implemented} in code Examples of non-theorems:\\ - $\forall A:1\Rightarrow A$; \ \ $\quad\forall A\forall B:A+B\Rightarrow A$; + $\forall A:1\rightarrow A$; \ \ $\quad\forall A\forall B:A+B\rightarrow A$; \\ -$\forall A\forall B:A\Rightarrow A\times B$; \ $\quad\forall A\forall B:(A\Rightarrow B)\Rightarrow A$ +$\forall A\forall B:A\rightarrow A\times B$; \ $\quad\forall A\forall B:(A\rightarrow B)\rightarrow A$ Given a type's formula, can we implement it in code? Not obvious. -Example: $\forall A\forall B:((((A\Rightarrow B)\Rightarrow A)\Rightarrow A)\Rightarrow B)\Rightarrow B$ +Example: $\forall A\forall B:((((A\rightarrow B)\rightarrow A)\rightarrow A)\rightarrow B)\rightarrow B$ Can we write a function with this type? Can we prove this formula? @@ -1103,24 +1108,24 @@ \section{Slides} Disjunction works very differently from Boolean logic -Example: $A\Rightarrow B+C\vdash(A\Rightarrow B)+(A\Rightarrow C)$ +Example: $A\rightarrow B+C\vdash(A\rightarrow B)+(A\rightarrow C)$ does not hold in IPL This is counter-intuitive! We cannot implement a function with this type: -\texttt{\textcolor{blue}{\footnotesize{}def q{[}A,B,C{]}(f: A $\Rightarrow$ -Either{[}B, C{]}): Either{[}A $\Rightarrow$ B, A $\Rightarrow$ C{]}}}{\footnotesize\par} +\texttt{\textcolor{blue}{\footnotesize{}def q{[}A,B,C{]}(f: A $\rightarrow$ +Either{[}B, C{]}): Either{[}A $\rightarrow$ B, A $\rightarrow$ C{]}}}{\footnotesize\par} Disjunction is ``constructive'': need to supply one of the parts -But \texttt{\textcolor{blue}{\footnotesize{}Either{[}A $\Rightarrow$ -B, A $\Rightarrow$ C{]}}} is not a function of \texttt{\textcolor{blue}{\footnotesize{}A}} +But \texttt{\textcolor{blue}{\footnotesize{}Either{[}A $\rightarrow$ +B, A $\rightarrow$ C{]}}} is not a function of \texttt{\textcolor{blue}{\footnotesize{}A}} Implication works somewhat differently -Example: $\left(\left(A\Rightarrow B\right)\Rightarrow A\right)\Rightarrow A$ +Example: $\left(\left(A\rightarrow B\right)\rightarrow A\right)\rightarrow A$ holds in Boolean logic but not in IPL Cannot compute an \texttt{\textcolor{blue}{\footnotesize{}x:\ A}} @@ -1130,7 +1135,7 @@ \section{Slides} Example: \[ -A\Rightarrow B\times C\vdash\left(A\Rightarrow B\right)\times\left(A\Rightarrow C\right) +A\rightarrow B\times C\vdash\left(A\rightarrow B\right)\times\left(A\rightarrow C\right) \] @@ -1176,10 +1181,10 @@ \section{Slides} \item $\Gamma,A,B\vdash A\times B$ \item $\Gamma,A\times B\vdash A$ \item $\Gamma,A\times B\vdash B$ -\item $\Gamma,A\Rightarrow B,A\vdash B$ +\item $\Gamma,A\rightarrow B,A\vdash B$ \item $\Gamma,A\vdash A+B$ \item $\Gamma,B\vdash A+B$ -\item $\Gamma,A+B,A\Rightarrow C,B\Rightarrow C\vdash C$ +\item $\Gamma,A+B,A\rightarrow C,B\rightarrow C\vdash C$ \item $\Gamma\vdash1$ \item $\Gamma,A\vdash A$ \end{itemize} @@ -1187,7 +1192,7 @@ \section{Slides} \end{minipage}% \begin{minipage}[t]{0.49\columnwidth}% \[ -\frac{\Gamma,A\vdash B}{\Gamma\vdash A\Rightarrow B} +\frac{\Gamma,A\vdash B}{\Gamma\vdash A\rightarrow B} \] \[ \frac{\Gamma\vdash G}{\Gamma,D\vdash G} @@ -1212,7 +1217,7 @@ \section{Slides} rules that will yield all (and only!) theorems of the logic \begin{align*} \text{(}X\text{ is atomic)\,}\frac{}{\Gamma,{\color{blue}X}\vdash X}\:Id & \qquad\frac{}{\Gamma\vdash{\color{blue}\top}}\,\top\\ -\frac{\Gamma,A\Rightarrow B\vdash A\quad\;\Gamma,B\vdash C}{\Gamma,{\color{blue}A\Rightarrow B}\vdash C}\:L\Rightarrow & \qquad\frac{\Gamma,A\vdash B}{\Gamma\vdash{\color{blue}A\Rightarrow B}}\,R\Rightarrow\\ +\frac{\Gamma,A\rightarrow B\vdash A\quad\;\Gamma,B\vdash C}{\Gamma,{\color{blue}A\rightarrow B}\vdash C}\:L\rightarrow & \qquad\frac{\Gamma,A\vdash B}{\Gamma\vdash{\color{blue}A\rightarrow B}}\,R\rightarrow\\ \frac{\Gamma,A\vdash C\quad\;\Gamma,B\vdash C}{\Gamma,{\color{blue}A+B}\vdash C}\:L+ & \qquad\frac{\Gamma\vdash A_{i}}{\Gamma\vdash{\color{blue}A_{1}+A_{2}}}\,R+_{i}\\ \frac{\Gamma,A_{i}\vdash C}{\Gamma,{\color{blue}A_{1}\times A_{2}}\vdash C}\:L\times_{i} & \qquad\frac{\Gamma\vdash A\quad\;\Gamma\vdash B}{\Gamma\vdash{\color{blue}A\times B}}\,R\times \end{align*} @@ -1228,20 +1233,20 @@ \section{Slides} Proof search example I -Example: to prove $\left(\left(R\Rightarrow R\right)\Rightarrow Q\right)\Rightarrow Q$ +Example: to prove $\left(\left(R\rightarrow R\right)\rightarrow Q\right)\rightarrow Q$ -Root sequent $S_{0}:\emptyset\vdash\left(\left(R\Rightarrow R\right)\Rightarrow Q\right)\Rightarrow Q$ +Root sequent $S_{0}:\emptyset\vdash\left(\left(R\rightarrow R\right)\rightarrow Q\right)\rightarrow Q$ -$S_{0}$ with rule $R\Rightarrow$ yields $S_{1}:\left(R\Rightarrow R\right)\Rightarrow Q\vdash Q$ +$S_{0}$ with rule $R\rightarrow$ yields $S_{1}:\left(R\rightarrow R\right)\rightarrow Q\vdash Q$ -$S_{1}$ with rule $L\Rightarrow$ yields $S_{2}:\left(R\Rightarrow R\right)\Rightarrow Q\vdash R\Rightarrow R$ +$S_{1}$ with rule $L\rightarrow$ yields $S_{2}:\left(R\rightarrow R\right)\rightarrow Q\vdash R\rightarrow R$ and $S_{3}:Q\vdash Q$ Sequent $S_{3}$ follows from the $Id$ axiom; it remains to prove $S_{2}$ -$S_{2}$ with rule $L\Rightarrow$ yields $S_{4}:\left(R\Rightarrow R\right)\Rightarrow Q\vdash R\Rightarrow R$ -and $S_{5}:Q\vdash R\Rightarrow R$ +$S_{2}$ with rule $L\rightarrow$ yields $S_{4}:\left(R\rightarrow R\right)\rightarrow Q\vdash R\rightarrow R$ +and $S_{5}:Q\vdash R\rightarrow R$ We are stuck here because $S_{4}=S_{2}$ (we are in a loop) @@ -1250,13 +1255,13 @@ \section{Slides} So we backtrack (erase $S_{4}$, $S_{5}$) and apply another rule to $S_{2}$ -$S_{2}$ with rule $R\Rightarrow$ yields $S_{6}:\left(R\Rightarrow R\right)\Rightarrow Q;R\vdash R$ +$S_{2}$ with rule $R\rightarrow$ yields $S_{6}:\left(R\rightarrow R\right)\rightarrow Q;R\vdash R$ Sequent $S_{6}$ follows from the $Id$ axiom Therefore we have proved $S_{0}$ -Since $\left(\left(R\Rightarrow R\right)\Rightarrow Q\right)\Rightarrow Q$ +Since $\left(\left(R\rightarrow R\right)\rightarrow Q\right)\rightarrow Q$ is derived from no premises, it is a theorem $Q.E.D.$ @@ -1265,18 +1270,18 @@ \section{Slides} Vorobieff-Hudelmaier-Dyckhoff, 1950-1990 -The Gentzen calculus LJ will loop if rule $L\Rightarrow$ is applied +The Gentzen calculus LJ will loop if rule $L\rightarrow$ is applied $\geq2$ times -The calculus LJT keeps all rules of LJ except rule $L\Rightarrow$ +The calculus LJT keeps all rules of LJ except rule $L\rightarrow$ -Replace rule $L\Rightarrow$ by pattern-matching on $A$ in the premise -$A\Rightarrow B$: +Replace rule $L\rightarrow$ by pattern-matching on $A$ in the premise +$A\rightarrow B$: \begin{align*} -\text{(}X\text{ is atomic)\,}\frac{\Gamma,X,B\vdash D}{\Gamma,X,{\color{blue}X\Rightarrow B}\vdash D}\:L\Rightarrow_{1}\\ -\frac{\Gamma,A\Rightarrow B\Rightarrow C\vdash D}{\Gamma,{\color{blue}(A\times B)\Rightarrow C}\vdash D}\:L\Rightarrow_{2}\\ -\frac{\Gamma,A\Rightarrow C,B\Rightarrow C\vdash D}{\Gamma,{\color{blue}(A+B)\Rightarrow C}\vdash D}\:L\Rightarrow_{3}\\ -\frac{\Gamma,B\Rightarrow C\vdash A\Rightarrow B\quad\quad\Gamma,C\vdash D}{\Gamma,{\color{blue}(A\Rightarrow B)\Rightarrow C}\vdash D}\:L\Rightarrow_{4} +\text{(}X\text{ is atomic)\,}\frac{\Gamma,X,B\vdash D}{\Gamma,X,{\color{blue}X\rightarrow B}\vdash D}\:L\rightarrow_{1}\\ +\frac{\Gamma,A\rightarrow B\rightarrow C\vdash D}{\Gamma,{\color{blue}(A\times B)\rightarrow C}\vdash D}\:L\rightarrow_{2}\\ +\frac{\Gamma,A\rightarrow C,B\rightarrow C\vdash D}{\Gamma,{\color{blue}(A+B)\rightarrow C}\vdash D}\:L\rightarrow_{3}\\ +\frac{\Gamma,B\rightarrow C\vdash A\rightarrow B\quad\quad\Gamma,C\vdash D}{\Gamma,{\color{blue}(A\rightarrow B)\rightarrow C}\vdash D}\:L\rightarrow_{4} \end{align*} When using LJT rules, the proof tree has no loops and terminates @@ -1289,13 +1294,13 @@ \section{Slides} ``\emph{It is obvious that it is obvious}'' \textendash{} a mathematician after thinking for a half-hour -Rule $L\Rightarrow_{4}$ is based on the key theorem: {\footnotesize{} +Rule $L\rightarrow_{4}$ is based on the key theorem: {\footnotesize{} \[ -\left(\left(A\Rightarrow B\right)\Rightarrow C\right)\Rightarrow\left(A\Rightarrow B\right)\,\Longleftrightarrow\,\left(B\Rightarrow C\right)\Rightarrow\left(A\Rightarrow B\right) +\left(\left(A\rightarrow B\right)\rightarrow C\right)\rightarrow\left(A\rightarrow B\right)\,\Longleftrightarrow\,\left(B\rightarrow C\right)\rightarrow\left(A\rightarrow B\right) \] }{\footnotesize\par} -The key theorem for rule $L\Rightarrow_{4}$ is attributed to Vorobieff +The key theorem for rule $L\rightarrow_{4}$ is attributed to Vorobieff (1958): \begin{center} \includegraphics[width=0.8\textwidth]{Vorobieff-lemma} @@ -1308,9 +1313,9 @@ \section{Slides} A stepping stone to this theorem:{\footnotesize{} \[ -\left(\left(A\Rightarrow B\right)\Rightarrow C\right)\Rightarrow B\Rightarrow C +\left(\left(A\rightarrow B\right)\rightarrow C\right)\rightarrow B\rightarrow C \] -}Proof (\emph{obviously} trivial): $f^{\left(A\Rightarrow B\right)\Rightarrow C}\Rightarrow b^{B}\Rightarrow f\:(x^{A}\Rightarrow b)$ +}Proof (\emph{obviously} trivial): $f^{\left(A\rightarrow B\right)\rightarrow C}\rightarrow b^{B}\rightarrow f\:(x^{A}\rightarrow b)$ \emph{Details are left as exercise for the reader} @@ -1325,22 +1330,22 @@ \section{Slides} Sequent in a proof follows from an axiom or from a transforming rule -The two axioms are fixed expressions, $x^{A}\Rightarrow x$ and $1$ +The two axioms are fixed expressions, $x^{A}\rightarrow x$ and $1$ -Each rule has a \emph{proof transformer} function: $\text{PT}_{R\Rightarrow}$ +Each rule has a \emph{proof transformer} function: $\text{PT}_{R\rightarrow}$ , $\text{PT}_{L+}$ , etc. Examples of proof transformer functions: \begin{align*} \frac{\Gamma,A\vdash C\quad\;\Gamma,B\vdash C}{\Gamma,{\color{blue}A+B}\vdash C}\:L+\\ -PT_{L+}(t_{1}^{A\Rightarrow C},t_{2}^{B\Rightarrow C})=x^{A+B}\Rightarrow & \ x\ \text{match}\begin{cases} -a^{A}\Rightarrow t_{1}(a)\\ -b^{B}\Rightarrow t_{2}(b) +PT_{L+}(t_{1}^{A\rightarrow C},t_{2}^{B\rightarrow C})=x^{A+B}\rightarrow & \ x\ \text{match}\begin{cases} +a^{A}\rightarrow t_{1}(a)\\ +b^{B}\rightarrow t_{2}(b) \end{cases} \end{align*} \begin{align*} -\frac{\Gamma,A\Rightarrow B\Rightarrow C\vdash D}{\Gamma,{\color{blue}(A\times B)\Rightarrow C}\vdash D}\:L\Rightarrow_{2}\\ -PT_{L\Rightarrow_{2}}(f^{\left(A\Rightarrow B\Rightarrow C\right)\Rightarrow D})=g^{A\times B\Rightarrow C}\Rightarrow & f\,(x^{A}\Rightarrow y^{B}\Rightarrow g(x,y)) +\frac{\Gamma,A\rightarrow B\rightarrow C\vdash D}{\Gamma,{\color{blue}(A\times B)\rightarrow C}\vdash D}\:L\rightarrow_{2}\\ +PT_{L\rightarrow_{2}}(f^{\left(A\rightarrow B\rightarrow C\right)\rightarrow D})=g^{A\times B\rightarrow C}\rightarrow & f\,(x^{A}\rightarrow y^{B}\rightarrow g(x,y)) \end{align*} Verify that we can indeed produce PTs for every rule of LJT @@ -1354,22 +1359,22 @@ \section{Slides} Example: to prove $S_{0}$, start from $S_{6}$ backwards:{\footnotesize{} \begin{align*} -S_{6}:\left(R\Rightarrow R\right)\Rightarrow Q;R\vdash R\quad(\text{axiom }Id)\quad & t_{6}(rrq,r)=r\\ -S_{2}:\left(R\Rightarrow R\right)\Rightarrow Q\vdash\left(R\Rightarrow R\right)\quad\text{PT}_{R\Rightarrow}(t_{6})\quad & t_{2}(rrq)=\left(r\Rightarrow t_{6}(rrq,r)\right)\\ +S_{6}:\left(R\rightarrow R\right)\rightarrow Q;R\vdash R\quad(\text{axiom }Id)\quad & t_{6}(rrq,r)=r\\ +S_{2}:\left(R\rightarrow R\right)\rightarrow Q\vdash\left(R\rightarrow R\right)\quad\text{PT}_{R\rightarrow}(t_{6})\quad & t_{2}(rrq)=\left(r\rightarrow t_{6}(rrq,r)\right)\\ S_{3}:Q\vdash Q\quad(\text{axiom }Id)\quad & t_{3}(q)=q\\ -S_{1}:\left(R\Rightarrow R\right)\Rightarrow Q\vdash Q\quad\text{PT}_{L\Rightarrow}(t_{2},t_{3})\quad & t_{1}(rrq)=t_{3}(rrq(t_{2}(rrq)))\\ -S_{0}:\emptyset\vdash\left(\left(R\Rightarrow R\right)\Rightarrow Q\right)\Rightarrow Q\quad\text{PT}_{R\Rightarrow}(t_{1})\quad & t_{0}=\left(rrq\Rightarrow t_{1}(rrq)\right) +S_{1}:\left(R\rightarrow R\right)\rightarrow Q\vdash Q\quad\text{PT}_{L\rightarrow}(t_{2},t_{3})\quad & t_{1}(rrq)=t_{3}(rrq(t_{2}(rrq)))\\ +S_{0}:\emptyset\vdash\left(\left(R\rightarrow R\right)\rightarrow Q\right)\rightarrow Q\quad\text{PT}_{R\rightarrow}(t_{1})\quad & t_{0}=\left(rrq\rightarrow t_{1}(rrq)\right) \end{align*} }{\footnotesize\par} The proof expression for $S_{0}$ is then obtained as \begin{align*} -t_{0} & =rrq\Rightarrow t_{3}\left(rrq\left(t_{2}\left(rrq\right)\right)\right)=rrq\Rightarrow rrq(r\Rightarrow t_{6}\left(rrq,r\right)\\ - & =rrq\Rightarrow rrq\left(r\Rightarrow r\right) +t_{0} & =rrq\rightarrow t_{3}\left(rrq\left(t_{2}\left(rrq\right)\right)\right)=rrq\rightarrow rrq(r\rightarrow t_{6}\left(rrq,r\right)\\ + & =rrq\rightarrow rrq\left(r\rightarrow r\right) \end{align*} Simplified final code having the required type: \[ -t_{0}:\left(\left(R\Rightarrow R\right)\Rightarrow Q\right)\Rightarrow Q=\left(rrq\Rightarrow rrq\left(r\Rightarrow r\right)\right) +t_{0}:\left(\left(R\rightarrow R\right)\rightarrow Q\right)\rightarrow Q=\left(rrq\rightarrow rrq\left(r\rightarrow r\right)\right) \] @@ -1411,11 +1416,11 @@ \section{Example: The logic of types is not Boolean} using classical logic to reason about values computed by functional programs. Consider the formula \begin{equation} -\left(A\Rightarrow B+C\right)\Rightarrow\left(A\Rightarrow B\right)+\left(A\Rightarrow C\right)\label{eq:abc-example-classical-logic} +\left(A\rightarrow B+C\right)\rightarrow\left(A\rightarrow B\right)+\left(A\rightarrow C\right)\label{eq:abc-example-classical-logic} \end{equation} or, putting in all the parentheses for clarity, \[ -\left(A\Rightarrow\left(B+C\right)\right)\Rightarrow\left(\left(A\Rightarrow B\right)+\left(A\Rightarrow C\right)\right)\quad. +\left(A\rightarrow\left(B+C\right)\right)\rightarrow\left(\left(A\rightarrow B\right)+\left(A\rightarrow C\right)\right)\quad. \] This formula is a true theorem in classical logic. diff --git a/sofp-src/sofp-applicative.lyx b/sofp-src/sofp-applicative.lyx index ca3d0e046..174042c52 100644 --- a/sofp-src/sofp-applicative.lyx +++ b/sofp-src/sofp-applicative.lyx @@ -109,9 +109,6 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} @@ -362,7 +359,7 @@ status open \size footnotesize \color blue Future { c1 }.flatMap { x -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset @@ -374,7 +371,7 @@ Future { c1 }.flatMap { x \size footnotesize \color blue Future { c2 }.flatMap { y -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset @@ -386,7 +383,7 @@ Future { c1 }.flatMap { x \size footnotesize \color blue Future { c3 }.map { z -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset ...} @@ -622,7 +619,7 @@ flatMap : the desired type signature is \size footnotesize -\begin_inset Formula $\text{map2}:F^{A}\times F^{B}\Rightarrow\left(A\times B\Rightarrow C\right)\Rightarrow F^{C}$ +\begin_inset Formula $\text{map2}:F^{A}\times F^{B}\rightarrow\left(A\times B\rightarrow C\right)\rightarrow F^{C}$ \end_inset @@ -1120,9 +1117,9 @@ mapN : \begin_inset Formula \begin{align*} -\text{map}_{1} & :F^{A}\Rightarrow\left(A\Rightarrow Z\right)\Rightarrow F^{Z}\\ -\text{map}_{2} & :F^{A}\times F^{B}\Rightarrow\left(A\times B\Rightarrow Z\right)\Rightarrow F^{Z}\\ -\text{map}_{3} & :F^{A}\times F^{B}\times F^{C}\Rightarrow\left(A\times B\times C\Rightarrow Z\right)\Rightarrow F^{Z} +\text{map}_{1} & :F^{A}\rightarrow\left(A\rightarrow Z\right)\rightarrow F^{Z}\\ +\text{map}_{2} & :F^{A}\times F^{B}\rightarrow\left(A\times B\rightarrow Z\right)\rightarrow F^{Z}\\ +\text{map}_{3} & :F^{A}\times F^{B}\times F^{C}\rightarrow\left(A\times B\times C\rightarrow Z\right)\rightarrow F^{Z} \end{align*} \end_inset @@ -1196,7 +1193,7 @@ Future[A] \end_layout \begin_layout Standard -\begin_inset Formula $F^{A}\equiv E\Rightarrow A$ +\begin_inset Formula $F^{A}\equiv E\rightarrow A$ \end_inset : pass standard arguments to functions more easily @@ -1255,7 +1252,7 @@ imap2 \end_inset -\begin_inset Formula $Z\times A\Rightarrow A\times A$ +\begin_inset Formula $Z\times A\rightarrow A\times A$ \end_inset @@ -1397,21 +1394,21 @@ imap2 \end_layout \begin_layout Standard -\begin_inset Formula $F^{A}\equiv E\Rightarrow A\times A$ +\begin_inset Formula $F^{A}\equiv E\rightarrow A\times A$ \end_inset \end_layout \begin_layout Standard -\begin_inset Formula $F^{A}\equiv Z\times A\Rightarrow A$ +\begin_inset Formula $F^{A}\equiv Z\times A\rightarrow A$ \end_inset \end_layout \begin_layout Standard -\begin_inset Formula $F^{A}\equiv A\Rightarrow A\times Z$ +\begin_inset Formula $F^{A}\equiv A\rightarrow A\times Z$ \end_inset where @@ -1614,7 +1611,7 @@ Can we avoid having to define \begin_layout Itemize Use curried arguments, -\begin_inset Formula $\text{fmap}_{2}:(A\Rightarrow B\Rightarrow Z)\Rightarrow F^{A}\Rightarrow F^{B}\Rightarrow F^{Z}$ +\begin_inset Formula $\text{fmap}_{2}:(A\rightarrow B\rightarrow Z)\rightarrow F^{A}\rightarrow F^{B}\rightarrow F^{Z}$ \end_inset @@ -1623,7 +1620,7 @@ Use curried arguments, \begin_deeper \begin_layout Itemize Set -\begin_inset Formula $A\equiv\left(B\Rightarrow Z\right)$ +\begin_inset Formula $A\equiv\left(B\rightarrow Z\right)$ \end_inset and apply @@ -1631,11 +1628,11 @@ Set \end_inset to the identity -\begin_inset Formula $\text{id}^{\left(B\Rightarrow Z\right)\Rightarrow\left(B\Rightarrow Z\right)}$ +\begin_inset Formula $\text{id}^{\left(B\rightarrow Z\right)\rightarrow\left(B\rightarrow Z\right)}$ \end_inset : obtain -\begin_inset Formula $\text{ap}^{[B,Z]}:F^{B\Rightarrow Z}\Rightarrow F^{B}\Rightarrow F^{Z}\equiv\text{fmap}_{2}\left(\text{id}\right)$ +\begin_inset Formula $\text{ap}^{[B,Z]}:F^{B\rightarrow Z}\rightarrow F^{B}\rightarrow F^{Z}\equiv\text{fmap}_{2}\left(\text{id}\right)$ \end_inset @@ -1667,7 +1664,7 @@ ap \begin_inset Formula \[ -\text{fmap}_{2}\,f^{A\Rightarrow B\Rightarrow Z}=\text{fmap}\,f\bef\text{ap} +\text{fmap}_{2}\,f^{A\rightarrow B\rightarrow Z}=\text{fmap}\,f\bef\text{ap} \] \end_inset @@ -1675,8 +1672,8 @@ ap \begin_inset Formula \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{B\Rightarrow Z}\ar[rd]\sp(0.45){\text{ap}}\\ -F^{A}\ar[ru]\sp(0.45){\text{fmap}\,f}\ar[rr]\sb(0.45){\text{fmap}_{2}\,(f^{A\Rightarrow B\Rightarrow Z})} & & \left(F^{B}\Rightarrow F^{Z}\right) +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{B\rightarrow Z}\ar[rd]\sp(0.45){\text{ap}}\\ +F^{A}\ar[ru]\sp(0.45){\text{fmap}\,f}\ar[rr]\sb(0.45){\text{fmap}_{2}\,(f^{A\rightarrow B\rightarrow Z})} & & \left(F^{B}\rightarrow F^{Z}\right) } \] @@ -1719,7 +1716,7 @@ can be defined similarly: \begin_inset Formula \[ -\text{fmap}_{3}\,f^{A\Rightarrow B\Rightarrow C\Rightarrow Z}=\text{fmap}\,f\bef\text{ap}\bef\text{fmap}_{F^{B}\Rightarrow?}\text{ap} +\text{fmap}_{3}\,f^{A\rightarrow B\rightarrow C\rightarrow Z}=\text{fmap}\,f\bef\text{ap}\bef\text{fmap}_{F^{B}\rightarrow?}\text{ap} \] \end_inset @@ -1727,8 +1724,8 @@ can be defined similarly: \begin_inset Formula \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{B\Rightarrow C\Rightarrow Z}\ar[r]\sp(0.45){\text{ap}^{[B,C\Rightarrow Z]}} & \left(F^{B}\Rightarrow F^{C\Rightarrow Z}\right)\ar[rd]\sp(0.55){\text{fmap}_{F^{B}\Rightarrow?}\text{ap}^{[C,Z]}}\\ -F^{A}\ar[ru]\sp(0.45){\text{fmap}\,f}\ar[rrr]\sb(0.45){\text{fmap}_{3}\,(f^{A\Rightarrow B\Rightarrow C\Rightarrow Z})} & & & \left(F^{B}\Rightarrow F^{C}\Rightarrow F^{Z}\right) +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{B\rightarrow C\rightarrow Z}\ar[r]\sp(0.45){\text{ap}^{[B,C\rightarrow Z]}} & \left(F^{B}\rightarrow F^{C\rightarrow Z}\right)\ar[rd]\sp(0.55){\text{fmap}_{F^{B}\rightarrow?}\text{ap}^{[C,Z]}}\\ +F^{A}\ar[ru]\sp(0.45){\text{fmap}\,f}\ar[rrr]\sb(0.45){\text{fmap}_{3}\,(f^{A\rightarrow B\rightarrow C\rightarrow Z})} & & & \left(F^{B}\rightarrow F^{C}\rightarrow F^{Z}\right) } \] @@ -1741,7 +1738,7 @@ F^{A}\ar[ru]\sp(0.45){\text{fmap}\,f}\ar[rrr]\sb(0.45){\text{fmap}_{3}\,(f^{A\Ri Using the infix syntax will get rid of \size footnotesize -\begin_inset Formula $\text{fmap}_{F^{B}\Rightarrow?}\text{ap}$ +\begin_inset Formula $\text{fmap}_{F^{B}\rightarrow?}\text{ap}$ \end_inset @@ -1785,11 +1782,11 @@ map2 \begin_layout Itemize The types -\begin_inset Formula $A\Rightarrow B\Rightarrow C$ +\begin_inset Formula $A\rightarrow B\rightarrow C$ \end_inset and -\begin_inset Formula $A\times B\Rightarrow C$ +\begin_inset Formula $A\times B\rightarrow C$ \end_inset are equivalent (curry/uncurry) @@ -1802,7 +1799,7 @@ Uncurry \end_inset to -\begin_inset Formula $\text{fmap2}:\left(A\times B\Rightarrow C\right)\Rightarrow F^{A}\times F^{B}\Rightarrow F^{C}$ +\begin_inset Formula $\text{fmap2}:\left(A\times B\rightarrow C\right)\rightarrow F^{A}\times F^{B}\rightarrow F^{C}$ \end_inset @@ -1814,13 +1811,13 @@ Compute \end_inset with -\begin_inset Formula $f=\text{id}^{A\times B\Rightarrow A\times B}$ +\begin_inset Formula $f=\text{id}^{A\times B\rightarrow A\times B}$ \end_inset , expecting to obtain a simpler natural transformation: \begin_inset Formula \[ -\text{zip}:F^{A}\times F^{B}\Rightarrow F^{A\times B} +\text{zip}:F^{A}\times F^{B}\rightarrow F^{A\times B} \] \end_inset @@ -1875,7 +1872,7 @@ fmap2 \begin_inset Formula \begin{align*} \text{zip} & =\text{fmap2}\left(\text{id}\right)\\ -\text{fmap2}\,(f^{A\times B\Rightarrow C}) & =\text{zip}\bef\text{fmap}\,f +\text{fmap2}\,(f^{A\times B\rightarrow C}) & =\text{zip}\bef\text{fmap}\,f \end{align*} \end_inset @@ -1883,8 +1880,8 @@ fmap2 \begin_inset Formula \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{A\times B}\ar[rd]\sp(0.65){\ \ \text{fmap}\,f^{A\times B\Rightarrow C}}\\ -F^{A}\times F^{B}\ar[ru]\sp(0.5){\text{zip}}\ar[rr]\sb(0.6){\text{fmap2}\,(f^{A\times B\Rightarrow C})} & & F^{C} +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{A\times B}\ar[rd]\sp(0.65){\ \ \text{fmap}\,f^{A\times B\rightarrow C}}\\ +F^{A}\times F^{B}\ar[ru]\sp(0.5){\text{zip}}\ar[rr]\sb(0.6){\text{fmap2}\,(f^{A\times B\rightarrow C})} & & F^{C} } \] @@ -1961,11 +1958,11 @@ vspace{-0.2cm} \end_inset Set -\begin_inset Formula $A\equiv B\Rightarrow C$ +\begin_inset Formula $A\equiv B\rightarrow C$ \end_inset , get -\begin_inset Formula $\text{zip}^{[B\Rightarrow C,B]}:F^{B\Rightarrow C}\times F^{B}\Rightarrow F^{(B\Rightarrow C)\times B}$ +\begin_inset Formula $\text{zip}^{[B\rightarrow C,B]}:F^{B\rightarrow C}\times F^{B}\rightarrow F^{(B\rightarrow C)\times B}$ \end_inset @@ -1982,11 +1979,11 @@ eval \size default \color inherit -\begin_inset Formula $:\left(B\Rightarrow C\right)\times B\Rightarrow C$ +\begin_inset Formula $:\left(B\rightarrow C\right)\times B\rightarrow C$ \end_inset and -\begin_inset Formula $\text{fmap}\left(\text{eval}\right):F^{(B\Rightarrow C)\times B}\Rightarrow F^{C}$ +\begin_inset Formula $\text{fmap}\left(\text{eval}\right):F^{(B\rightarrow C)\times B}\rightarrow F^{C}$ \end_inset @@ -2002,7 +1999,7 @@ app \size default \color inherit -\begin_inset Formula $\text{}^{[B,C]}:F^{B\Rightarrow C}\times F^{B}\Rightarrow F^{C}\equiv\text{zip}\bef\text{fmap}\left(\text{eval}\right)$ +\begin_inset Formula $\text{}^{[B,C]}:F^{B\rightarrow C}\times F^{B}\rightarrow F^{C}\equiv\text{zip}\bef\text{fmap}\left(\text{eval}\right)$ \end_inset @@ -2031,7 +2028,7 @@ app \begin_deeper \begin_layout Itemize use -\begin_inset Formula $\text{pair}:\left(A\Rightarrow B\Rightarrow A\times B\right)=a^{A}\Rightarrow b^{B}\Rightarrow a\times b$ +\begin_inset Formula $\text{pair}:\left(A\rightarrow B\rightarrow A\times B\right)=a^{A}\rightarrow b^{B}\rightarrow a\times b$ \end_inset @@ -2047,7 +2044,7 @@ use \end_inset , get -\begin_inset Formula $(\text{pair}^{\uparrow}fa):F^{B\Rightarrow A\times B}$ +\begin_inset Formula $(\text{pair}^{\uparrow}fa):F^{B\rightarrow A\times B}$ \end_inset ; then @@ -2056,7 +2053,7 @@ use \begin_inset Formula \begin{align*} \text{zip}\left(fa\times fb\right) & =\text{app}\left((\text{pair}^{\uparrow}fa)\times fb\right)\\ -\text{app}^{[B,C]} & =\text{zip}^{[B\Rightarrow C,B]}\bef\text{fmap}\left(\text{eval}\right) +\text{app}^{[B,C]} & =\text{zip}^{[B\rightarrow C,B]}\bef\text{fmap}\left(\text{eval}\right) \end{align*} \end_inset @@ -2066,8 +2063,8 @@ use \begin_inset Formula \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{(B\Rightarrow C)\times B}\ar[rd]\sp(0.65){\ \ \text{fmap}\left(\text{eval}\right)}\\ -F^{B\Rightarrow C}\times F^{B}\ar[ru]\sp(0.5){\text{zip}}\ar[rr]\sb(0.55){\text{app}^{[B,C]}} & & F^{C} +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{(B\rightarrow C)\times B}\ar[rd]\sp(0.65){\ \ \text{fmap}\left(\text{eval}\right)}\\ +F^{B\rightarrow C}\times F^{B}\ar[ru]\sp(0.5){\text{zip}}\ar[rr]\sb(0.55){\text{app}^{[B,C]}} & & F^{C} } \] @@ -2079,11 +2076,11 @@ F^{B\Rightarrow C}\times F^{B}\ar[ru]\sp(0.5){\text{zip}}\ar[rr]\sb(0.55){\text{ \end_deeper \begin_layout Itemize Rewrite this using curried arguments: -\begin_inset Formula $\text{fzip}^{[A,B]}:F^{A}\Rightarrow F^{B}\Rightarrow F^{A\times B}$ +\begin_inset Formula $\text{fzip}^{[A,B]}:F^{A}\rightarrow F^{B}\rightarrow F^{A\times B}$ \end_inset ; -\begin_inset Formula $\text{ap}^{[B,C]}:F^{B\Rightarrow C}\Rightarrow F^{B}\Rightarrow F^{C}$ +\begin_inset Formula $\text{ap}^{[B,C]}:F^{B\rightarrow C}\rightarrow F^{B}\rightarrow F^{C}$ \end_inset ; then @@ -2109,7 +2106,7 @@ Now . With explicit types: -\begin_inset Formula $\text{fzip}^{[A,B]}=\text{pair}^{\uparrow}\bef\text{ap}^{[B,A\Rightarrow B]}$ +\begin_inset Formula $\text{fzip}^{[A,B]}=\text{pair}^{\uparrow}\bef\text{ap}^{[B,A\rightarrow B]}$ \end_inset . @@ -2274,7 +2271,7 @@ map2 ( \size footnotesize \color blue ) { (x, y) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset g(x, y) } @@ -2525,7 +2522,7 @@ map2(cont1.map(f), cont2)(g) \size footnotesize \color blue = map2(cont1, cont2){ (x, y) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset g(f(x), y) } @@ -2561,7 +2558,7 @@ map2(cont1, cont2.map(f))(g) \size footnotesize \color blue = map2(cont1, cont2){ (x, y) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset g(x, f(y)) } @@ -2858,7 +2855,7 @@ vspace{-0.1cm} \size footnotesize \color blue map2(cont1, map2(cont2, cont3)((_,_)){ case(x,(y,z)) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset g(x,y,z)} @@ -2871,7 +2868,7 @@ g(x,y,z)} \size footnotesize \color blue = map2(map2(cont1, cont2)((_,_)), cont3){ case((x,y),z)) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset g(x,y,z)} @@ -3064,7 +3061,7 @@ vspace{-0.1cm} \size footnotesize \color blue map2(pure(a), cont)(g) = cont.map { y -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset g(a, y) } @@ -3080,7 +3077,7 @@ map2(pure(a), cont)(g) = cont.map { y \size footnotesize \color blue map2(cont, pure(b))(g) = cont.map { x -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset g(x, b) } @@ -3134,7 +3131,7 @@ map2 in a short notation; here \size footnotesize -\begin_inset Formula $f\otimes g\equiv\left\{ a\times b\Rightarrow f(a)\times g(b)\right\} $ +\begin_inset Formula $f\otimes g\equiv\left\{ a\times b\rightarrow f(a)\times g(b)\right\} $ \end_inset @@ -3144,11 +3141,11 @@ map2 \begin_inset Formula \begin{align*} -\text{fmap2}\left(g^{A\times B\Rightarrow C}\right)\left(f^{\uparrow}q_{1}\times q_{2}\right) & =\text{fmap2}\left(\left(f\otimes\text{id}\right)\bef g\right)\left(q_{1}\times q_{2}\right)\\ -\text{fmap2}\left(g^{A\times B\Rightarrow C}\right)\left(q_{1}\times f^{\uparrow}q_{2}\right) & =\text{fmap2}\left(\left(\text{id}\otimes f\right)\bef g\right)\left(q_{1}\times q_{2}\right)\\ +\text{fmap2}\left(g^{A\times B\rightarrow C}\right)\left(f^{\uparrow}q_{1}\times q_{2}\right) & =\text{fmap2}\left(\left(f\otimes\text{id}\right)\bef g\right)\left(q_{1}\times q_{2}\right)\\ +\text{fmap2}\left(g^{A\times B\rightarrow C}\right)\left(q_{1}\times f^{\uparrow}q_{2}\right) & =\text{fmap2}\left(\left(\text{id}\otimes f\right)\bef g\right)\left(q_{1}\times q_{2}\right)\\ \text{fmap2}\left(g_{1.23}\right)\left(q_{1}\times\text{fmap2}\left(\text{id}\right)\left(q_{2}\times q_{3}\right)\right) & =\text{fmap2}\left(g_{12.3}\right)\left(\text{fmap2}\left(\text{id}\right)\left(q_{1}\times q_{2}\right)\times q_{3}\right)\\ -\text{fmap2}\left(g^{A\times B\Rightarrow C}\right)\left(\text{pure}\,a^{A}\times q_{2}^{F^{B}}\right) & =\left(b\Rightarrow g\left(a\times b\right)\right)^{\uparrow}q_{2}\\ -\text{fmap2}\left(g^{A\times B\Rightarrow C}\right)\left(q_{1}^{F^{A}}\times\text{pure}\,b^{B}\right) & =\left(a\Rightarrow g\left(a\times b\right)\right)^{\uparrow}q_{1} +\text{fmap2}\left(g^{A\times B\rightarrow C}\right)\left(\text{pure}\,a^{A}\times q_{2}^{F^{B}}\right) & =\left(b\rightarrow g\left(a\times b\right)\right)^{\uparrow}q_{2}\\ +\text{fmap2}\left(g^{A\times B\rightarrow C}\right)\left(q_{1}^{F^{A}}\times\text{pure}\,b^{B}\right) & =\left(a\rightarrow g\left(a\times b\right)\right)^{\uparrow}q_{1} \end{align*} \end_inset @@ -3179,8 +3176,8 @@ zip \begin_inset Formula \begin{align*} -\text{fmap}_{2}\,g^{A\times B\Rightarrow C}\left(q_{1}^{F^{A}}\times q_{2}^{F^{B}}\right) & \equiv\left(\text{zip}\bef g^{\uparrow}\right)\left(q_{1}\times q_{2}\right)\\ -\text{fmap}_{2}\,g^{A\times B\Rightarrow C} & \equiv\text{zip}\bef g^{\uparrow} +\text{fmap}_{2}\,g^{A\times B\rightarrow C}\left(q_{1}^{F^{A}}\times q_{2}^{F^{B}}\right) & \equiv\left(\text{zip}\bef g^{\uparrow}\right)\left(q_{1}\times q_{2}\right)\\ +\text{fmap}_{2}\,g^{A\times B\rightarrow C} & \equiv\text{zip}\bef g^{\uparrow} \end{align*} \end_inset @@ -3412,7 +3409,7 @@ the left identity: \begin_inset Formula \[ -g^{\uparrow}\left(\text{zip}\left(\text{pure}\,a\times q\right)\right)=\left(b\Rightarrow g\left(a\times b\right)\right)^{\uparrow}q +g^{\uparrow}\left(\text{zip}\left(\text{pure}\,a\times q\right)\right)=\left(b\rightarrow g\left(a\times b\right)\right)^{\uparrow}q \] \end_inset @@ -3456,7 +3453,7 @@ F[Unit] \begin_inset Formula \[ -\text{wu}^{F^{1}}\equiv\text{pure}\left(1\right);\quad\text{pure}(a^{A})=\left(1\Rightarrow a\right)^{\uparrow}\text{wu} +\text{wu}^{F^{1}}\equiv\text{pure}\left(1\right);\quad\text{pure}(a^{A})=\left(1\rightarrow a\right)^{\uparrow}\text{wu} \] \end_inset @@ -3468,7 +3465,7 @@ Then the left identity law can be simplified using left naturality: \begin_inset Formula \[ -g^{\uparrow}\left(\text{zip}\left((\left(1\Rightarrow a\right)^{\uparrow}\text{wu})\times q\right)\right)=g^{\uparrow}\left(\left((1\Rightarrow a)\otimes\text{id}\right)^{\uparrow}\text{zip}\left(\text{wu}\times q\right)\right) +g^{\uparrow}\left(\text{zip}\left((\left(1\rightarrow a\right)^{\uparrow}\text{wu})\times q\right)\right)=g^{\uparrow}\left(\left((1\rightarrow a)\otimes\text{id}\right)^{\uparrow}\text{zip}\left(\text{wu}\times q\right)\right) \] \end_inset @@ -3480,7 +3477,7 @@ g^{\uparrow}\left(\text{zip}\left((\left(1\Rightarrow a\right)^{\uparrow}\text{w Denote \size footnotesize -\begin_inset Formula $\phi^{B\Rightarrow1\times B}\equiv b\Rightarrow1\times b$ +\begin_inset Formula $\phi^{B\rightarrow1\times B}\equiv b\rightarrow1\times b$ \end_inset @@ -3488,7 +3485,7 @@ Denote and \size footnotesize -\begin_inset Formula $\beta_{a}^{1\times B\Rightarrow A\times B}\equiv\left(1\Rightarrow a\right)\otimes\text{id}$ +\begin_inset Formula $\beta_{a}^{1\times B\rightarrow A\times B}\equiv\left(1\rightarrow a\right)\otimes\text{id}$ \end_inset @@ -3496,7 +3493,7 @@ Denote ; then the function \size footnotesize -\begin_inset Formula $b\Rightarrow g\left(a\times b\right)$ +\begin_inset Formula $b\rightarrow g\left(a\times b\right)$ \end_inset @@ -4116,7 +4113,7 @@ lifting since it has type \size footnotesize -\begin_inset Formula $F^{A\Rightarrow B}\Rightarrow\left(F^{A}\Rightarrow F^{B}\right)$ +\begin_inset Formula $F^{A\rightarrow B}\rightarrow\left(F^{A}\rightarrow F^{B}\right)$ \end_inset @@ -4146,11 +4143,11 @@ identity \end_inset value of type -\begin_inset Formula $F^{A\Rightarrow A}$ +\begin_inset Formula $F^{A\rightarrow A}$ \end_inset , mapped to -\begin_inset Formula $\text{id}^{F^{A}\Rightarrow F^{A}}$ +\begin_inset Formula $\text{id}^{F^{A}\rightarrow F^{A}}$ \end_inset by @@ -4167,7 +4164,7 @@ ap \begin_deeper \begin_layout Itemize A good candidate for that value is -\begin_inset Formula $\text{id}_{\odot}\equiv\text{pure}\left(\text{id}^{A\Rightarrow A}\right)$ +\begin_inset Formula $\text{id}_{\odot}\equiv\text{pure}\left(\text{id}^{A\rightarrow A}\right)$ \end_inset @@ -4184,15 +4181,15 @@ composition \end_inset of an -\begin_inset Formula $F^{A\Rightarrow B}$ +\begin_inset Formula $F^{A\rightarrow B}$ \end_inset and an -\begin_inset Formula $F^{B\Rightarrow C}$ +\begin_inset Formula $F^{B\rightarrow C}$ \end_inset , yielding an -\begin_inset Formula $F^{A\Rightarrow C}$ +\begin_inset Formula $F^{A\rightarrow C}$ \end_inset @@ -4215,7 +4212,7 @@ map2 : \begin_inset Formula \[ -g^{F^{A\Rightarrow B}}\odot h^{F^{B\Rightarrow C}}\equiv\text{fmap2}\,(p^{A\Rightarrow B}\times q^{B\Rightarrow C}\Rightarrow p\bef q)\left(g,h\right) +g^{F^{A\rightarrow B}}\odot h^{F^{B\rightarrow C}}\equiv\text{fmap2}\,(p^{A\rightarrow B}\times q^{B\rightarrow C}\rightarrow p\bef q)\left(g,h\right) \] \end_inset @@ -4244,9 +4241,9 @@ map2 \begin_inset Formula \begin{align*} \text{id}_{\odot}\odot h=h; & \quad g\odot\text{id}_{\odot}=g\\ -g^{F^{A\Rightarrow B}}\odot(h^{F^{B\Rightarrow C}}\odot k^{F^{C\Rightarrow D}}) & =\left(g\odot h\right)\odot k\\ -\left((x^{B\Rightarrow C}\Rightarrow f^{A\Rightarrow B}\bef x)^{\uparrow}g^{F^{B\Rightarrow C}}\right)\odot h^{F^{C\Rightarrow D}} & =(x^{B\Rightarrow D}\Rightarrow f^{A\Rightarrow B}\bef x)^{\uparrow}\left(g\odot h\right)\\ -g^{F^{A\Rightarrow B}}\odot\left((x^{B\Rightarrow C}\Rightarrow x\bef f^{C\Rightarrow D})^{\uparrow}h^{F^{B\Rightarrow C}}\right) & =(x^{A\Rightarrow C}\Rightarrow x\bef f^{C\Rightarrow D})^{\uparrow}\left(g\odot h\right) +g^{F^{A\rightarrow B}}\odot(h^{F^{B\rightarrow C}}\odot k^{F^{C\rightarrow D}}) & =\left(g\odot h\right)\odot k\\ +\left((x^{B\rightarrow C}\rightarrow f^{A\rightarrow B}\bef x)^{\uparrow}g^{F^{B\rightarrow C}}\right)\odot h^{F^{C\rightarrow D}} & =(x^{B\rightarrow D}\rightarrow f^{A\rightarrow B}\bef x)^{\uparrow}\left(g\odot h\right)\\ +g^{F^{A\rightarrow B}}\odot\left((x^{B\rightarrow C}\rightarrow x\bef f^{C\rightarrow D})^{\uparrow}h^{F^{B\rightarrow C}}\right) & =(x^{A\rightarrow C}\rightarrow x\bef f^{C\rightarrow D})^{\uparrow}\left(g\odot h\right) \end{align*} \end_inset @@ -4264,7 +4261,7 @@ category \begin_deeper \begin_layout Itemize The morphism type is -\begin_inset Formula $A\rightsquigarrow B\equiv F^{A\Rightarrow B}$ +\begin_inset Formula $A\rightsquigarrow B\equiv F^{A\rightarrow B}$ \end_inset , the composition is @@ -4378,7 +4375,7 @@ map2 \end_inset slide 7: -\begin_inset Formula $\text{id}_{\odot}\odot h=\text{fmap2}\left(p\times q\Rightarrow p\bef q\right)\left(\text{pure}\left(\text{id}\right)\times h\right)=\left(b\Rightarrow\text{id}\bef b\right)^{\uparrow}h=h$ +\begin_inset Formula $\text{id}_{\odot}\odot h=\text{fmap2}\left(p\times q\rightarrow p\bef q\right)\left(\text{pure}\left(\text{id}\right)\times h\right)=\left(b\rightarrow\text{id}\bef b\right)^{\uparrow}h=h$ \end_inset @@ -4415,8 +4412,8 @@ Associativity law: \begin_inset Formula \begin{align*} -g\odot\left(h\odot k\right) & =\text{fmap2}\left(x\times\left(y\times z\right)\Rightarrow x\bef y\bef z\right)\left(g\times\text{fmap2}\left(\text{id}\right)\left(h\times k\right)\right)\\ -\left(g\odot h\right)\odot k & =\text{fmap2}\left(\left(x\times y\right)\times z\Rightarrow x\bef y\bef z\right)\left(\text{fmap2}\left(\text{id}\right)\left(g\times h\right)\times k\right) +g\odot\left(h\odot k\right) & =\text{fmap2}\left(x\times\left(y\times z\right)\rightarrow x\bef y\bef z\right)\left(g\times\text{fmap2}\left(\text{id}\right)\left(h\times k\right)\right)\\ +\left(g\odot h\right)\odot k & =\text{fmap2}\left(\left(x\times y\right)\times z\rightarrow x\bef y\bef z\right)\left(\text{fmap2}\left(\text{id}\right)\left(g\times h\right)\times k\right) \end{align*} \end_inset @@ -4456,11 +4453,11 @@ Derive naturality laws for naturality laws: \size footnotesize -\begin_inset Formula $\left((x\Rightarrow f\bef x)^{\uparrow}g\right)\odot h=\text{fmap2}\left(\bef\right)\left((x\Rightarrow f\bef x)^{\uparrow}g\times h\right)=$ +\begin_inset Formula $\left((x\rightarrow f\bef x)^{\uparrow}g\right)\odot h=\text{fmap2}\left(\bef\right)\left((x\rightarrow f\bef x)^{\uparrow}g\times h\right)=$ \end_inset -\begin_inset Formula $\text{fmap2}\left(x\times y\Rightarrow f\bef x\bef y\right)\left(g\times h\right)=\left(x\Rightarrow f\bef x\right)^{\uparrow}\left(\text{fmap2}\left(\bef\right)\left(g\times h\right)\right)=\left(x\Rightarrow f\bef x\right)^{\uparrow}\left(g\odot h\right)$ +\begin_inset Formula $\text{fmap2}\left(x\times y\rightarrow f\bef x\bef y\right)\left(g\times h\right)=\left(x\rightarrow f\bef x\right)^{\uparrow}\left(\text{fmap2}\left(\bef\right)\left(g\times h\right)\right)=\left(x\rightarrow f\bef x\right)^{\uparrow}\left(g\odot h\right)$ \end_inset @@ -4470,7 +4467,7 @@ Derive naturality laws for The law is \size footnotesize -\begin_inset Formula $g\odot(x\Rightarrow x\bef f)^{\uparrow}h=(x\Rightarrow x\bef f)^{\uparrow}\left(g\odot h\right)$ +\begin_inset Formula $g\odot(x\rightarrow x\bef f)^{\uparrow}h=(x\rightarrow x\bef f)^{\uparrow}\left(g\odot h\right)$ \end_inset @@ -4526,7 +4523,7 @@ ap laws: \begin_inset Formula \[ -\text{ap}^{[B,Z]}:F^{B\Rightarrow Z}\Rightarrow F^{B}\Rightarrow F^{Z}=\text{fmap}_{2}\left(\text{id}^{\left(B\Rightarrow Z\right)\Rightarrow\left(B\Rightarrow Z\right)}\right) +\text{ap}^{[B,Z]}:F^{B\rightarrow Z}\rightarrow F^{B}\rightarrow F^{Z}=\text{fmap}_{2}\left(\text{id}^{\left(B\rightarrow Z\right)\rightarrow\left(B\rightarrow Z\right)}\right) \] \end_inset @@ -4536,7 +4533,7 @@ ap \begin_layout Standard Identity law: -\begin_inset Formula $\text{ap}\left(\text{id}_{\odot}\right)=\text{id}^{F^{A}\Rightarrow F^{A}}$ +\begin_inset Formula $\text{ap}\left(\text{id}_{\odot}\right)=\text{id}^{F^{A}\rightarrow F^{A}}$ \end_inset @@ -4546,7 +4543,7 @@ Identity law: Derivation: \size footnotesize -\begin_inset Formula $\text{ap}\,(\text{id}_{\odot}^{F^{A\Rightarrow A}})\,(q^{F^{A}})=\text{fmap}_{2}(\text{id}^{\left(A\Rightarrow A\right)\Rightarrow A\Rightarrow A})\,(\text{pure}\,(\text{id}^{A\Rightarrow A}))\,(q^{F^{A}})=$ +\begin_inset Formula $\text{ap}\,(\text{id}_{\odot}^{F^{A\rightarrow A}})\,(q^{F^{A}})=\text{fmap}_{2}(\text{id}^{\left(A\rightarrow A\right)\rightarrow A\rightarrow A})\,(\text{pure}\,(\text{id}^{A\rightarrow A}))\,(q^{F^{A}})=$ \end_inset @@ -4554,11 +4551,11 @@ Derivation: \size footnotesize -\begin_inset Formula $\text{fmap2}\left(f\times x\Rightarrow f(x)\right)\left(\text{pure}\left(\text{id}\right)\times q\right)=$ +\begin_inset Formula $\text{fmap2}\left(f\times x\rightarrow f(x)\right)\left(\text{pure}\left(\text{id}\right)\times q\right)=$ \end_inset -\begin_inset Formula $\left(x\Rightarrow\text{id}(x)\right)^{\uparrow}q=\text{id}^{\uparrow}q=q$ +\begin_inset Formula $\left(x\rightarrow\text{id}(x)\right)^{\uparrow}q=\text{id}^{\uparrow}q=q$ \end_inset @@ -4585,7 +4582,7 @@ Easier derivation: first, express \begin_inset Formula \[ -A\cong1\Rightarrow A;\quad F^{A}\cong F^{1\Rightarrow A} +A\cong1\rightarrow A;\quad F^{A}\cong F^{1\rightarrow A} \] \end_inset @@ -4595,7 +4592,7 @@ A\cong1\Rightarrow A;\quad F^{A}\cong F^{1\Rightarrow A} Then \size footnotesize -\begin_inset Formula $\text{ap}\,(p^{F^{B\Rightarrow Z}})\,(q^{F^{B}})\cong q^{F^{1\Rightarrow B}}\odot p^{F^{B\Rightarrow Z}}$ +\begin_inset Formula $\text{ap}\,(p^{F^{B\rightarrow Z}})\,(q^{F^{B}})\cong q^{F^{1\rightarrow B}}\odot p^{F^{B\rightarrow Z}}$ \end_inset @@ -4759,7 +4756,7 @@ free monad \end_layout \begin_layout Enumerate -\begin_inset Formula $F^{A}\equiv H^{A}\Rightarrow A$ +\begin_inset Formula $F^{A}\equiv H^{A}\rightarrow A$ \end_inset for @@ -4820,7 +4817,7 @@ Constructions that do not correspond to monadic ones: \begin_layout Itemize Applicative that disagrees with its monad: -\begin_inset Formula $F^{A}\equiv1+\left(1\Rightarrow A\times F^{A}\right)$ +\begin_inset Formula $F^{A}\equiv1+\left(1\rightarrow A\times F^{A}\right)$ \end_inset @@ -4828,11 +4825,11 @@ Applicative that disagrees with its monad: \begin_layout Itemize Examples of non-applicative functors: -\begin_inset Formula $F^{A}\equiv\left(P\Rightarrow A\right)+\left(Q\Rightarrow A\right)$ +\begin_inset Formula $F^{A}\equiv\left(P\rightarrow A\right)+\left(Q\rightarrow A\right)$ \end_inset , -\begin_inset Formula $F^{A}\equiv\left(A\Rightarrow P\right)\Rightarrow Q$ +\begin_inset Formula $F^{A}\equiv\left(A\rightarrow P\right)\rightarrow Q$ \end_inset , @@ -4840,7 +4837,7 @@ Examples of non-applicative functors: \end_inset -\begin_inset Formula $F^{A}\equiv\left(A\Rightarrow P\right)\Rightarrow1+A$ +\begin_inset Formula $F^{A}\equiv\left(A\rightarrow P\right)\rightarrow1+A$ \end_inset @@ -4884,7 +4881,7 @@ Using known monoid constructions (Chapter \end_inset , -\begin_inset Formula $X\Rightarrow Y$ +\begin_inset Formula $X\rightarrow Y$ \end_inset as monoids when @@ -5014,7 +5011,7 @@ Therefore, all exponential-polynomial types without type parameters are Example of an exponential-polynomial type without type parameters: \size footnotesize -\begin_inset Formula $\text{Int}+\text{String}\times\text{String}\times\left(\text{Int}\Rightarrow\text{Bool}\right)+\left(\text{Bool}\times\text{String}\Rightarrow1+\text{String}\right)$ +\begin_inset Formula $\text{Int}+\text{String}\times\text{String}\times\left(\text{Int}\rightarrow\text{Bool}\right)+\left(\text{Bool}\times\text{String}\rightarrow1+\text{String}\right)$ \end_inset @@ -5024,7 +5021,7 @@ Example of an exponential-polynomial type without type parameters: \begin_layout Itemize Example of a non-monoid type with type parameters: -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset @@ -5166,7 +5163,7 @@ wu \begin_inset Formula \[ -\text{zip}:C^{A}\times C^{B}\Rightarrow C^{A\times B};\quad\text{wu}:C^{1} +\text{zip}:C^{A}\times C^{B}\rightarrow C^{A\times B};\quad\text{wu}:C^{1} \] \end_inset @@ -5205,11 +5202,11 @@ contramap \size default \color inherit to the function -\begin_inset Formula $a\times b\Rightarrow a$ +\begin_inset Formula $a\times b\rightarrow a$ \end_inset will yield some -\begin_inset Formula $C^{A}\Rightarrow C^{A\times B}$ +\begin_inset Formula $C^{A}\rightarrow C^{A\times B}$ \end_inset , but this will @@ -5328,7 +5325,7 @@ Applicative contrafunctor constructions: \end_layout \begin_layout Enumerate -\begin_inset Formula $C^{A}\equiv H^{A}\Rightarrow G^{A}$ +\begin_inset Formula $C^{A}\equiv H^{A}\rightarrow G^{A}$ \end_inset for @@ -5416,11 +5413,11 @@ contramap Examples of profunctors: \size footnotesize -\begin_inset Formula $P^{A}\equiv1+\text{Int}\times A\Rightarrow A$ +\begin_inset Formula $P^{A}\equiv1+\text{Int}\times A\rightarrow A$ \end_inset ; -\begin_inset Formula $P^{A}\equiv A+\left(A\Rightarrow\text{String}\right)$ +\begin_inset Formula $P^{A}\equiv A+\left(A\rightarrow\text{String}\right)$ \end_inset @@ -5496,7 +5493,7 @@ xmap of type \size footnotesize -\begin_inset Formula $\left(A\Rightarrow B\right)\times\left(B\Rightarrow A\right)\Rightarrow(P^{A}\Rightarrow P^{B})$ +\begin_inset Formula $\left(A\rightarrow B\right)\times\left(B\rightarrow A\right)\rightarrow(P^{A}\rightarrow P^{B})$ \end_inset @@ -5602,7 +5599,7 @@ pure \size footnotesize -\begin_inset Formula $:A\Rightarrow P^{A}$ +\begin_inset Formula $:A\rightarrow P^{A}$ \end_inset @@ -5656,7 +5653,7 @@ Applicative profunctors admit all previous constructions, and in addition: \end_layout \begin_layout Enumerate -\begin_inset Formula $P^{A}\equiv F^{A}\Rightarrow Q^{A}$ +\begin_inset Formula $P^{A}\equiv F^{A}\rightarrow Q^{A}$ \end_inset for @@ -5681,7 +5678,7 @@ functor \begin_deeper \begin_layout Itemize Non-working construction: -\begin_inset Formula $P^{A}\equiv H^{A}\Rightarrow A$ +\begin_inset Formula $P^{A}\equiv H^{A}\rightarrow A$ \end_inset for a profunctor @@ -5780,7 +5777,7 @@ its arguments: \begin_inset Formula \[ -\left(a\times b\Rightarrow b\times a\right)^{\uparrow}\left(fa\bowtie fb\right)=fb\bowtie fa +\left(a\times b\rightarrow b\times a\right)^{\uparrow}\left(fa\bowtie fb\right)=fb\bowtie fa \] \end_inset @@ -5792,7 +5789,7 @@ or \end_inset , implicitly using the isomorphism -\begin_inset Formula $a\times b\Rightarrow b\times a$ +\begin_inset Formula $a\times b\rightarrow b\times a$ \end_inset @@ -5989,7 +5986,7 @@ functor \begin_layout Plain Layout \size scriptsize -\begin_inset Formula $\text{fmap}:\left(A\Rightarrow B\right)\Rightarrow F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $\text{fmap}:\left(A\rightarrow B\right)\rightarrow F^{A}\rightarrow F^{B}$ \end_inset @@ -6003,7 +6000,7 @@ functor \begin_layout Plain Layout \size scriptsize -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset @@ -6030,7 +6027,7 @@ filterable \begin_layout Plain Layout \size scriptsize -\begin_inset Formula $\text{fmapOpt}:\left(A\Rightarrow1+B\right)\Rightarrow F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $\text{fmapOpt}:\left(A\rightarrow1+B\right)\rightarrow F^{A}\rightarrow F^{B}$ \end_inset @@ -6044,7 +6041,7 @@ filterable \begin_layout Plain Layout \size scriptsize -\begin_inset Formula $A\Rightarrow1+B$ +\begin_inset Formula $A\rightarrow1+B$ \end_inset @@ -6071,7 +6068,7 @@ monad \begin_layout Plain Layout \size scriptsize -\begin_inset Formula $\text{flm}:\left(A\Rightarrow F^{B}\right)\Rightarrow F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $\text{flm}:\left(A\rightarrow F^{B}\right)\rightarrow F^{A}\rightarrow F^{B}$ \end_inset @@ -6085,7 +6082,7 @@ monad \begin_layout Plain Layout \size scriptsize -\begin_inset Formula $A\Rightarrow F^{B}$ +\begin_inset Formula $A\rightarrow F^{B}$ \end_inset @@ -6112,7 +6109,7 @@ applicative \begin_layout Plain Layout \size scriptsize -\begin_inset Formula $\text{ap}:F^{A\Rightarrow B}\Rightarrow F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $\text{ap}:F^{A\rightarrow B}\rightarrow F^{A}\rightarrow F^{B}$ \end_inset @@ -6126,7 +6123,7 @@ applicative \begin_layout Plain Layout \size scriptsize -\begin_inset Formula $F^{A\Rightarrow B}$ +\begin_inset Formula $F^{A\rightarrow B}$ \end_inset @@ -6153,7 +6150,7 @@ contrafunctor \begin_layout Plain Layout \size scriptsize -\begin_inset Formula $\text{contrafmap}:\left(B\Rightarrow A\right)\Rightarrow F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $\text{contrafmap}:\left(B\rightarrow A\right)\rightarrow F^{A}\rightarrow F^{B}$ \end_inset @@ -6167,7 +6164,7 @@ contrafunctor \begin_layout Plain Layout \size scriptsize -\begin_inset Formula $B\Rightarrow A$ +\begin_inset Formula $B\rightarrow A$ \end_inset @@ -6194,7 +6191,7 @@ profunctor \begin_layout Plain Layout \size scriptsize -\begin_inset Formula $\text{xmap}:\left(A\Rightarrow B\right)\times\left(B\Rightarrow A\right)\Rightarrow F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $\text{xmap}:\left(A\rightarrow B\right)\times\left(B\rightarrow A\right)\rightarrow F^{A}\rightarrow F^{B}$ \end_inset @@ -6208,7 +6205,7 @@ profunctor \begin_layout Plain Layout \size scriptsize -\begin_inset Formula $\left(A\Rightarrow B\right)\times\left(B\Rightarrow A\right)$ +\begin_inset Formula $\left(A\rightarrow B\right)\times\left(B\rightarrow A\right)$ \end_inset @@ -6235,7 +6232,7 @@ contra-filterable \begin_layout Plain Layout \size scriptsize -\begin_inset Formula $\text{contrafmapOpt}:\left(B\Rightarrow1+A\right)\Rightarrow F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $\text{contrafmapOpt}:\left(B\rightarrow1+A\right)\rightarrow F^{A}\rightarrow F^{B}$ \end_inset @@ -6249,7 +6246,7 @@ contra-filterable \begin_layout Plain Layout \size scriptsize -\begin_inset Formula $B\Rightarrow1+A$ +\begin_inset Formula $B\rightarrow1+A$ \end_inset @@ -6307,7 +6304,7 @@ comonad \begin_layout Plain Layout \size scriptsize -\begin_inset Formula $\text{coflm}:\left(F^{A}\Rightarrow B\right)\Rightarrow F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $\text{coflm}:\left(F^{A}\rightarrow B\right)\rightarrow F^{A}\rightarrow F^{B}$ \end_inset @@ -6321,7 +6318,7 @@ comonad \begin_layout Plain Layout \size scriptsize -\begin_inset Formula $F^{A}\Rightarrow B$ +\begin_inset Formula $F^{A}\rightarrow B$ \end_inset @@ -6422,7 +6419,7 @@ Use naturality of pure to show that \begin_layout Enumerate Show that -\begin_inset Formula $F^{A}\equiv\left(A\Rightarrow Z\right)\Rightarrow\left(1+A\right)$ +\begin_inset Formula $F^{A}\equiv\left(A\rightarrow Z\right)\rightarrow\left(1+A\right)$ \end_inset is a functor but not applicative. @@ -6478,7 +6475,7 @@ For any contrafunctor \end_inset , construction 5 says that -\begin_inset Formula $F^{A}\equiv H^{A}\Rightarrow A$ +\begin_inset Formula $F^{A}\equiv H^{A}\rightarrow A$ \end_inset is applicative. @@ -6537,11 +6534,11 @@ Show that, for any profunctor \end_inset , one can implement a function of type -\begin_inset Formula $A\Rightarrow P^{B}\Rightarrow P^{A\times B}$ +\begin_inset Formula $A\rightarrow P^{B}\rightarrow P^{A\times B}$ \end_inset but not of type -\begin_inset Formula $A\Rightarrow P^{B}\Rightarrow P^{A}$ +\begin_inset Formula $A\rightarrow P^{B}\rightarrow P^{A}$ \end_inset . diff --git a/sofp-src/sofp-applicative.tex b/sofp-src/sofp-applicative.tex index 7fcdc3d15..f0ed6f213 100644 --- a/sofp-src/sofp-applicative.tex +++ b/sofp-src/sofp-applicative.tex @@ -24,11 +24,11 @@ \subsection{Motivation for applicative functors} \end{minipage}\texttt{\textcolor{blue}{\footnotesize{}\hfill{}}}% \begin{minipage}[c][1\totalheight][t]{0.4\columnwidth}% \begin{lyxcode} -\textcolor{blue}{\footnotesize{}Future~\{~c1~\}.flatMap~\{~x~$\Rightarrow$}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}Future~\{~c1~\}.flatMap~\{~x~$\rightarrow$}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}~~Future~\{~c2~\}.flatMap~\{~y~$\Rightarrow$}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}~~Future~\{~c2~\}.flatMap~\{~y~$\rightarrow$}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}~~~~Future~\{~c3~\}.map~\{~z~$\Rightarrow$~...\}}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}~~~~Future~\{~c3~\}.map~\{~z~$\rightarrow$~...\}}{\footnotesize\par} \textcolor{blue}{\footnotesize{}\}~\}}{\footnotesize\par} \end{lyxcode} @@ -80,7 +80,7 @@ \subsection{Motivation for applicative functors} This can be done using a method \texttt{\textcolor{blue}{\footnotesize{}map2}}, \emph{not} defined via \texttt{\textcolor{blue}{\footnotesize{}flatMap}}: -the desired type signature is {\footnotesize{}$\text{map2}:F^{A}\times F^{B}\Rightarrow\left(A\times B\Rightarrow C\right)\Rightarrow F^{C}$} +the desired type signature is {\footnotesize{}$\text{map2}:F^{A}\times F^{B}\rightarrow\left(A\times B\rightarrow C\right)\rightarrow F^{C}$} \textbf{Applicative functor} has \texttt{\textcolor{blue}{\footnotesize{}map2}} and \texttt{\textcolor{blue}{\footnotesize{}pure}} but is not necessarily @@ -159,9 +159,9 @@ \subsection{Defining \texttt{\textcolor{blue}{\footnotesize{}map2}}, \texttt{\te Generalize from \texttt{\textcolor{blue}{\footnotesize{}map}}, \texttt{\textcolor{blue}{\footnotesize{}map2}}, \texttt{\textcolor{blue}{\footnotesize{}map3}} to \texttt{\textcolor{blue}{\footnotesize{}mapN}}: \begin{align*} -\text{map}_{1} & :F^{A}\Rightarrow\left(A\Rightarrow Z\right)\Rightarrow F^{Z}\\ -\text{map}_{2} & :F^{A}\times F^{B}\Rightarrow\left(A\times B\Rightarrow Z\right)\Rightarrow F^{Z}\\ -\text{map}_{3} & :F^{A}\times F^{B}\times F^{C}\Rightarrow\left(A\times B\times C\Rightarrow Z\right)\Rightarrow F^{Z} +\text{map}_{1} & :F^{A}\rightarrow\left(A\rightarrow Z\right)\rightarrow F^{Z}\\ +\text{map}_{2} & :F^{A}\times F^{B}\rightarrow\left(A\times B\rightarrow Z\right)\rightarrow F^{Z}\\ +\text{map}_{3} & :F^{A}\times F^{B}\times F^{C}\rightarrow\left(A\times B\times C\rightarrow Z\right)\rightarrow F^{Z} \end{align*} @@ -175,7 +175,7 @@ \subsection{Practical examples of using \texttt{\textcolor{blue}{\footnotesize{} $F^{A}\equiv$ \texttt{\textcolor{blue}{\footnotesize{}Future{[}A{]}}}: perform several computations concurrently -$F^{A}\equiv E\Rightarrow A$: pass standard arguments to functions +$F^{A}\equiv E\rightarrow A$: pass standard arguments to functions more easily $F^{A}\equiv\text{List}^{A}$: transposing a matrix by using \texttt{\textcolor{blue}{\footnotesize{}map2}} @@ -187,7 +187,7 @@ \subsection{Practical examples of using \texttt{\textcolor{blue}{\footnotesize{} parts implement \texttt{\textcolor{blue}{\footnotesize{}imap2}} for non-disjunctive -profunctors, e.g.\ $Z\times A\Rightarrow A\times A$ +profunctors, e.g.\ $Z\times A\rightarrow A\times A$ ``Fused \texttt{\textcolor{blue}{\footnotesize{}fold}}'': automatically merge several \texttt{\textcolor{blue}{\footnotesize{}fold}}s into @@ -217,11 +217,11 @@ \subsection{Exercises I } $F^{A}\equiv1+A+A\times A$ -$F^{A}\equiv E\Rightarrow A\times A$ +$F^{A}\equiv E\rightarrow A\times A$ -$F^{A}\equiv Z\times A\Rightarrow A$ +$F^{A}\equiv Z\times A\rightarrow A$ -$F^{A}\equiv A\Rightarrow A\times Z$ where $Z$ is a \texttt{\textcolor{blue}{\footnotesize{}Monoid}} +$F^{A}\equiv A\rightarrow A\times Z$ where $Z$ is a \texttt{\textcolor{blue}{\footnotesize{}Monoid}} Write a function that defines an instance of the \texttt{\textcolor{blue}{\footnotesize{}Monoid}} type class for a tuple $\left(A,B\right)$ whose parts already have @@ -252,20 +252,20 @@ \subsection{Deriving the \texttt{\textcolor{blue}{\footnotesize{}ap}} operation \vspace{-0.1cm}Can we avoid having to define $\text{map}_{n}$ separately for each $n$? \begin{itemize} -\item Use curried arguments, $\text{fmap}_{2}:(A\Rightarrow B\Rightarrow Z)\Rightarrow F^{A}\Rightarrow F^{B}\Rightarrow F^{Z}$ +\item Use curried arguments, $\text{fmap}_{2}:(A\rightarrow B\rightarrow Z)\rightarrow F^{A}\rightarrow F^{B}\rightarrow F^{Z}$ \begin{itemize} -\item Set $A\equiv\left(B\Rightarrow Z\right)$ and apply $\text{fmap}_{2}$ -to the identity $\text{id}^{\left(B\Rightarrow Z\right)\Rightarrow\left(B\Rightarrow Z\right)}$: -obtain $\text{ap}^{[B,Z]}:F^{B\Rightarrow Z}\Rightarrow F^{B}\Rightarrow F^{Z}\equiv\text{fmap}_{2}\left(\text{id}\right)$ +\item Set $A\equiv\left(B\rightarrow Z\right)$ and apply $\text{fmap}_{2}$ +to the identity $\text{id}^{\left(B\rightarrow Z\right)\rightarrow\left(B\rightarrow Z\right)}$: +obtain $\text{ap}^{[B,Z]}:F^{B\rightarrow Z}\rightarrow F^{B}\rightarrow F^{Z}\equiv\text{fmap}_{2}\left(\text{id}\right)$ \item The functions \texttt{\textcolor{blue}{\footnotesize{}fmap$_{2}$}} and \texttt{\textcolor{blue}{\footnotesize{}ap}} are computationally equivalent:{\footnotesize{} \[ -\text{fmap}_{2}\,f^{A\Rightarrow B\Rightarrow Z}=\text{fmap}\,f\bef\text{ap} +\text{fmap}_{2}\,f^{A\rightarrow B\rightarrow Z}=\text{fmap}\,f\bef\text{ap} \] \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{B\Rightarrow Z}\ar[rd]\sp(0.45){\text{ap}}\\ -F^{A}\ar[ru]\sp(0.45){\text{fmap}\,f}\ar[rr]\sb(0.45){\text{fmap}_{2}\,(f^{A\Rightarrow B\Rightarrow Z})} & & \left(F^{B}\Rightarrow F^{Z}\right) +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{B\rightarrow Z}\ar[rd]\sp(0.45){\text{ap}}\\ +F^{A}\ar[ru]\sp(0.45){\text{fmap}\,f}\ar[rr]\sb(0.45){\text{fmap}_{2}\,(f^{A\rightarrow B\rightarrow Z})} & & \left(F^{B}\rightarrow F^{Z}\right) } \] }{\footnotesize\par} @@ -273,15 +273,15 @@ \subsection{Deriving the \texttt{\textcolor{blue}{\footnotesize{}ap}} operation \texttt{\textcolor{blue}{\footnotesize{}fmap$_{4}$}} etc.\ can be defined similarly:{\footnotesize{} \[ -\text{fmap}_{3}\,f^{A\Rightarrow B\Rightarrow C\Rightarrow Z}=\text{fmap}\,f\bef\text{ap}\bef\text{fmap}_{F^{B}\Rightarrow?}\text{ap} +\text{fmap}_{3}\,f^{A\rightarrow B\rightarrow C\rightarrow Z}=\text{fmap}\,f\bef\text{ap}\bef\text{fmap}_{F^{B}\rightarrow?}\text{ap} \] \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{B\Rightarrow C\Rightarrow Z}\ar[r]\sp(0.45){\text{ap}^{[B,C\Rightarrow Z]}} & \left(F^{B}\Rightarrow F^{C\Rightarrow Z}\right)\ar[rd]\sp(0.55){\text{fmap}_{F^{B}\Rightarrow?}\text{ap}^{[C,Z]}}\\ -F^{A}\ar[ru]\sp(0.45){\text{fmap}\,f}\ar[rrr]\sb(0.45){\text{fmap}_{3}\,(f^{A\Rightarrow B\Rightarrow C\Rightarrow Z})} & & & \left(F^{B}\Rightarrow F^{C}\Rightarrow F^{Z}\right) +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{B\rightarrow C\rightarrow Z}\ar[r]\sp(0.45){\text{ap}^{[B,C\rightarrow Z]}} & \left(F^{B}\rightarrow F^{C\rightarrow Z}\right)\ar[rd]\sp(0.55){\text{fmap}_{F^{B}\rightarrow?}\text{ap}^{[C,Z]}}\\ +F^{A}\ar[ru]\sp(0.45){\text{fmap}\,f}\ar[rrr]\sb(0.45){\text{fmap}_{3}\,(f^{A\rightarrow B\rightarrow C\rightarrow Z})} & & & \left(F^{B}\rightarrow F^{C}\rightarrow F^{Z}\right) } \] }{\footnotesize\par} -\item Using the infix syntax will get rid of {\footnotesize{}$\text{fmap}_{F^{B}\Rightarrow?}\text{ap}$} +\item Using the infix syntax will get rid of {\footnotesize{}$\text{fmap}_{F^{B}\rightarrow?}\text{ap}$} (see example code) \begin{itemize} \item Note the pattern: a natural transformation is equivalent to a lifting @@ -293,14 +293,14 @@ \subsection{Deriving the \texttt{\textcolor{blue}{\footnotesize{}ap}} operation \subsection{Deriving the \texttt{\textcolor{blue}{\footnotesize{}zip}} operation from \texttt{\textcolor{blue}{\footnotesize{}map2}} } \begin{itemize} -\item The types $A\Rightarrow B\Rightarrow C$ and $A\times B\Rightarrow C$ +\item The types $A\rightarrow B\rightarrow C$ and $A\times B\rightarrow C$ are equivalent (curry/uncurry) \begin{itemize} -\item Uncurry $\text{fmap}_{2}$ to $\text{fmap2}:\left(A\times B\Rightarrow C\right)\Rightarrow F^{A}\times F^{B}\Rightarrow F^{C}$ -\item Compute $\text{fmap2}\left(f\right)$ with $f=\text{id}^{A\times B\Rightarrow A\times B}$, +\item Uncurry $\text{fmap}_{2}$ to $\text{fmap2}:\left(A\times B\rightarrow C\right)\rightarrow F^{A}\times F^{B}\rightarrow F^{C}$ +\item Compute $\text{fmap2}\left(f\right)$ with $f=\text{id}^{A\times B\rightarrow A\times B}$, expecting to obtain a simpler natural transformation: \[ -\text{zip}:F^{A}\times F^{B}\Rightarrow F^{A\times B} +\text{zip}:F^{A}\times F^{B}\rightarrow F^{A\times B} \] \item This is quite similar to \texttt{\textcolor{blue}{\footnotesize{}zip}} @@ -314,11 +314,11 @@ \subsection{Deriving the \texttt{\textcolor{blue}{\footnotesize{}zip}} operation are computationally equivalent:{\footnotesize{} \begin{align*} \text{zip} & =\text{fmap2}\left(\text{id}\right)\\ -\text{fmap2}\,(f^{A\times B\Rightarrow C}) & =\text{zip}\bef\text{fmap}\,f +\text{fmap2}\,(f^{A\times B\rightarrow C}) & =\text{zip}\bef\text{fmap}\,f \end{align*} \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{A\times B}\ar[rd]\sp(0.65){\ \ \text{fmap}\,f^{A\times B\Rightarrow C}}\\ -F^{A}\times F^{B}\ar[ru]\sp(0.5){\text{zip}}\ar[rr]\sb(0.6){\text{fmap2}\,(f^{A\times B\Rightarrow C})} & & F^{C} +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{A\times B}\ar[rd]\sp(0.65){\ \ \text{fmap}\,f^{A\times B\rightarrow C}}\\ +F^{A}\times F^{B}\ar[ru]\sp(0.5){\text{zip}}\ar[rr]\sb(0.6){\text{fmap2}\,(f^{A\times B\rightarrow C})} & & F^{C} } \] }{\footnotesize\par} @@ -334,35 +334,35 @@ \subsection{Deriving the \texttt{\textcolor{blue}{\footnotesize{}zip}} operation \subsection{{*} Equivalence of the operations \texttt{\textcolor{blue}{\footnotesize{}ap}} and \texttt{\textcolor{blue}{\footnotesize{}zip}} } \begin{itemize} -\item \vspace{-0.2cm}Set $A\equiv B\Rightarrow C$, get $\text{zip}^{[B\Rightarrow C,B]}:F^{B\Rightarrow C}\times F^{B}\Rightarrow F^{(B\Rightarrow C)\times B}$ +\item \vspace{-0.2cm}Set $A\equiv B\rightarrow C$, get $\text{zip}^{[B\rightarrow C,B]}:F^{B\rightarrow C}\times F^{B}\rightarrow F^{(B\rightarrow C)\times B}$ \begin{itemize} -\item Use \texttt{\textcolor{blue}{\footnotesize{}eval}} $:\left(B\Rightarrow C\right)\times B\Rightarrow C$ -and $\text{fmap}\left(\text{eval}\right):F^{(B\Rightarrow C)\times B}\Rightarrow F^{C}$ -\item Uncurry: \texttt{\textcolor{blue}{\footnotesize{}app}}$\text{}^{[B,C]}:F^{B\Rightarrow C}\times F^{B}\Rightarrow F^{C}\equiv\text{zip}\bef\text{fmap}\left(\text{eval}\right)$ +\item Use \texttt{\textcolor{blue}{\footnotesize{}eval}} $:\left(B\rightarrow C\right)\times B\rightarrow C$ +and $\text{fmap}\left(\text{eval}\right):F^{(B\rightarrow C)\times B}\rightarrow F^{C}$ +\item Uncurry: \texttt{\textcolor{blue}{\footnotesize{}app}}$\text{}^{[B,C]}:F^{B\rightarrow C}\times F^{B}\rightarrow F^{C}\equiv\text{zip}\bef\text{fmap}\left(\text{eval}\right)$ \item The functions \texttt{\textcolor{blue}{\footnotesize{}zip}} and \texttt{\textcolor{blue}{\footnotesize{}app}} are computationally equivalent: \begin{itemize} -\item use $\text{pair}:\left(A\Rightarrow B\Rightarrow A\times B\right)=a^{A}\Rightarrow b^{B}\Rightarrow a\times b$ +\item use $\text{pair}:\left(A\rightarrow B\rightarrow A\times B\right)=a^{A}\rightarrow b^{B}\rightarrow a\times b$ \item use $\text{fmap}\left(\text{pair}\right)\equiv\text{pair}^{\uparrow}$ -on an $fa^{F^{A}}$, get $(\text{pair}^{\uparrow}fa):F^{B\Rightarrow A\times B}$; +on an $fa^{F^{A}}$, get $(\text{pair}^{\uparrow}fa):F^{B\rightarrow A\times B}$; then{\footnotesize{} \begin{align*} \text{zip}\left(fa\times fb\right) & =\text{app}\left((\text{pair}^{\uparrow}fa)\times fb\right)\\ -\text{app}^{[B,C]} & =\text{zip}^{[B\Rightarrow C,B]}\bef\text{fmap}\left(\text{eval}\right) +\text{app}^{[B,C]} & =\text{zip}^{[B\rightarrow C,B]}\bef\text{fmap}\left(\text{eval}\right) \end{align*} } \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{(B\Rightarrow C)\times B}\ar[rd]\sp(0.65){\ \ \text{fmap}\left(\text{eval}\right)}\\ -F^{B\Rightarrow C}\times F^{B}\ar[ru]\sp(0.5){\text{zip}}\ar[rr]\sb(0.55){\text{app}^{[B,C]}} & & F^{C} +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{(B\rightarrow C)\times B}\ar[rd]\sp(0.65){\ \ \text{fmap}\left(\text{eval}\right)}\\ +F^{B\rightarrow C}\times F^{B}\ar[ru]\sp(0.5){\text{zip}}\ar[rr]\sb(0.55){\text{app}^{[B,C]}} & & F^{C} } \] \end{itemize} -\item Rewrite this using curried arguments: $\text{fzip}^{[A,B]}:F^{A}\Rightarrow F^{B}\Rightarrow F^{A\times B}$; -$\text{ap}^{[B,C]}:F^{B\Rightarrow C}\Rightarrow F^{B}\Rightarrow F^{C}$; +\item Rewrite this using curried arguments: $\text{fzip}^{[A,B]}:F^{A}\rightarrow F^{B}\rightarrow F^{A\times B}$; +$\text{ap}^{[B,C]}:F^{B\rightarrow C}\rightarrow F^{B}\rightarrow F^{C}$; then $\text{ap}\,f=\text{fzip}\,f\bef\text{fmap}\left(\text{eval}\right)$. \item Now $\text{fzip}\,p^{F^{A}}q^{F^{B}}=\text{ap}\left(\text{pair}^{\uparrow}p\right)q$, hence we may omit the argument $q$: $\text{fzip}=\text{pair}^{\uparrow}\bef\text{ap}$. -With explicit types: $\text{fzip}^{[A,B]}=\text{pair}^{\uparrow}\bef\text{ap}^{[B,A\Rightarrow B]}$. +With explicit types: $\text{fzip}^{[A,B]}=\text{pair}^{\uparrow}\bef\text{ap}^{[B,A\rightarrow B]}$. \end{itemize} \end{itemize} @@ -394,7 +394,7 @@ \subsection{Motivation for applicative laws. Naturality laws for \texttt{\textco \textcolor{blue}{\footnotesize{}~~cont2}{\footnotesize\par} -\textcolor{blue}{\footnotesize{})~\{~(x,~y)~$\Rightarrow$~g(x,~y)~\}}{\footnotesize\par} +\textcolor{blue}{\footnotesize{})~\{~(x,~y)~$\rightarrow$~g(x,~y)~\}}{\footnotesize\par} \end{lyxcode} % \end{minipage}\texttt{\textcolor{blue}{\footnotesize{}\hfill{}\medskip{} @@ -442,7 +442,7 @@ \subsection{Motivation for applicative laws. Naturality laws for \texttt{\textco \begin{lyxcode} \textcolor{blue}{\footnotesize{}map2(cont1.map(f),~cont2)(g)}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}~~=~map2(cont1,~cont2)\{~(x,~y)~$\Rightarrow$~g(f(x),~y)~\}}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}~~=~map2(cont1,~cont2)\{~(x,~y)~$\rightarrow$~g(f(x),~y)~\}}{\footnotesize\par} \end{lyxcode} \begin{itemize} \item \textbf{Right naturality} for \texttt{\textcolor{blue}{\footnotesize{}map2}}: @@ -450,7 +450,7 @@ \subsection{Motivation for applicative laws. Naturality laws for \texttt{\textco \begin{lyxcode} \textcolor{blue}{\footnotesize{}map2(cont1,~cont2.map(f))(g)}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}~~=~map2(cont1,~cont2)\{~(x,~y)~$\Rightarrow$~g(x,~f(y))~\}}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}~~=~map2(cont1,~cont2)\{~(x,~y)~$\rightarrow$~g(x,~f(y))~\}}{\footnotesize\par} \end{lyxcode} \end{itemize} @@ -503,9 +503,9 @@ \subsection{Associativity and identity laws for \texttt{\textcolor{blue}{\footno Write this in terms of \texttt{\textcolor{blue}{\footnotesize{}map2}} to obtain the \textbf{associativity law} for \texttt{\textcolor{blue}{\footnotesize{}map2}}: \begin{lyxcode} -\vspace{-0.1cm}\textcolor{blue}{\footnotesize{}map2(cont1,~map2(cont2,~cont3)((\_,\_))\{~case(x,(y,z))$\Rightarrow$g(x,y,z)\}}{\footnotesize\par} +\vspace{-0.1cm}\textcolor{blue}{\footnotesize{}map2(cont1,~map2(cont2,~cont3)((\_,\_))\{~case(x,(y,z))$\rightarrow$g(x,y,z)\}}{\footnotesize\par} \begin{lyxcode} -\textcolor{blue}{\footnotesize{}~~=~map2(map2(cont1,~cont2)((\_,\_)),~cont3)\{~case((x,y),z))$\Rightarrow$g(x,y,z)\}}~ +\textcolor{blue}{\footnotesize{}~~=~map2(map2(cont1,~cont2)((\_,\_)),~cont3)\{~case((x,y),z))$\rightarrow$g(x,y,z)\}}~ \end{lyxcode} Empty context precedes a generator, or follows a generator:\textcolor{blue}{\footnotesize{}\smallskip{} }{\footnotesize\par} @@ -537,9 +537,9 @@ \subsection{Associativity and identity laws for \texttt{\textcolor{blue}{\footno the \textbf{identity laws} for \textcolor{blue}{\footnotesize{}map2} and \textcolor{blue}{\footnotesize{}pure}: \begin{lyxcode} -\vspace{-0.1cm}\textcolor{blue}{\footnotesize{}map2(pure(a),~cont)(g)~=~cont.map~\{~y~$\Rightarrow$~g(a,~y)~\}}~ +\vspace{-0.1cm}\textcolor{blue}{\footnotesize{}map2(pure(a),~cont)(g)~=~cont.map~\{~y~$\rightarrow$~g(a,~y)~\}}~ -\textcolor{blue}{\footnotesize{}map2(cont,~pure(b))(g)~=~cont.map~\{~x~$\Rightarrow$~g(x,~b)~\}}~ +\textcolor{blue}{\footnotesize{}map2(cont,~pure(b))(g)~=~cont.map~\{~x~$\rightarrow$~g(x,~b)~\}}~ \end{lyxcode} \end{lyxcode} @@ -548,21 +548,21 @@ \subsection{Deriving the laws for \texttt{\textcolor{blue}{\footnotesize{}zip}}: naturality law} \begin{itemize} \item \vspace{-0.2cm}The laws for \texttt{\textcolor{blue}{\footnotesize{}map2}} -in a short notation; here{\footnotesize{} $f\otimes g\equiv\left\{ a\times b\Rightarrow f(a)\times g(b)\right\} $} +in a short notation; here{\footnotesize{} $f\otimes g\equiv\left\{ a\times b\rightarrow f(a)\times g(b)\right\} $} {\footnotesize{} \begin{align*} -\text{fmap2}\left(g^{A\times B\Rightarrow C}\right)\left(f^{\uparrow}q_{1}\times q_{2}\right) & =\text{fmap2}\left(\left(f\otimes\text{id}\right)\bef g\right)\left(q_{1}\times q_{2}\right)\\ -\text{fmap2}\left(g^{A\times B\Rightarrow C}\right)\left(q_{1}\times f^{\uparrow}q_{2}\right) & =\text{fmap2}\left(\left(\text{id}\otimes f\right)\bef g\right)\left(q_{1}\times q_{2}\right)\\ +\text{fmap2}\left(g^{A\times B\rightarrow C}\right)\left(f^{\uparrow}q_{1}\times q_{2}\right) & =\text{fmap2}\left(\left(f\otimes\text{id}\right)\bef g\right)\left(q_{1}\times q_{2}\right)\\ +\text{fmap2}\left(g^{A\times B\rightarrow C}\right)\left(q_{1}\times f^{\uparrow}q_{2}\right) & =\text{fmap2}\left(\left(\text{id}\otimes f\right)\bef g\right)\left(q_{1}\times q_{2}\right)\\ \text{fmap2}\left(g_{1.23}\right)\left(q_{1}\times\text{fmap2}\left(\text{id}\right)\left(q_{2}\times q_{3}\right)\right) & =\text{fmap2}\left(g_{12.3}\right)\left(\text{fmap2}\left(\text{id}\right)\left(q_{1}\times q_{2}\right)\times q_{3}\right)\\ -\text{fmap2}\left(g^{A\times B\Rightarrow C}\right)\left(\text{pure}\,a^{A}\times q_{2}^{F^{B}}\right) & =\left(b\Rightarrow g\left(a\times b\right)\right)^{\uparrow}q_{2}\\ -\text{fmap2}\left(g^{A\times B\Rightarrow C}\right)\left(q_{1}^{F^{A}}\times\text{pure}\,b^{B}\right) & =\left(a\Rightarrow g\left(a\times b\right)\right)^{\uparrow}q_{1} +\text{fmap2}\left(g^{A\times B\rightarrow C}\right)\left(\text{pure}\,a^{A}\times q_{2}^{F^{B}}\right) & =\left(b\rightarrow g\left(a\times b\right)\right)^{\uparrow}q_{2}\\ +\text{fmap2}\left(g^{A\times B\rightarrow C}\right)\left(q_{1}^{F^{A}}\times\text{pure}\,b^{B}\right) & =\left(a\rightarrow g\left(a\times b\right)\right)^{\uparrow}q_{1} \end{align*} }{\footnotesize\par} \begin{itemize} \item Express \texttt{\textcolor{blue}{\footnotesize{}map2}} through \texttt{\textcolor{blue}{\footnotesize{}zip}}:{\footnotesize{} \begin{align*} -\text{fmap}_{2}\,g^{A\times B\Rightarrow C}\left(q_{1}^{F^{A}}\times q_{2}^{F^{B}}\right) & \equiv\left(\text{zip}\bef g^{\uparrow}\right)\left(q_{1}\times q_{2}\right)\\ -\text{fmap}_{2}\,g^{A\times B\Rightarrow C} & \equiv\text{zip}\bef g^{\uparrow} +\text{fmap}_{2}\,g^{A\times B\rightarrow C}\left(q_{1}^{F^{A}}\times q_{2}^{F^{B}}\right) & \equiv\left(\text{zip}\bef g^{\uparrow}\right)\left(q_{1}\times q_{2}\right)\\ +\text{fmap}_{2}\,g^{A\times B\rightarrow C} & \equiv\text{zip}\bef g^{\uparrow} \end{align*} }{\footnotesize\par} \item Combine the two naturality laws into one by using two functions $f_{1}$, @@ -618,23 +618,23 @@ \subsection{Deriving the laws for \texttt{\textcolor{blue}{\footnotesize{}zip}}: \item \vspace{-0.2cm}Identity laws seem to be complicated, e.g.\ the left identity:{\footnotesize{} \[ -g^{\uparrow}\left(\text{zip}\left(\text{pure}\,a\times q\right)\right)=\left(b\Rightarrow g\left(a\times b\right)\right)^{\uparrow}q +g^{\uparrow}\left(\text{zip}\left(\text{pure}\,a\times q\right)\right)=\left(b\rightarrow g\left(a\times b\right)\right)^{\uparrow}q \] }{\footnotesize\par} \begin{itemize} \item Replace \texttt{\textcolor{blue}{\footnotesize{}pure}} by an \emph{equivalent} ``wrapped unit'' method \texttt{\textcolor{blue}{\footnotesize{}wu:\ F{[}Unit{]}}}{\footnotesize{} \[ -\text{wu}^{F^{1}}\equiv\text{pure}\left(1\right);\quad\text{pure}(a^{A})=\left(1\Rightarrow a\right)^{\uparrow}\text{wu} +\text{wu}^{F^{1}}\equiv\text{pure}\left(1\right);\quad\text{pure}(a^{A})=\left(1\rightarrow a\right)^{\uparrow}\text{wu} \] }Then the left identity law can be simplified using left naturality:{\footnotesize{} \[ -g^{\uparrow}\left(\text{zip}\left((\left(1\Rightarrow a\right)^{\uparrow}\text{wu})\times q\right)\right)=g^{\uparrow}\left(\left((1\Rightarrow a)\otimes\text{id}\right)^{\uparrow}\text{zip}\left(\text{wu}\times q\right)\right) +g^{\uparrow}\left(\text{zip}\left((\left(1\rightarrow a\right)^{\uparrow}\text{wu})\times q\right)\right)=g^{\uparrow}\left(\left((1\rightarrow a)\otimes\text{id}\right)^{\uparrow}\text{zip}\left(\text{wu}\times q\right)\right) \] }{\footnotesize\par} -\item Denote {\footnotesize{}$\phi^{B\Rightarrow1\times B}\equiv b\Rightarrow1\times b$} -and {\footnotesize{}$\beta_{a}^{1\times B\Rightarrow A\times B}\equiv\left(1\Rightarrow a\right)\otimes\text{id}$}; -then the function {\footnotesize{}$b\Rightarrow g\left(a\times b\right)$} +\item Denote {\footnotesize{}$\phi^{B\rightarrow1\times B}\equiv b\rightarrow1\times b$} +and {\footnotesize{}$\beta_{a}^{1\times B\rightarrow A\times B}\equiv\left(1\rightarrow a\right)\otimes\text{id}$}; +then the function {\footnotesize{}$b\rightarrow g\left(a\times b\right)$} can be expressed more simply as {\footnotesize{}$\phi\bef\beta_{a}\bef g$}, and the identity law becomes{\footnotesize{} \[ @@ -767,22 +767,22 @@ \subsection{Applicative operation \texttt{\textcolor{blue}{\footnotesize{}ap}} as a ``lifting''} \begin{itemize} \item \vspace{-0.18cm}Consider \texttt{\textcolor{blue}{\footnotesize{}ap}} -as a ``lifting'' since it has type{\footnotesize{} $F^{A\Rightarrow B}\Rightarrow\left(F^{A}\Rightarrow F^{B}\right)$}{\footnotesize\par} +as a ``lifting'' since it has type{\footnotesize{} $F^{A\rightarrow B}\rightarrow\left(F^{A}\rightarrow F^{B}\right)$}{\footnotesize\par} \begin{itemize} \item A ``lifting'' should obey the identity and the composition laws \begin{itemize} -\item An ``identity'' value of type $F^{A\Rightarrow A}$, mapped to $\text{id}^{F^{A}\Rightarrow F^{A}}$ +\item An ``identity'' value of type $F^{A\rightarrow A}$, mapped to $\text{id}^{F^{A}\rightarrow F^{A}}$ by \texttt{\textcolor{blue}{\footnotesize{}ap}} \begin{itemize} -\item A good candidate for that value is $\text{id}_{\odot}\equiv\text{pure}\left(\text{id}^{A\Rightarrow A}\right)$ +\item A good candidate for that value is $\text{id}_{\odot}\equiv\text{pure}\left(\text{id}^{A\rightarrow A}\right)$ \end{itemize} -\item A ``composition'' of an $F^{A\Rightarrow B}$ and an $F^{B\Rightarrow C}$, -yielding an $F^{A\Rightarrow C}$ +\item A ``composition'' of an $F^{A\rightarrow B}$ and an $F^{B\rightarrow C}$, +yielding an $F^{A\rightarrow C}$ \begin{itemize} \item We can use \texttt{\textcolor{blue}{\footnotesize{}map2}} to implement this composition, denoted $g\odot h$: \[ -g^{F^{A\Rightarrow B}}\odot h^{F^{B\Rightarrow C}}\equiv\text{fmap2}\,(p^{A\Rightarrow B}\times q^{B\Rightarrow C}\Rightarrow p\bef q)\left(g,h\right) +g^{F^{A\rightarrow B}}\odot h^{F^{B\rightarrow C}}\equiv\text{fmap2}\,(p^{A\rightarrow B}\times q^{B\rightarrow C}\rightarrow p\bef q)\left(g,h\right) \] \end{itemize} \end{itemize} @@ -790,15 +790,15 @@ \subsection{Applicative operation \texttt{\textcolor{blue}{\footnotesize{}ap}} laws?{\footnotesize{} \begin{align*} \text{id}_{\odot}\odot h=h; & \quad g\odot\text{id}_{\odot}=g\\ -g^{F^{A\Rightarrow B}}\odot(h^{F^{B\Rightarrow C}}\odot k^{F^{C\Rightarrow D}}) & =\left(g\odot h\right)\odot k\\ -\left((x^{B\Rightarrow C}\Rightarrow f^{A\Rightarrow B}\bef x)^{\uparrow}g^{F^{B\Rightarrow C}}\right)\odot h^{F^{C\Rightarrow D}} & =(x^{B\Rightarrow D}\Rightarrow f^{A\Rightarrow B}\bef x)^{\uparrow}\left(g\odot h\right)\\ -g^{F^{A\Rightarrow B}}\odot\left((x^{B\Rightarrow C}\Rightarrow x\bef f^{C\Rightarrow D})^{\uparrow}h^{F^{B\Rightarrow C}}\right) & =(x^{A\Rightarrow C}\Rightarrow x\bef f^{C\Rightarrow D})^{\uparrow}\left(g\odot h\right) +g^{F^{A\rightarrow B}}\odot(h^{F^{B\rightarrow C}}\odot k^{F^{C\rightarrow D}}) & =\left(g\odot h\right)\odot k\\ +\left((x^{B\rightarrow C}\rightarrow f^{A\rightarrow B}\bef x)^{\uparrow}g^{F^{B\rightarrow C}}\right)\odot h^{F^{C\rightarrow D}} & =(x^{B\rightarrow D}\rightarrow f^{A\rightarrow B}\bef x)^{\uparrow}\left(g\odot h\right)\\ +g^{F^{A\rightarrow B}}\odot\left((x^{B\rightarrow C}\rightarrow x\bef f^{C\rightarrow D})^{\uparrow}h^{F^{B\rightarrow C}}\right) & =(x^{A\rightarrow C}\rightarrow x\bef f^{C\rightarrow D})^{\uparrow}\left(g\odot h\right) \end{align*} }{\footnotesize\par} \begin{itemize} \item The first 3 laws are the identity \& associativity laws of a \emph{category} \begin{itemize} -\item The morphism type is $A\rightsquigarrow B\equiv F^{A\Rightarrow B}$, +\item The morphism type is $A\rightsquigarrow B\equiv F^{A\rightarrow B}$, the composition is $\odot$ \end{itemize} \item The last 2 laws are naturality laws, connecting $\text{fmap}$ and @@ -818,22 +818,22 @@ \subsection{Deriving the category laws for $\left(\text{id}_{\odot},\odot\right) \begin{itemize} \item Consider $\text{id}_{\odot}\odot h$ and substitute the definition of $\odot$ via \texttt{\textcolor{blue}{\footnotesize{}map2}}, cf.\ slide -7: $\text{id}_{\odot}\odot h=\text{fmap2}\left(p\times q\Rightarrow p\bef q\right)\left(\text{pure}\left(\text{id}\right)\times h\right)=\left(b\Rightarrow\text{id}\bef b\right)^{\uparrow}h=h$ +7: $\text{id}_{\odot}\odot h=\text{fmap2}\left(p\times q\rightarrow p\bef q\right)\left(\text{pure}\left(\text{id}\right)\times h\right)=\left(b\rightarrow\text{id}\bef b\right)^{\uparrow}h=h$ \begin{itemize} \item The law $g\odot\text{id}_{\odot}=g$ is derived similarly \item Associativity law: {\footnotesize{}$g\odot\left(h\odot k\right)=\text{fmap2}\left(\bef\right)\left(g\times\text{fmap2}\left(\bef\right)\left(h\times k\right)\right)$} The 3rd naturality law gives:{\footnotesize{} $\text{fmap2}\left(\bef\right)\left(h\times k\right)=\left(\bef\right)^{\uparrow}\left(\text{fmap2}\left(\text{id}\right)\left(h\times k\right)\right)$}, and then:{\footnotesize{} \begin{align*} -g\odot\left(h\odot k\right) & =\text{fmap2}\left(x\times\left(y\times z\right)\Rightarrow x\bef y\bef z\right)\left(g\times\text{fmap2}\left(\text{id}\right)\left(h\times k\right)\right)\\ -\left(g\odot h\right)\odot k & =\text{fmap2}\left(\left(x\times y\right)\times z\Rightarrow x\bef y\bef z\right)\left(\text{fmap2}\left(\text{id}\right)\left(g\times h\right)\times k\right) +g\odot\left(h\odot k\right) & =\text{fmap2}\left(x\times\left(y\times z\right)\rightarrow x\bef y\bef z\right)\left(g\times\text{fmap2}\left(\text{id}\right)\left(h\times k\right)\right)\\ +\left(g\odot h\right)\odot k & =\text{fmap2}\left(\left(x\times y\right)\times z\rightarrow x\bef y\bef z\right)\left(\text{fmap2}\left(\text{id}\right)\left(g\times h\right)\times k\right) \end{align*} }Now the associativity law for{\footnotesize{} $\text{fmap2}$ }yields {\footnotesize{}$g\odot\left(h\odot k\right)=\left(g\odot h\right)\odot k$}{\footnotesize\par} \item Derive naturality laws for $\odot$ from the three {\footnotesize{}$\text{map}_{2}$} -naturality laws: {\footnotesize{}$\left((x\Rightarrow f\bef x)^{\uparrow}g\right)\odot h=\text{fmap2}\left(\bef\right)\left((x\Rightarrow f\bef x)^{\uparrow}g\times h\right)=$ -$\text{fmap2}\left(x\times y\Rightarrow f\bef x\bef y\right)\left(g\times h\right)=\left(x\Rightarrow f\bef x\right)^{\uparrow}\left(\text{fmap2}\left(\bef\right)\left(g\times h\right)\right)=\left(x\Rightarrow f\bef x\right)^{\uparrow}\left(g\odot h\right)$}{\footnotesize\par} -\item The law is {\footnotesize{}$g\odot(x\Rightarrow x\bef f)^{\uparrow}h=(x\Rightarrow x\bef f)^{\uparrow}\left(g\odot h\right)$} +naturality laws: {\footnotesize{}$\left((x\rightarrow f\bef x)^{\uparrow}g\right)\odot h=\text{fmap2}\left(\bef\right)\left((x\rightarrow f\bef x)^{\uparrow}g\times h\right)=$ +$\text{fmap2}\left(x\times y\rightarrow f\bef x\bef y\right)\left(g\times h\right)=\left(x\rightarrow f\bef x\right)^{\uparrow}\left(\text{fmap2}\left(\bef\right)\left(g\times h\right)\right)=\left(x\rightarrow f\bef x\right)^{\uparrow}\left(g\odot h\right)$}{\footnotesize\par} +\item The law is {\footnotesize{}$g\odot(x\rightarrow x\bef f)^{\uparrow}h=(x\rightarrow x\bef f)^{\uparrow}\left(g\odot h\right)$} is derived similarly \end{itemize} \end{itemize} @@ -844,21 +844,21 @@ \subsection{Deriving the functor laws for \texttt{\textcolor{blue}{\footnotesize \vspace{-0.10cm}Now that we established the laws for $\odot$, we have \texttt{\textcolor{blue}{\footnotesize{}ap}} laws: \[ -\text{ap}^{[B,Z]}:F^{B\Rightarrow Z}\Rightarrow F^{B}\Rightarrow F^{Z}=\text{fmap}_{2}\left(\text{id}^{\left(B\Rightarrow Z\right)\Rightarrow\left(B\Rightarrow Z\right)}\right) +\text{ap}^{[B,Z]}:F^{B\rightarrow Z}\rightarrow F^{B}\rightarrow F^{Z}=\text{fmap}_{2}\left(\text{id}^{\left(B\rightarrow Z\right)\rightarrow\left(B\rightarrow Z\right)}\right) \] -Identity law: $\text{ap}\left(\text{id}_{\odot}\right)=\text{id}^{F^{A}\Rightarrow F^{A}}$ +Identity law: $\text{ap}\left(\text{id}_{\odot}\right)=\text{id}^{F^{A}\rightarrow F^{A}}$ \begin{itemize} -\item Derivation:{\footnotesize{} $\text{ap}\,(\text{id}_{\odot}^{F^{A\Rightarrow A}})\,(q^{F^{A}})=\text{fmap}_{2}(\text{id}^{\left(A\Rightarrow A\right)\Rightarrow A\Rightarrow A})\,(\text{pure}\,(\text{id}^{A\Rightarrow A}))\,(q^{F^{A}})=$} -{\footnotesize{}$\text{fmap2}\left(f\times x\Rightarrow f(x)\right)\left(\text{pure}\left(\text{id}\right)\times q\right)=$ -$\left(x\Rightarrow\text{id}(x)\right)^{\uparrow}q=\text{id}^{\uparrow}q=q$} +\item Derivation:{\footnotesize{} $\text{ap}\,(\text{id}_{\odot}^{F^{A\rightarrow A}})\,(q^{F^{A}})=\text{fmap}_{2}(\text{id}^{\left(A\rightarrow A\right)\rightarrow A\rightarrow A})\,(\text{pure}\,(\text{id}^{A\rightarrow A}))\,(q^{F^{A}})=$} +{\footnotesize{}$\text{fmap2}\left(f\times x\rightarrow f(x)\right)\left(\text{pure}\left(\text{id}\right)\times q\right)=$ +$\left(x\rightarrow\text{id}(x)\right)^{\uparrow}q=\text{id}^{\uparrow}q=q$} \begin{itemize} \item Easier derivation: first, express {\footnotesize{}$\text{ap}$} via $\odot$ using the isomorphisms{\footnotesize{} \[ -A\cong1\Rightarrow A;\quad F^{A}\cong F^{1\Rightarrow A} +A\cong1\rightarrow A;\quad F^{A}\cong F^{1\rightarrow A} \] -}Then {\footnotesize{}$\text{ap}\,(p^{F^{B\Rightarrow Z}})\,(q^{F^{B}})\cong q^{F^{1\Rightarrow B}}\odot p^{F^{B\Rightarrow Z}}$} +}Then {\footnotesize{}$\text{ap}\,(p^{F^{B\rightarrow Z}})\,(q^{F^{B}})\cong q^{F^{1\rightarrow B}}\odot p^{F^{B\rightarrow Z}}$} and so {\footnotesize{}$\text{ap}\left(\text{id}_{\odot}\right)\left(q\right)\cong q\odot\text{id}_{\odot}=q$}{\footnotesize\par} \end{itemize} Composition law: $\text{ap}\left(g\odot h\right)=\text{ap}\left(g\right)\bef\text{ap}\left(h\right)$ @@ -889,16 +889,16 @@ \subsection{Constructions of applicative functors} pointed} over $G$) \item $F^{A}\equiv A+G^{F^{A}}$ (recursive) for \emph{any} functor $G^{A}$ (\textbf{free monad} over $G$) -\item $F^{A}\equiv H^{A}\Rightarrow A$ for \emph{any} contrafunctor $H^{A}$\\ +\item $F^{A}\equiv H^{A}\rightarrow A$ for \emph{any} contrafunctor $H^{A}$\\ Constructions that do not correspond to monadic ones: \item $F^{A}\equiv Z$ (constant functor, $Z$ a monoid) \item $F^{A}\equiv Z+G^{A}$ for any applicative $G^{A}$ and monoid $Z$ \item $F^{A}\equiv G^{H^{A}}$ when both $G$ and $H$ are applicative \end{enumerate} \begin{itemize} -\item Applicative that disagrees with its monad: $F^{A}\equiv1+\left(1\Rightarrow A\times F^{A}\right)$ -\item Examples of non-applicative functors: $F^{A}\equiv\left(P\Rightarrow A\right)+\left(Q\Rightarrow A\right)$, -$F^{A}\equiv\left(A\Rightarrow P\right)\Rightarrow Q$,\ $F^{A}\equiv\left(A\Rightarrow P\right)\Rightarrow1+A$ +\item Applicative that disagrees with its monad: $F^{A}\equiv1+\left(1\rightarrow A\times F^{A}\right)$ +\item Examples of non-applicative functors: $F^{A}\equiv\left(P\rightarrow A\right)+\left(Q\rightarrow A\right)$, +$F^{A}\equiv\left(A\rightarrow P\right)\rightarrow Q$,\ $F^{A}\equiv\left(A\rightarrow P\right)\rightarrow1+A$ \end{itemize} \end{itemize} @@ -906,7 +906,7 @@ \subsection{Constructions of applicative functors} \subsection{All non-parameterized exp-poly types are monoids} \begin{itemize} \item \vspace{-0.1cm}Using known monoid constructions (Chapter\ 7), we -can implement $X+Y$, $X\times Y$, $X\Rightarrow Y$ as monoids when +can implement $X+Y$, $X\times Y$, $X\rightarrow Y$ as monoids when $X$ and $Y$ are monoids \begin{itemize} \item All primitive types have at least one monoid instance: @@ -925,8 +925,8 @@ \subsection{All non-parameterized exp-poly types are monoids} \item Therefore, all exponential-polynomial types without type parameters are monoids in at least one way \item Example of an exponential-polynomial type without type parameters: -{\footnotesize{}$\text{Int}+\text{String}\times\text{String}\times\left(\text{Int}\Rightarrow\text{Bool}\right)+\left(\text{Bool}\times\text{String}\Rightarrow1+\text{String}\right)$} -\item Example of a non-monoid type with type parameters: $A\Rightarrow B$ +{\footnotesize{}$\text{Int}+\text{String}\times\text{String}\times\left(\text{Int}\rightarrow\text{Bool}\right)+\left(\text{Bool}\times\text{String}\rightarrow1+\text{String}\right)$} +\item Example of a non-monoid type with type parameters: $A\rightarrow B$ \end{itemize} By constructions 1, 2, 6, 7, \emph{all} polynomial $F^{A}$ with monoidal coefficients are applicative: write $F^{A}=Z_{1}+A\times\left(Z_{2}+A\times...\right)$ @@ -949,14 +949,14 @@ \subsection{Definition and constructions of applicative contrafunctors} \item Define an \textbf{applicative contrafunctor} $C^{A}$ as having \texttt{\textcolor{blue}{\footnotesize{}zip}} and \texttt{\textcolor{blue}{\footnotesize{}wu}}:{\footnotesize{} \[ -\text{zip}:C^{A}\times C^{B}\Rightarrow C^{A\times B};\quad\text{wu}:C^{1} +\text{zip}:C^{A}\times C^{B}\rightarrow C^{A\times B};\quad\text{wu}:C^{1} \] }{\footnotesize\par} \item Identity and associativity laws must hold for \texttt{\textcolor{blue}{\footnotesize{}zip}} and \texttt{\textcolor{blue}{\footnotesize{}wu}} \begin{itemize} \item Note: applying \texttt{\textcolor{blue}{\footnotesize{}contramap}} -to the function $a\times b\Rightarrow a$ will yield some $C^{A}\Rightarrow C^{A\times B}$, +to the function $a\times b\rightarrow a$ will yield some $C^{A}\rightarrow C^{A\times B}$, but this will \emph{not} give a valid implementation of \texttt{\textcolor{blue}{\footnotesize{}zip}}! \end{itemize} \item Naturality must hold for \texttt{\textcolor{blue}{\footnotesize{}zip}}, @@ -974,7 +974,7 @@ \subsection{Definition and constructions of applicative contrafunctors} $G^{A}$ and $H^{A}$ \item $C^{A}\equiv G^{A}+H^{A}$ for any applicative contrafunctors $G^{A}$ and $H^{A}$ -\item $C^{A}\equiv H^{A}\Rightarrow G^{A}$ for \emph{any} \emph{functor} +\item $C^{A}\equiv H^{A}\rightarrow G^{A}$ for \emph{any} \emph{functor} $H^{A}$ and applicative contrafunctor $G^{A}$ \item $C^{A}\equiv G^{H^{A}}$ if a functor $G^{A}$ and contrafunctor $H^{A}$ are both applicative @@ -992,8 +992,8 @@ \subsection{Definition and laws of profunctors} and covariant positions; they can have neither \texttt{\textcolor{blue}{\footnotesize{}map}} nor \texttt{\textcolor{blue}{\footnotesize{}contramap}} \begin{itemize} -\item Examples of profunctors: {\footnotesize{}$P^{A}\equiv1+\text{Int}\times A\Rightarrow A$; -$P^{A}\equiv A+\left(A\Rightarrow\text{String}\right)$}{\footnotesize\par} +\item Examples of profunctors: {\footnotesize{}$P^{A}\equiv1+\text{Int}\times A\rightarrow A$; +$P^{A}\equiv A+\left(A\rightarrow\text{String}\right)$}{\footnotesize\par} \item Example of non-profunctor: a GADT, {\footnotesize{}$F^{A}\equiv\text{String}^{F^{\text{Int}}}+\text{Int}^{F^{1}}$}{\footnotesize\par} \end{itemize} \begin{lyxcode} @@ -1008,7 +1008,7 @@ \subsection{Definition and laws of profunctors} exists which is a contrafunctor in $X$ and a functor in $Y$, and such that $P^{A}\equiv Q^{A,A}$ \item Profunctors have \texttt{\textcolor{blue}{\footnotesize{}xmap}} of -type {\footnotesize{}$\left(A\Rightarrow B\right)\times\left(B\Rightarrow A\right)\Rightarrow(P^{A}\Rightarrow P^{B})$ }{\footnotesize\par} +type {\footnotesize{}$\left(A\rightarrow B\right)\times\left(B\rightarrow A\right)\rightarrow(P^{A}\rightarrow P^{B})$ }{\footnotesize\par} \item Identity law: {\footnotesize{}$\text{xmap}\left(\text{id},\text{id}\right)=\text{id}$}{\footnotesize\par} \item Composition law: {\footnotesize{}$\text{xmap}\left(f_{1},g_{1}\right)\bef\text{xmap}\left(f_{2},g_{2}\right)=\text{xmap}\left(f_{1}\bef f_{2},g_{2}\bef g_{1}\right)$}{\footnotesize\par} \begin{itemize} @@ -1027,7 +1027,7 @@ \subsection{Definition and constructions of applicative profunctors} and \texttt{\textcolor{blue}{\footnotesize{}wu}} with the laws \begin{itemize} \item There is no corresponding \texttt{\textcolor{blue}{\footnotesize{}ap}}! -But have \texttt{\textcolor{blue}{\footnotesize{}pure}} {\footnotesize{}$:A\Rightarrow P^{A}$} +But have \texttt{\textcolor{blue}{\footnotesize{}pure}} {\footnotesize{}$:A\rightarrow P^{A}$} \end{itemize} Applicative profunctors admit all previous constructions, and in addition: \begin{enumerate} @@ -1036,10 +1036,10 @@ \subsection{Definition and constructions of applicative profunctors} \item $P^{A}\equiv Z+G^{A}$ for any applicative profunctor $G^{A}$ and monoid $Z$ \item $P^{A}\equiv A+G^{A}$ for any applicative profunctor $G^{A}$ -\item $P^{A}\equiv F^{A}\Rightarrow Q^{A}$ for \emph{any} \emph{functor} +\item $P^{A}\equiv F^{A}\rightarrow Q^{A}$ for \emph{any} \emph{functor} $F^{A}$ and applicative profunctor $Q^{A}$ \begin{itemize} -\item Non-working construction: $P^{A}\equiv H^{A}\Rightarrow A$ for a +\item Non-working construction: $P^{A}\equiv H^{A}\rightarrow A$ for a profunctor $H^{A}$ \end{itemize} \item $P^{A}\equiv G^{H^{A}}$ for a functor $G^{A}$ and a profunctor $H^{A}$, @@ -1060,10 +1060,10 @@ \subsection{Commutative applicative functors} \item Applicative operation \texttt{\textcolor{blue}{\footnotesize{}zip}} can be \textbf{commutative} w.r.t.\ its arguments:{\footnotesize{} \[ -\left(a\times b\Rightarrow b\times a\right)^{\uparrow}\left(fa\bowtie fb\right)=fb\bowtie fa +\left(a\times b\rightarrow b\times a\right)^{\uparrow}\left(fa\bowtie fb\right)=fb\bowtie fa \] }or $fa\bowtie fb\cong fb\bowtie fa$, implicitly using the isomorphism -$a\times b\Rightarrow b\times a$ +$a\times b\rightarrow b\times a$ \item Applicative functor is commutative if the second effect is independent of the first effect (not only of the first value) \item Examples: @@ -1095,23 +1095,23 @@ \subsection{Categorical overview of ``regular'' functor classes} \textbf{\scriptsize{}class name} & \textbf{\scriptsize{}lifting's name and type signature} & \textbf{\scriptsize{}category's morphism}\tabularnewline \hline \hline -{\scriptsize{}functor} & {\scriptsize{}$\text{fmap}:\left(A\Rightarrow B\right)\Rightarrow F^{A}\Rightarrow F^{B}$} & {\scriptsize{}$A\Rightarrow B$}\tabularnewline +{\scriptsize{}functor} & {\scriptsize{}$\text{fmap}:\left(A\rightarrow B\right)\rightarrow F^{A}\rightarrow F^{B}$} & {\scriptsize{}$A\rightarrow B$}\tabularnewline \hline -{\scriptsize{}filterable} & {\scriptsize{}$\text{fmapOpt}:\left(A\Rightarrow1+B\right)\Rightarrow F^{A}\Rightarrow F^{B}$} & {\scriptsize{}$A\Rightarrow1+B$}\tabularnewline +{\scriptsize{}filterable} & {\scriptsize{}$\text{fmapOpt}:\left(A\rightarrow1+B\right)\rightarrow F^{A}\rightarrow F^{B}$} & {\scriptsize{}$A\rightarrow1+B$}\tabularnewline \hline -{\scriptsize{}monad} & {\scriptsize{}$\text{flm}:\left(A\Rightarrow F^{B}\right)\Rightarrow F^{A}\Rightarrow F^{B}$} & {\scriptsize{}$A\Rightarrow F^{B}$}\tabularnewline +{\scriptsize{}monad} & {\scriptsize{}$\text{flm}:\left(A\rightarrow F^{B}\right)\rightarrow F^{A}\rightarrow F^{B}$} & {\scriptsize{}$A\rightarrow F^{B}$}\tabularnewline \hline -{\scriptsize{}applicative} & {\scriptsize{}$\text{ap}:F^{A\Rightarrow B}\Rightarrow F^{A}\Rightarrow F^{B}$} & {\scriptsize{}$F^{A\Rightarrow B}$}\tabularnewline +{\scriptsize{}applicative} & {\scriptsize{}$\text{ap}:F^{A\rightarrow B}\rightarrow F^{A}\rightarrow F^{B}$} & {\scriptsize{}$F^{A\rightarrow B}$}\tabularnewline \hline -{\scriptsize{}contrafunctor} & {\scriptsize{}$\text{contrafmap}:\left(B\Rightarrow A\right)\Rightarrow F^{A}\Rightarrow F^{B}$} & {\scriptsize{}$B\Rightarrow A$}\tabularnewline +{\scriptsize{}contrafunctor} & {\scriptsize{}$\text{contrafmap}:\left(B\rightarrow A\right)\rightarrow F^{A}\rightarrow F^{B}$} & {\scriptsize{}$B\rightarrow A$}\tabularnewline \hline -{\scriptsize{}profunctor} & {\scriptsize{}$\text{xmap}:\left(A\Rightarrow B\right)\times\left(B\Rightarrow A\right)\Rightarrow F^{A}\Rightarrow F^{B}$} & {\scriptsize{}$\left(A\Rightarrow B\right)\times\left(B\Rightarrow A\right)$}\tabularnewline +{\scriptsize{}profunctor} & {\scriptsize{}$\text{xmap}:\left(A\rightarrow B\right)\times\left(B\rightarrow A\right)\rightarrow F^{A}\rightarrow F^{B}$} & {\scriptsize{}$\left(A\rightarrow B\right)\times\left(B\rightarrow A\right)$}\tabularnewline \hline -{\scriptsize{}contra-filterable} & {\scriptsize{}$\text{contrafmapOpt}:\left(B\Rightarrow1+A\right)\Rightarrow F^{A}\Rightarrow F^{B}$} & {\scriptsize{}$B\Rightarrow1+A$}\tabularnewline +{\scriptsize{}contra-filterable} & {\scriptsize{}$\text{contrafmapOpt}:\left(B\rightarrow1+A\right)\rightarrow F^{A}\rightarrow F^{B}$} & {\scriptsize{}$B\rightarrow1+A$}\tabularnewline \hline \multicolumn{1}{|c}{} & \multicolumn{1}{c}{{\scriptsize{}Not yet considered:}} & \tabularnewline \hline -{\scriptsize{}comonad} & {\scriptsize{}$\text{coflm}:\left(F^{A}\Rightarrow B\right)\Rightarrow F^{A}\Rightarrow F^{B}$} & {\scriptsize{}$F^{A}\Rightarrow B$}\tabularnewline +{\scriptsize{}comonad} & {\scriptsize{}$\text{coflm}:\left(F^{A}\rightarrow B\right)\rightarrow F^{A}\rightarrow F^{B}$} & {\scriptsize{}$F^{A}\rightarrow B$}\tabularnewline \hline \end{tabular} \par\end{center} @@ -1136,7 +1136,7 @@ \subsection{Exercises} when it is defined using wu as shown in the slides. \begin{enumerate} \item Use naturality of pure to show that $\text{pure}\,f\odot\text{pure}\,g=\text{pure}\left(f\bef g\right)$ -\item Show that $F^{A}\equiv\left(A\Rightarrow Z\right)\Rightarrow\left(1+A\right)$ +\item Show that $F^{A}\equiv\left(A\rightarrow Z\right)\rightarrow\left(1+A\right)$ is a functor but not applicative. \item Show that $P^{S}$ is a monoid if $S$ is a monoid and $P$ is any applicative functor, contrafunctor, or profunctor. @@ -1145,7 +1145,7 @@ \subsection{Exercises} $F^{A}=G^{A}+H^{G^{A}}$ is applicative if $G$ and $H$ are applicative functors. \item Explicitly implement contrafunctor construction 2 and prove the laws. -\item For any contrafunctor $H^{A}$, construction 5 says that $F^{A}\equiv H^{A}\Rightarrow A$ +\item For any contrafunctor $H^{A}$, construction 5 says that $F^{A}\equiv H^{A}\rightarrow A$ is applicative. Implement the code of zip(fa, fb) for this construction. \item Show that the recursive functor $F^{A}\equiv1+G^{A\times F^{A}}$ is applicative if $G^{A}$ is applicative and $\text{wu}_{F}$ is @@ -1156,8 +1156,8 @@ \subsection{Exercises} \item Implement profunctor and applicative instances for $P^{A}\equiv A+Z\times G^{A}$ where $G^{A}$ is a given applicative profunctor and $Z$ is a monoid. \item Show that, for any profunctor $P^{A}$, one can implement a function -of type $A\Rightarrow P^{B}\Rightarrow P^{A\times B}$ but not of -type $A\Rightarrow P^{B}\Rightarrow P^{A}$. +of type $A\rightarrow P^{B}\rightarrow P^{A\times B}$ but not of +type $A\rightarrow P^{B}\rightarrow P^{A}$. \end{enumerate} \end{enumerate} diff --git a/sofp-src/sofp-coinductive.lyx b/sofp-src/sofp-coinductive.lyx index 1067c5eeb..edafc46a6 100644 --- a/sofp-src/sofp-coinductive.lyx +++ b/sofp-src/sofp-coinductive.lyx @@ -109,9 +109,6 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} diff --git a/sofp-src/sofp-curry-howard.lyx b/sofp-src/sofp-curry-howard.lyx index b467615b1..14f48b981 100644 --- a/sofp-src/sofp-curry-howard.lyx +++ b/sofp-src/sofp-curry-howard.lyx @@ -109,15 +109,13 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} \def\mathunderline#1#2{\color{#1}\underline{{\color{black}#2}}\color{black}} % The LyX document will define a macro \gunderline{#1} that will use \mathunderline with the color `greenunder`. %\def\gunderline#1{\mathunderline{greenunder}{#1}} % This is now defined by LyX itself with GUI support. + \end_preamble \options open=any,numbers=noenddot,index=totoc,bibliography=totoc,listof=totoc,fontsize=10pt \use_default_options true @@ -1414,11 +1412,11 @@ Here may be either type parameters or more complicated type expressions such as -\begin_inset Formula $B\Rightarrow C$ +\begin_inset Formula $B\rightarrow C$ \end_inset or -\begin_inset Formula $(C\Rightarrow D)\Rightarrow E$ +\begin_inset Formula $(C\rightarrow D)\rightarrow E$ \end_inset , built from other type parameters. @@ -1576,10 +1574,10 @@ noprefix "false" Our previous examples are denoted by the following sequents: \begin_inset Formula \begin{align*} -\text{\texttt{fmap} for \texttt{Option}}:\quad & {\cal CH}(A\Rightarrow B)\vdash{\cal CH}(\text{\texttt{Option[A]}}\Rightarrow\text{\texttt{Option[B]}})\\ -\text{the function \texttt{before}}:\quad & {\cal CH}(A\Rightarrow B),{\cal CH}(B\Rightarrow C)\vdash{\cal CH}(A\Rightarrow C)\\ -\text{value of type }A\text{ within \texttt{fmap}}:\quad & {\cal CH}(A\Rightarrow B),{\cal CH}(\text{\texttt{Option[A]}})\vdash{\cal CH}(A)\\ -\text{value of type }C\Rightarrow A\text{ within \texttt{before}}:\quad & {\cal CH}(A\Rightarrow B),{\cal CH}(B\Rightarrow C)\vdash{\cal CH}(C\Rightarrow A) +\text{\texttt{fmap} for \texttt{Option}}:\quad & {\cal CH}(A\rightarrow B)\vdash{\cal CH}(\text{\texttt{Option[A]}}\rightarrow\text{\texttt{Option[B]}})\\ +\text{the function \texttt{before}}:\quad & {\cal CH}(A\rightarrow B),{\cal CH}(B\rightarrow C)\vdash{\cal CH}(A\rightarrow C)\\ +\text{value of type }A\text{ within \texttt{fmap}}:\quad & {\cal CH}(A\rightarrow B),{\cal CH}(\text{\texttt{Option[A]}})\vdash{\cal CH}(A)\\ +\text{value of type }C\rightarrow A\text{ within \texttt{before}}:\quad & {\cal CH}(A\rightarrow B),{\cal CH}(B\rightarrow C)\vdash{\cal CH}(C\rightarrow A) \end{align*} \end_inset @@ -2408,7 +2406,7 @@ A => B . (This type is written in the type notation as -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset .) To compute a value of that type, we need to write code such as @@ -2483,7 +2481,7 @@ a:A may be used for that. So, -\begin_inset Formula ${\cal CH}(A\Rightarrow B)$ +\begin_inset Formula ${\cal CH}(A\rightarrow B)$ \end_inset is true if and only if we are able to compute a value of type @@ -2511,7 +2509,7 @@ logical implication implication \series default , -\begin_inset Formula ${\cal CH}(A)\Longrightarrow{\cal CH}(B)$ +\begin_inset Formula ${\cal CH}(A)Rightarrow{\cal CH}(B)$ \end_inset , which means that @@ -2526,7 +2524,7 @@ implication So the rule for function types is \begin_inset Formula \[ -{\cal CH}(A\Rightarrow B)={\cal CH}(A)\Longrightarrow{\cal CH}(B)\quad. +{\cal CH}(A\rightarrow B)={\cal CH}(A)Rightarrow{\cal CH}(B)\quad. \] \end_inset @@ -2596,7 +2594,7 @@ B In the notation of formal logic, this is written as \begin_inset Formula \[ -{\cal CH}\left(\forall(A,B).\,A\Rightarrow(A\Rightarrow B)\Rightarrow B\right) +{\cal CH}\left(\forall(A,B).\,A\rightarrow(A\rightarrow B)\rightarrow B\right) \] \end_inset @@ -2604,7 +2602,7 @@ B and is equivalent to \begin_inset Formula \[ -\forall(A,B).\,{\cal CH}\left(A\Rightarrow(A\Rightarrow B)\Rightarrow B\right)\quad. +\forall(A,B).\,{\cal CH}\left(A\rightarrow(A\rightarrow B)\rightarrow B\right)\quad. \] \end_inset @@ -2624,7 +2622,7 @@ f is \begin_inset Formula \[ -f^{A,B}:A\Rightarrow\left(A\Rightarrow B\right)\Rightarrow B\quad, +f^{A,B}:A\rightarrow\left(A\rightarrow B\right)\rightarrow B\quad, \] \end_inset @@ -2632,7 +2630,7 @@ f^{A,B}:A\Rightarrow\left(A\Rightarrow B\right)\Rightarrow B\quad, and its type can be written as \begin_inset Formula \[ -\forall(A,B).\,A\Rightarrow\left(A\Rightarrow B\right)\Rightarrow B\quad. +\forall(A,B).\,A\rightarrow\left(A\rightarrow B\right)\rightarrow B\quad. \] \end_inset @@ -2715,8 +2713,8 @@ def f[A, B]: F[A, B] = { x => g => g(x) } This is written in the type notation as \begin_inset Formula \begin{align*} -F^{A,B} & \triangleq A\Rightarrow\left(A\Rightarrow B\right)\Rightarrow B\quad,\\ -f^{A,B}:F^{A,B} & \triangleq x^{:A}\Rightarrow g^{:A\Rightarrow B}\Rightarrow g(x)\quad, +F^{A,B} & \triangleq A\rightarrow\left(A\rightarrow B\right)\rightarrow B\quad,\\ +f^{A,B}:F^{A,B} & \triangleq x^{:A}\rightarrow g^{:A\rightarrow B}\rightarrow g(x)\quad, \end{align*} \end_inset @@ -2724,7 +2722,7 @@ f^{A,B}:F^{A,B} & \triangleq x^{:A}\Rightarrow g^{:A\Rightarrow B}\Rightarrow g( or equivalently (although somewhat less readably) \begin_inset Formula \[ -f:\big(\forall(A,B).\,F^{A,B}\big)\triangleq\forall(A,B).\,x^{:A}\Rightarrow g^{:A\Rightarrow B}\Rightarrow g(x)\quad. +f:\big(\forall(A,B).\,F^{A,B}\big)\triangleq\forall(A,B).\,x^{:A}\rightarrow g^{:A\rightarrow B}\rightarrow g(x)\quad. \] \end_inset @@ -2866,7 +2864,7 @@ The type product operators ( \begin_layout Itemize The function type arrows ( -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset ) group weaker than the operators @@ -2878,7 +2876,7 @@ The function type arrows ( \end_inset , so that often-used types such as -\begin_inset Formula $A\Rightarrow\bbnum 1+B$ +\begin_inset Formula $A\rightarrow\bbnum 1+B$ \end_inset (representing @@ -2894,7 +2892,7 @@ A => Option[B] \end_inset ) or -\begin_inset Formula $A\times B\Rightarrow C$ +\begin_inset Formula $A\times B\rightarrow C$ \end_inset (representing @@ -2911,7 +2909,7 @@ status open ) can be written without any parentheses. Type expressions such as -\begin_inset Formula $\left(A\Rightarrow B\right)\times C$ +\begin_inset Formula $\left(A\rightarrow B\right)\times C$ \end_inset will require parentheses but are used less often. @@ -2920,7 +2918,7 @@ status open \begin_layout Itemize The type quantifiers group weaker than all other operators, so we can write types such as -\begin_inset Formula $\forall A.\,A\Rightarrow A\Rightarrow A$ +\begin_inset Formula $\forall A.\,A\rightarrow A\rightarrow A$ \end_inset without parentheses. @@ -2930,7 +2928,7 @@ The type quantifiers group weaker than all other operators, so we can write \end_inset in the type expression -\begin_inset Formula $\left(\forall A.\,A\Rightarrow A\right)\Rightarrow\bbnum 1$ +\begin_inset Formula $\left(\forall A.\,A\rightarrow A\right)\rightarrow\bbnum 1$ \end_inset . @@ -3233,7 +3231,7 @@ A => B \begin_inset Text \begin_layout Plain Layout -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset @@ -3249,7 +3247,7 @@ A => B \end_inset -\begin_inset Formula $\Longrightarrow$ +\begin_inset Formula $Rightarrow$ \end_inset @@ -3913,7 +3911,7 @@ delta is written as \begin_inset Formula \[ -\Delta^{A}:A\Rightarrow A\times A\quad. +\Delta^{A}:A\rightarrow A\times A\quad. \] \end_inset @@ -3937,13 +3935,13 @@ the function ) is \begin_inset Formula \[ -{\cal CH}(\Delta)=\forall A.{\cal \,CH}\left(A\Rightarrow A\times A\right)\quad. +{\cal CH}(\Delta)=\forall A.{\cal \,CH}\left(A\rightarrow A\times A\right)\quad. \] \end_inset In the type expression -\begin_inset Formula $A\Rightarrow A\times A$ +\begin_inset Formula $A\rightarrow A\times A$ \end_inset , the product symbol ( @@ -3951,11 +3949,11 @@ In the type expression \end_inset ) binds stronger than the function arrow ( -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset ), so the parentheses in -\begin_inset Formula $A\Rightarrow\left(A\times A\right)$ +\begin_inset Formula $A\rightarrow\left(A\times A\right)$ \end_inset may be omitted. @@ -3969,9 +3967,9 @@ Using the rules for transforming -propositions, we rewrite \begin_inset Formula \begin{align*} - & {\cal CH}(A\Rightarrow A\times A)\\ -\text{rule for function types}:\quad & ={\cal CH}(A)\Longrightarrow{\cal CH}(A\times A)\\ -\text{rule for tuple types}:\quad & ={\cal CH}(A)\Longrightarrow\left({\cal CH}(A)\wedge{\cal CH}(A)\right)\quad. + & {\cal CH}(A\rightarrow A\times A)\\ +\text{rule for function types}:\quad & ={\cal CH}(A)Rightarrow{\cal CH}(A\times A)\\ +\text{rule for tuple types}:\quad & ={\cal CH}(A)Rightarrow\left({\cal CH}(A)\wedge{\cal CH}(A)\right)\quad. \end{align*} \end_inset @@ -3983,7 +3981,7 @@ Thus the proposition is equivalent to \begin_inset Formula \[ -{\cal CH}(\Delta)=\forall A.\,{\cal CH}(A)\Longrightarrow({\cal CH}(A)\wedge{\cal CH}(A))\quad. +{\cal CH}(\Delta)=\forall A.\,{\cal CH}(A)Rightarrow({\cal CH}(A)\wedge{\cal CH}(A))\quad. \] \end_inset @@ -4457,7 +4455,7 @@ F[A] corresponding to the type notation \begin_inset Formula \[ -F^{A}\triangleq\bbnum 1+\text{Int}\times A\times A+\text{Int}\times\left(\text{Int}\Rightarrow A\right)\quad. +F^{A}\triangleq\bbnum 1+\text{Int}\times A\times A+\text{Int}\times\left(\text{Int}\rightarrow A\right)\quad. \] \end_inset @@ -4624,7 +4622,7 @@ F3 \end_inset represents -\begin_inset Formula $\text{Int}\times\left(\text{Int}\Rightarrow A\right)$ +\begin_inset Formula $\text{Int}\times\left(\text{Int}\rightarrow A\right)$ \end_inset . @@ -4794,8 +4792,8 @@ fmap as \begin_inset Formula \begin{align*} - & \text{fmap}^{A,B}:\left(A\Rightarrow B\right)\Rightarrow\bbnum 1+A\Rightarrow\bbnum 1+B\quad,\\ -\text{or equivalently}:\quad & \text{fmap}:\forall(A,B).\,\left(A\Rightarrow B\right)\Rightarrow\bbnum 1+A\Rightarrow\bbnum 1+B\quad. + & \text{fmap}^{A,B}:\left(A\rightarrow B\right)\rightarrow\bbnum 1+A\rightarrow\bbnum 1+B\quad,\\ +\text{or equivalently}:\quad & \text{fmap}:\forall(A,B).\,\left(A\rightarrow B\right)\rightarrow\bbnum 1+A\rightarrow\bbnum 1+B\quad. \end{align*} \end_inset @@ -4809,12 +4807,12 @@ We do not put parentheses around \end_inset because the function arrows ( -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset ) group weaker than the other type operations. Parentheses around -\begin_inset Formula $\left(A\Rightarrow B\right)$ +\begin_inset Formula $\left(A\rightarrow B\right)$ \end_inset are required. @@ -4824,11 +4822,11 @@ We do not put parentheses around We will usually prefer to write type parameters in superscripts rather than under type quantifiers. So, we will prefer to write -\begin_inset Formula $\text{id}^{A}=x^{:A}\Rightarrow x$ +\begin_inset Formula $\text{id}^{A}=x^{:A}\rightarrow x$ \end_inset rather than -\begin_inset Formula $\text{id}:(\forall A.\,A\Rightarrow A)=x^{:A}\Rightarrow x$ +\begin_inset Formula $\text{id}:(\forall A.\,A\rightarrow A)=x^{:A}\rightarrow x$ \end_inset . @@ -4885,7 +4883,7 @@ Q[T,A] corresponding to the type notation \begin_inset Formula \[ -Q^{T,A}\triangleq\bbnum 1+T\times A+\text{Int}\times(T\Rightarrow T)+\text{String}\times A\quad. +Q^{T,A}\triangleq\bbnum 1+T\times A+\text{Int}\times(T\rightarrow T)+\text{String}\times A\quad. \] \end_inset @@ -4996,7 +4994,7 @@ noprefix "false" Write a Scala type signature for the fully parametric function \begin_inset Formula \[ -\text{flatMap}^{A,B}:\bbnum 1+A\Rightarrow\left(A\Rightarrow\bbnum 1+B\right)\Rightarrow\bbnum 1+B +\text{flatMap}^{A,B}:\bbnum 1+A\rightarrow\left(A\rightarrow\bbnum 1+B\right)\rightarrow\bbnum 1+B \] \end_inset @@ -5095,7 +5093,7 @@ implication implication \series default ( -\begin_inset Formula $\Longrightarrow$ +\begin_inset Formula $Rightarrow$ \end_inset ) in both directions: @@ -5103,14 +5101,14 @@ implication \end_inset means -\begin_inset Formula $\left(\alpha\Longrightarrow\beta\right)\wedge\left(\beta\Longrightarrow\alpha\right)$ +\begin_inset Formula $\left(\alphaRightarrow\beta\right)\wedge\left(\betaRightarrow\alpha\right)$ \end_inset . So, the above formula is the same as \begin_inset Formula \[ -\forall\alpha.\,\alpha\Longrightarrow\alpha\quad. +\forall\alpha.\,\alphaRightarrow\alpha\quad. \] \end_inset @@ -5134,7 +5132,7 @@ If the proposition , we obtain the formula \begin_inset Formula \begin{equation} -\forall A.\,{\cal CH}(A)\Longrightarrow{\cal CH}(A)\quad.\label{eq:ch-type-sig-1} +\forall A.\,{\cal CH}(A)Rightarrow{\cal CH}(A)\quad.\label{eq:ch-type-sig-1} \end{equation} \end_inset @@ -5166,9 +5164,9 @@ noprefix "false" ) as \begin_inset Formula \begin{align*} - & \forall A.\,\gunderline{{\cal CH}(A)\Longrightarrow{\cal CH}(A)}\\ -\text{rule for function types}:\quad & =\gunderline{\forall A}.\,{\cal CH}\left(A\Rightarrow A\right)\\ -\text{rule for parameterized types}:\quad & ={\cal CH}\left(\forall A.\,A\Rightarrow A\right)\quad. + & \forall A.\,\gunderline{{\cal CH}(A)Rightarrow{\cal CH}(A)}\\ +\text{rule for function types}:\quad & =\gunderline{\forall A}.\,{\cal CH}\left(A\rightarrow A\right)\\ +\text{rule for parameterized types}:\quad & ={\cal CH}\left(\forall A.\,A\rightarrow A\right)\quad. \end{align*} \end_inset @@ -5178,7 +5176,7 @@ The last line shows the \end_inset -proposition that corresponds to the function type -\begin_inset Formula $\forall A.\,A\Rightarrow A$ +\begin_inset Formula $\forall A.\,A\rightarrow A$ \end_inset . @@ -5261,7 +5259,7 @@ Boolean logic. \end_inset , and the implication operation ( -\begin_inset Formula $\Longrightarrow$ +\begin_inset Formula $Rightarrow$ \end_inset ) is @@ -5271,7 +5269,7 @@ defined by \begin_inset Formula \begin{equation} -\left(\alpha\Longrightarrow\beta\right)\triangleq\left((\neg\alpha)\vee\beta\right)\quad.\label{eq:ch-definition-of-implication-in-Boolean-logic} +\left(\alphaRightarrow\beta\right)\triangleq\left((\neg\alpha)\vee\beta\right)\quad.\label{eq:ch-definition-of-implication-in-Boolean-logic} \end{equation} \end_inset @@ -5398,7 +5396,7 @@ truth table. \series bold \size small -\begin_inset Formula $\alpha\Longrightarrow\beta$ +\begin_inset Formula $\alphaRightarrow\beta$ \end_inset @@ -5760,7 +5758,7 @@ truth table. \begin_layout Standard The formula -\begin_inset Formula $\alpha\Longrightarrow\alpha$ +\begin_inset Formula $\alphaRightarrow\alpha$ \end_inset has the value @@ -5781,7 +5779,7 @@ The formula . This check is sufficient to show that -\begin_inset Formula $\forall\alpha.\,\alpha\Longrightarrow\alpha$ +\begin_inset Formula $\forall\alpha.\,\alphaRightarrow\alpha$ \end_inset is true in Boolean logic. @@ -5789,7 +5787,7 @@ The formula \begin_layout Standard Here is the truth table for the formula -\begin_inset Formula $\forall(\alpha,\beta).\,(\alpha\wedge\beta)\Longrightarrow\alpha$ +\begin_inset Formula $\forall(\alpha,\beta).\,(\alpha\wedge\beta)Rightarrow\alpha$ \end_inset ; that formula is true in Boolean logic since all values in the last column @@ -5861,7 +5859,7 @@ Here is the truth table for the formula \begin_layout Plain Layout \size small -\begin_inset Formula $(\alpha\wedge\beta)\Longrightarrow\alpha$ +\begin_inset Formula $(\alpha\wedge\beta)Rightarrow\alpha$ \end_inset @@ -6111,7 +6109,7 @@ Here is the truth table for the formula \begin_layout Standard The formula -\begin_inset Formula $\forall(\alpha,\beta).\,\alpha\Longrightarrow(\alpha\wedge\beta)$ +\begin_inset Formula $\forall(\alpha,\beta).\,\alphaRightarrow(\alpha\wedge\beta)$ \end_inset is not true in Boolean logic, which we can see from the following truth @@ -6183,7 +6181,7 @@ The formula \begin_layout Plain Layout \size small -\begin_inset Formula $\alpha\Longrightarrow(\alpha\wedge\beta)$ +\begin_inset Formula $\alphaRightarrow(\alpha\wedge\beta)$ \end_inset @@ -6522,7 +6520,7 @@ Scala code \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall\alpha.\,\alpha\Longrightarrow\alpha$ +\begin_inset Formula $\forall\alpha.\,\alphaRightarrow\alpha$ \end_inset @@ -6536,7 +6534,7 @@ Scala code \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall A.\,A\Rightarrow A$ +\begin_inset Formula $\forall A.\,A\rightarrow A$ \end_inset @@ -6572,7 +6570,7 @@ def id[A](x: A): A = x \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall\alpha.\,\alpha\Longrightarrow True$ +\begin_inset Formula $\forall\alpha.\,\alphaRightarrow True$ \end_inset @@ -6586,7 +6584,7 @@ def id[A](x: A): A = x \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall A.\,A\Rightarrow\bbnum 1$ +\begin_inset Formula $\forall A.\,A\rightarrow\bbnum 1$ \end_inset @@ -6622,7 +6620,7 @@ def toUnit[A](x: A): Unit = () \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall(\alpha,\beta).\,\alpha\Longrightarrow(\alpha\vee\beta)$ +\begin_inset Formula $\forall(\alpha,\beta).\,\alphaRightarrow(\alpha\vee\beta)$ \end_inset @@ -6636,7 +6634,7 @@ def toUnit[A](x: A): Unit = () \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall(A,B).\,A\Rightarrow A+B$ +\begin_inset Formula $\forall(A,B).\,A\rightarrow A+B$ \end_inset @@ -6672,7 +6670,7 @@ def toL[A, B](x: A): Either[A, B] = Left(x) \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall(\alpha,\beta).\,(\alpha\wedge\beta)\Longrightarrow\alpha$ +\begin_inset Formula $\forall(\alpha,\beta).\,(\alpha\wedge\beta)Rightarrow\alpha$ \end_inset @@ -6686,7 +6684,7 @@ def toL[A, B](x: A): Either[A, B] = Left(x) \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall(A,B).\,A\times B\Rightarrow A$ +\begin_inset Formula $\forall(A,B).\,A\times B\rightarrow A$ \end_inset @@ -6722,7 +6720,7 @@ def first[A, B](p: (A, B)): A = p._1 \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall(\alpha,\beta).\,\alpha\Longrightarrow(\beta\Longrightarrow\alpha)$ +\begin_inset Formula $\forall(\alpha,\beta).\,\alphaRightarrow(\betaRightarrow\alpha)$ \end_inset @@ -6736,7 +6734,7 @@ def first[A, B](p: (A, B)): A = p._1 \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall(A,B).\,A\Rightarrow(B\Rightarrow A)$ +\begin_inset Formula $\forall(A,B).\,A\rightarrow(B\rightarrow A)$ \end_inset @@ -6883,7 +6881,7 @@ Scala type signature \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall\alpha.\,True\Longrightarrow\alpha$ +\begin_inset Formula $\forall\alpha.\,TrueRightarrow\alpha$ \end_inset @@ -6897,7 +6895,7 @@ Scala type signature \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall A.\,\bbnum 1\Rightarrow A$ +\begin_inset Formula $\forall A.\,\bbnum 1\rightarrow A$ \end_inset @@ -6933,7 +6931,7 @@ def f[A](x: Unit): A \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall(\alpha,\beta).\,(\alpha\vee\beta)\Longrightarrow\alpha$ +\begin_inset Formula $\forall(\alpha,\beta).\,(\alpha\vee\beta)Rightarrow\alpha$ \end_inset @@ -6947,7 +6945,7 @@ def f[A](x: Unit): A \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall(A,B).\,A+B\Rightarrow A$ +\begin_inset Formula $\forall(A,B).\,A+B\rightarrow A$ \end_inset @@ -6983,7 +6981,7 @@ def f[A,B](x: Either[A, B]) \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall(\alpha,\beta).\,\alpha\Longrightarrow(\alpha\wedge\beta)$ +\begin_inset Formula $\forall(\alpha,\beta).\,\alphaRightarrow(\alpha\wedge\beta)$ \end_inset @@ -6997,7 +6995,7 @@ def f[A,B](x: Either[A, B]) \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall(A,B).\,A\Rightarrow A\times B$ +\begin_inset Formula $\forall(A,B).\,A\rightarrow A\times B$ \end_inset @@ -7033,7 +7031,7 @@ def f[A,B](p: A): (A, B) \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall(\alpha,\beta).\,(\alpha\Longrightarrow\beta)\Longrightarrow\alpha$ +\begin_inset Formula $\forall(\alpha,\beta).\,(\alphaRightarrow\beta)Rightarrow\alpha$ \end_inset @@ -7047,7 +7045,7 @@ def f[A,B](p: A): (A, B) \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\forall(A,B).\,(A\Rightarrow B)\Rightarrow A$ +\begin_inset Formula $\forall(A,B).\,(A\rightarrow B)\rightarrow A$ \end_inset @@ -7142,7 +7140,7 @@ To see an explicit example of obtaining an incorrect result when using Boolean the following type, \begin_inset Formula \begin{equation} -\forall(A,B,C).\,\left(A\Rightarrow B+C\right)\Rightarrow\left(A\Rightarrow B\right)+\left(A\Rightarrow C\right)\quad,\label{eq:ch-example-boolean-bad-type} +\forall(A,B,C).\,\left(A\rightarrow B+C\right)\rightarrow\left(A\rightarrow B\right)+\left(A\rightarrow C\right)\quad,\label{eq:ch-example-boolean-bad-type} \end{equation} \end_inset @@ -7173,7 +7171,7 @@ bad cannot be implemented as a fully parametric function. To see why, consider that the only available data is a function -\begin_inset Formula $g^{:A\Rightarrow B+C}$ +\begin_inset Formula $g^{:A\rightarrow B+C}$ \end_inset , which returns values of type @@ -7202,11 +7200,11 @@ bad \end_inset must return either a function of type -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset or a function of type -\begin_inset Formula $A\Rightarrow C$ +\begin_inset Formula $A\rightarrow C$ \end_inset . @@ -7267,11 +7265,11 @@ bad to it. So the decision about whether to return -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset or -\begin_inset Formula $A\Rightarrow C$ +\begin_inset Formula $A\rightarrow C$ \end_inset must be independent of the function @@ -7295,12 +7293,12 @@ bad \begin_layout Standard Suppose we hard-coded the decision to return a function of type -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset . How can we create a function of type -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset in the body of @@ -7413,7 +7411,7 @@ c . This means we cannot build a function of type -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset out of the function @@ -7422,7 +7420,7 @@ c . Similarly, we cannot build a function of type -\begin_inset Formula $A\Rightarrow C$ +\begin_inset Formula $A\rightarrow C$ \end_inset out of @@ -7435,11 +7433,11 @@ c \begin_layout Standard Whether we decide to return -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset or -\begin_inset Formula $A\Rightarrow C$ +\begin_inset Formula $A\rightarrow C$ \end_inset , we will not be able to return a value of the required type, as we just @@ -7461,11 +7459,11 @@ bad \begin_layout Standard We could try to switch between -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset and -\begin_inset Formula $A\Rightarrow C$ +\begin_inset Formula $A\rightarrow C$ \end_inset depending on a given value of type @@ -7477,7 +7475,7 @@ We could try to switch between \begin_inset Formula \[ -\forall(A,B,C).\,\left(A\Rightarrow B+C\right)\Rightarrow A\Rightarrow\left(A\Rightarrow B\right)+\left(A\Rightarrow C\right)\quad. +\forall(A,B,C).\,\left(A\rightarrow B+C\right)\rightarrow A\rightarrow\left(A\rightarrow B\right)+\left(A\rightarrow C\right)\quad. \] \end_inset @@ -7562,7 +7560,7 @@ noprefix "false" -proposition: \begin_inset Formula \begin{align} - & \forall(\alpha,\beta,\gamma).\,\left(\alpha\Longrightarrow\left(\beta\vee\gamma\right)\right)\Longrightarrow\left(\left(\alpha\Longrightarrow\beta\right)\vee\left(\alpha\Longrightarrow\gamma\right)\right)\quad,\label{eq:abc-example-classical-logic-bad}\\ + & \forall(\alpha,\beta,\gamma).\,\left(\alphaRightarrow\left(\beta\vee\gamma\right)\right)Rightarrow\left(\left(\alphaRightarrow\beta\right)\vee\left(\alphaRightarrow\gamma\right)\right)\quad,\label{eq:abc-example-classical-logic-bad}\\ \text{where}\quad & \alpha\triangleq{\cal CH}(A),\quad\beta\triangleq{\cal CH}(B),\quad\gamma\triangleq{\cal CH}(C)\quad.\nonumber \end{align} @@ -7635,17 +7633,17 @@ noprefix "false" ): \begin_inset Formula \begin{align*} - & \gunderline{\alpha\Longrightarrow}\left(\beta\vee\gamma\right)\\ -\text{definition of }\Rightarrow\text{ via Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:\quad & \quad=(\neg\alpha)\vee\beta\vee\gamma\quad,\\ - & \gunderline{\left(\alpha\Longrightarrow\beta\right)}\vee\gunderline{\left(\alpha\Longrightarrow\gamma\right)}\\ -\text{definition of }\Rightarrow\text{ via Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:\quad & \quad=\gunderline{(\neg\alpha)}\vee\beta\vee\gunderline{(\neg\alpha)}\vee\gamma\\ + & \gunderline{\alphaRightarrow}\left(\beta\vee\gamma\right)\\ +\text{definition of }\rightarrow\text{ via Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:\quad & \quad=(\neg\alpha)\vee\beta\vee\gamma\quad,\\ + & \gunderline{\left(\alphaRightarrow\beta\right)}\vee\gunderline{\left(\alphaRightarrow\gamma\right)}\\ +\text{definition of }\rightarrow\text{ via Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:\quad & \quad=\gunderline{(\neg\alpha)}\vee\beta\vee\gunderline{(\neg\alpha)}\vee\gamma\\ \text{property }x\vee x=x\text{ in Boolean logic}:\quad & \quad=(\neg\alpha)\vee\beta\vee\gamma\quad, \end{align*} \end_inset showing that -\begin_inset Formula $\alpha\Longrightarrow(\beta\vee\gamma)$ +\begin_inset Formula $\alphaRightarrow(\beta\vee\gamma)$ \end_inset is in fact @@ -7653,7 +7651,7 @@ showing that equal \emph default to -\begin_inset Formula $\left(\alpha\Longrightarrow\beta\right)\vee\left(\alpha\Longrightarrow\gamma\right)$ +\begin_inset Formula $\left(\alphaRightarrow\beta\right)\vee\left(\alphaRightarrow\gamma\right)$ \end_inset in Boolean logic. @@ -7662,7 +7660,7 @@ equal \begin_layout Standard Let us also give a proof via truth-value reasoning. The only possibility for an implication -\begin_inset Formula $X\Longrightarrow Y$ +\begin_inset Formula $XRightarrow Y$ \end_inset to be @@ -7697,21 +7695,21 @@ noprefix "false" \end_inset only if -\begin_inset Formula $\left(\alpha\Longrightarrow(\beta\vee\gamma)\right)=True$ +\begin_inset Formula $\left(\alphaRightarrow(\beta\vee\gamma)\right)=True$ \end_inset and -\begin_inset Formula $\left(\alpha\Longrightarrow\beta\right)\vee\left(\alpha\Longrightarrow\gamma\right)=False$ +\begin_inset Formula $\left(\alphaRightarrow\beta\right)\vee\left(\alphaRightarrow\gamma\right)=False$ \end_inset . A disjunction can be false only when both parts are false; so we must have both -\begin_inset Formula $\left(\alpha\Longrightarrow\beta\right)=False$ +\begin_inset Formula $\left(\alphaRightarrow\beta\right)=False$ \end_inset and -\begin_inset Formula $\left(\alpha\Longrightarrow\gamma\right)=False$ +\begin_inset Formula $\left(\alphaRightarrow\gamma\right)=False$ \end_inset . @@ -7725,7 +7723,7 @@ noprefix "false" . But, with these value assignments, we find -\begin_inset Formula $\left(\alpha\Longrightarrow(\beta\vee\gamma)\right)=False$ +\begin_inset Formula $\left(\alphaRightarrow(\beta\vee\gamma)\right)=False$ \end_inset rather than @@ -8459,7 +8457,7 @@ This sequent is an axiom since its proof requires no previous sequents, \begin_layout Standard At any place in the code, we may compute a nameless function of type, say, -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset , by writing @@ -8539,7 +8537,7 @@ x -propositions, we find that we will prove the sequent \begin_inset Formula \[ -\Gamma\vdash{\cal CH}(A\Rightarrow B)\quad=\quad\Gamma\vdash{\cal CH}(A)\Longrightarrow{\cal CH}(B)\quad\triangleq\quad\Gamma\vdash\alpha\Rightarrow\beta +\Gamma\vdash{\cal CH}(A\rightarrow B)\quad=\quad\Gamma\vdash{\cal CH}(A)Rightarrow{\cal CH}(B)\quad\triangleq\quad\Gamma\vdash\alpha\rightarrow\beta \] \end_inset @@ -8566,7 +8564,7 @@ derivation rule (rather than an axiom) and is written as \begin_inset Formula \[ -\frac{\Gamma,\alpha\vdash\beta}{\Gamma\vdash\alpha\Longrightarrow\beta}\quad(\text{create function})\quad\quad. +\frac{\Gamma,\alpha\vdash\beta}{\Gamma\vdash\alphaRightarrow\beta}\quad(\text{create function})\quad\quad. \] \end_inset @@ -8591,11 +8589,11 @@ turnstile , groups weaker than other operators. So, we can write sequents such as -\begin_inset Formula $(\Gamma,\alpha)\vdash(\beta\Longrightarrow\gamma)$ +\begin_inset Formula $(\Gamma,\alpha)\vdash(\betaRightarrow\gamma)$ \end_inset with fewer parentheses: -\begin_inset Formula $\Gamma,\alpha\vdash\beta\Longrightarrow\gamma$ +\begin_inset Formula $\Gamma,\alpha\vdash\betaRightarrow\gamma$ \end_inset . @@ -8615,7 +8613,7 @@ What code corresponds to the \end_inset rule? The proof of -\begin_inset Formula $\Gamma\vdash\alpha\Longrightarrow\beta$ +\begin_inset Formula $\Gamma\vdash\alphaRightarrow\beta$ \end_inset depends on a proof of another sequent. @@ -8654,7 +8652,7 @@ exprB as well as any other arguments given previously. Then we can write the proof code for the sequent -\begin_inset Formula $\Gamma\vdash\alpha\Longrightarrow\beta$ +\begin_inset Formula $\Gamma\vdash\alphaRightarrow\beta$ \end_inset as the nameless function @@ -8671,7 +8669,7 @@ status open . This function has type -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset and requires us to already have a suitable @@ -8703,7 +8701,7 @@ exprB We may write the corresponding code as \begin_inset Formula \[ -\text{Proof}(\Gamma\vdash{\cal CH}(A)\Longrightarrow{\cal CH}(B))=x^{:A}\Rightarrow\text{Proof}(\Gamma,x^{:A}\vdash{\cal CH}(B))\quad. +\text{Proof}(\Gamma\vdash{\cal CH}(A)Rightarrow{\cal CH}(B))=x^{:A}\rightarrow\text{Proof}(\Gamma,x^{:A}\vdash{\cal CH}(B))\quad. \] \end_inset @@ -8753,7 +8751,7 @@ noprefix "false" \begin_layout Standard At any place in the code, we may apply an already defined function of type -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset to an already computed value of type @@ -8767,7 +8765,7 @@ At any place in the code, we may apply an already defined function of type . This corresponds to assuming -\begin_inset Formula ${\cal CH}(A\Rightarrow B)$ +\begin_inset Formula ${\cal CH}(A\rightarrow B)$ \end_inset and @@ -8782,7 +8780,7 @@ At any place in the code, we may apply an already defined function of type The formal logic notation for this proof rule is \begin_inset Formula \[ -\frac{\Gamma\vdash\alpha\quad\quad\Gamma\vdash\alpha\Longrightarrow\beta}{\Gamma\vdash\beta}\quad(\text{use function})\quad\quad. +\frac{\Gamma\vdash\alpha\quad\quad\Gamma\vdash\alphaRightarrow\beta}{\Gamma\vdash\beta}\quad(\text{use function})\quad\quad. \] \end_inset @@ -8828,7 +8826,7 @@ f(x) This can be written as a function application, \begin_inset Formula \[ -\text{Proof}(\Gamma\vdash\beta)=\text{Proof}\left(\Gamma\vdash\alpha\Longrightarrow\beta\right)(\text{Proof}(\Gamma\vdash\alpha))\quad. +\text{Proof}(\Gamma\vdash\beta)=\text{Proof}\left(\Gamma\vdash\alphaRightarrow\beta\right)(\text{Proof}(\Gamma\vdash\alpha))\quad. \] \end_inset @@ -9563,8 +9561,8 @@ status open \begin_inset Formula \begin{align*} \text{axioms}:\quad & \frac{~}{\Gamma\vdash{\cal CH}(\bbnum 1)}\quad(\text{create unit})\quad\quad\quad\quad\frac{~}{\Gamma,\alpha\vdash\alpha}\quad(\text{use arg})\\ -\text{derivation rules}:\quad & \frac{\Gamma,\alpha\vdash\beta}{\Gamma\vdash\alpha\Longrightarrow\beta}\quad(\text{create function})\\ - & \frac{\Gamma\vdash\alpha\quad\quad\Gamma\vdash\alpha\Longrightarrow\beta}{\Gamma\vdash\beta}\quad(\text{use function})\\ +\text{derivation rules}:\quad & \frac{\Gamma,\alpha\vdash\beta}{\Gamma\vdash\alphaRightarrow\beta}\quad(\text{create function})\\ + & \frac{\Gamma\vdash\alpha\quad\quad\Gamma\vdash\alphaRightarrow\beta}{\Gamma\vdash\beta}\quad(\text{use function})\\ & \frac{\Gamma\vdash\alpha\quad\quad\Gamma\vdash\beta}{\Gamma\vdash\alpha\wedge\beta}\quad(\text{create tuple})\\ & \frac{\Gamma\vdash\alpha\wedge\beta}{\Gamma\vdash\alpha}\quad(\text{use tuple-}1)\quad\quad\quad\frac{\Gamma\vdash\alpha\wedge\beta}{\Gamma\vdash\beta}\quad(\text{use tuple-}2)\\ & \frac{\Gamma\vdash\alpha}{\Gamma\vdash\alpha\vee\beta}\quad(\text{create \texttt{Left}})\quad\quad\quad\frac{\Gamma\vdash\beta}{\Gamma\vdash\alpha\vee\beta}\quad(\text{create \texttt{Right}})\\ @@ -9669,7 +9667,7 @@ Implementing this function is the same as being able to compute a value of type \begin_inset Formula \[ -F\triangleq\forall(A,B).\,((A\Rightarrow A)\Rightarrow B)\Rightarrow B\quad. +F\triangleq\forall(A,B).\,((A\rightarrow A)\rightarrow B)\rightarrow B\quad. \] \end_inset @@ -9738,7 +9736,7 @@ noprefix "false" , we get \begin_inset Formula \begin{equation} -\forall(\alpha,\beta).\;\emptyset\vdash((\alpha\Longrightarrow\alpha)\Longrightarrow\beta)\Longrightarrow\beta\quad,\label{eq:ch-example-sequent-2} +\forall(\alpha,\beta).\;\emptyset\vdash((\alphaRightarrow\alpha)Rightarrow\beta)Rightarrow\beta\quad,\label{eq:ch-example-sequent-2} \end{equation} \end_inset @@ -9820,12 +9818,12 @@ noprefix "false" \end_inset has an implication ( -\begin_inset Formula $p\Rightarrow q$ +\begin_inset Formula $p\rightarrow q$ \end_inset ) in the goal. We have only one rule that can prove a sequent of the form -\begin_inset Formula $\Gamma\vdash(p\Longrightarrow q$ +\begin_inset Formula $\Gamma\vdash(pRightarrow q$ \end_inset ); this is the rule @@ -9851,7 +9849,7 @@ has an implication ( \end_inset , -\begin_inset Formula $p=(\alpha\Longrightarrow\alpha)\Longrightarrow\beta$ +\begin_inset Formula $p=(\alphaRightarrow\alpha)Rightarrow\beta$ \end_inset , and @@ -9861,13 +9859,13 @@ has an implication ( : \begin_inset Formula \[ -\frac{(\alpha\Longrightarrow\alpha)\Longrightarrow\beta\vdash\beta}{\emptyset\vdash((\alpha\Longrightarrow\alpha)\Longrightarrow\beta)\Longrightarrow\beta}\quad. +\frac{(\alphaRightarrow\alpha)Rightarrow\beta\vdash\beta}{\emptyset\vdash((\alphaRightarrow\alpha)Rightarrow\beta)Rightarrow\beta}\quad. \] \end_inset We now need to prove the sequent -\begin_inset Formula $(\alpha\Longrightarrow\alpha)\Longrightarrow\beta)\vdash\beta$ +\begin_inset Formula $(\alphaRightarrow\alpha)Rightarrow\beta)\vdash\beta$ \end_inset , which we can write as @@ -9875,11 +9873,11 @@ We now need to prove the sequent \end_inset where -\begin_inset Formula $\Gamma_{1}\triangleq[(\alpha\Rightarrow\alpha)\Rightarrow\beta]$ +\begin_inset Formula $\Gamma_{1}\triangleq[(\alpha\rightarrow\alpha)\rightarrow\beta]$ \end_inset denotes the set containing the single premise -\begin_inset Formula $(\alpha\Longrightarrow\alpha)\Longrightarrow\beta$ +\begin_inset Formula $(\alphaRightarrow\alpha)Rightarrow\beta$ \end_inset . @@ -9889,7 +9887,7 @@ We now need to prove the sequent \begin_layout Standard There are no proof rules that derive a sequent with an explicit premise of the form of an implication -\begin_inset Formula $p\Longrightarrow q$ +\begin_inset Formula $pRightarrow q$ \end_inset . @@ -9909,17 +9907,17 @@ There are no proof rules that derive a sequent with an explicit premise We would be able to use that rule, \begin_inset Formula \[ -\frac{\Gamma_{1}\vdash\alpha\Longrightarrow\alpha\quad\quad\Gamma_{1}\vdash(\alpha\Longrightarrow\alpha)\Longrightarrow\beta}{\Gamma_{1}\vdash\beta}\quad, +\frac{\Gamma_{1}\vdash\alphaRightarrow\alpha\quad\quad\Gamma_{1}\vdash(\alphaRightarrow\alpha)Rightarrow\beta}{\Gamma_{1}\vdash\beta}\quad, \] \end_inset if we could prove the two sequents -\begin_inset Formula $\Gamma_{1}\vdash\alpha\Longrightarrow\alpha$ +\begin_inset Formula $\Gamma_{1}\vdash\alphaRightarrow\alpha$ \end_inset and -\begin_inset Formula $\Gamma_{1}\vdash(\alpha\Longrightarrow\alpha)\Longrightarrow\beta$ +\begin_inset Formula $\Gamma_{1}\vdash(\alphaRightarrow\alpha)Rightarrow\beta$ \end_inset . @@ -9936,13 +9934,13 @@ if we could prove the two sequents \end_inset applies to -\begin_inset Formula $\Gamma_{1}\vdash\alpha\Longrightarrow\alpha$ +\begin_inset Formula $\Gamma_{1}\vdash\alphaRightarrow\alpha$ \end_inset as follows, \begin_inset Formula \[ -\frac{\Gamma_{1},\alpha\vdash\alpha}{\Gamma_{1}\vdash\alpha\Longrightarrow\alpha}\quad. +\frac{\Gamma_{1},\alpha\vdash\alpha}{\Gamma_{1}\vdash\alphaRightarrow\alpha}\quad. \] \end_inset @@ -9965,7 +9963,7 @@ The sequent . The sequent -\begin_inset Formula $\Gamma_{1}\vdash(\alpha\Longrightarrow\alpha)\Longrightarrow\beta$ +\begin_inset Formula $\Gamma_{1}\vdash(\alphaRightarrow\alpha)Rightarrow\beta$ \end_inset is also proved by the axiom @@ -9985,7 +9983,7 @@ The sequent \end_inset already contains -\begin_inset Formula $(\alpha\Longrightarrow\alpha)\Longrightarrow\beta$ +\begin_inset Formula $(\alphaRightarrow\alpha)Rightarrow\beta$ \end_inset . @@ -10284,7 +10282,7 @@ Here : \begin_inset Formula \[ -\text{Proof}\left(\Gamma_{1}\vdash\alpha\Longrightarrow\alpha\right)=(x^{:A}\Rightarrow\text{Proof}\left(\Gamma_{1},\alpha\vdash\alpha\right))=(x^{:A}\Rightarrow x)\quad. +\text{Proof}\left(\Gamma_{1}\vdash\alphaRightarrow\alpha\right)=(x^{:A}\rightarrow\text{Proof}\left(\Gamma_{1},\alpha\vdash\alpha\right))=(x^{:A}\rightarrow x)\quad. \] \end_inset @@ -10302,7 +10300,7 @@ The right-most leaf \end_inset corresponds to the code -\begin_inset Formula $f^{:(A\Rightarrow A)\Rightarrow B}$ +\begin_inset Formula $f^{:(A\rightarrow A)\rightarrow B}$ \end_inset , where @@ -10317,7 +10315,7 @@ The right-most leaf So we can write \begin_inset Formula \[ -\text{Proof}\left(\Gamma_{1}\vdash(\alpha\Longrightarrow\alpha)\Longrightarrow\beta\right)=f^{:(A\Rightarrow A)\Rightarrow B}\quad. +\text{Proof}\left(\Gamma_{1}\vdash(\alphaRightarrow\alpha)Rightarrow\beta\right)=f^{:(A\rightarrow A)\rightarrow B}\quad. \] \end_inset @@ -10337,9 +10335,9 @@ The previous rule, , combines the two preceding proofs: \begin_inset Formula \begin{align*} - & \text{Proof}\left((\alpha\Longrightarrow\alpha)\Longrightarrow\beta\vdash\beta\right)\\ - & =\text{Proof}(\Gamma_{1}\vdash(\alpha\Longrightarrow\alpha)\Longrightarrow\beta)\left(\text{Proof}(\Gamma_{1}\vdash\alpha\Longrightarrow\alpha)\right)\\ - & =f(x^{:A}\Rightarrow x)\quad. + & \text{Proof}\left((\alphaRightarrow\alpha)Rightarrow\beta\vdash\beta\right)\\ + & =\text{Proof}(\Gamma_{1}\vdash(\alphaRightarrow\alpha)Rightarrow\beta)\left(\text{Proof}(\Gamma_{1}\vdash\alphaRightarrow\alpha)\right)\\ + & =f(x^{:A}\rightarrow x)\quad. \end{align*} \end_inset @@ -10370,21 +10368,21 @@ Keep going backwards and find that the rule applied before . We need to provide the same -\begin_inset Formula $f^{:\left(A\Rightarrow A\right)\Rightarrow B}$ +\begin_inset Formula $f^{:\left(A\rightarrow A\right)\rightarrow B}$ \end_inset as in the premise above, and so we obtain the code \begin_inset Formula \begin{align*} - & \text{Proof}\left(\emptyset\vdash((\alpha\Longrightarrow\alpha)\Longrightarrow\beta)\Longrightarrow\beta\right)\\ - & =f^{:\left(A\Rightarrow A\right)\Rightarrow B}\Rightarrow\text{Proof}\left((\alpha\Longrightarrow\alpha)\Longrightarrow\beta\vdash\beta\right)\\ - & =f^{:\left(A\Rightarrow A\right)\Rightarrow B}\Rightarrow f(x^{:A}\Rightarrow x)\quad. + & \text{Proof}\left(\emptyset\vdash((\alphaRightarrow\alpha)Rightarrow\beta)Rightarrow\beta\right)\\ + & =f^{:\left(A\rightarrow A\right)\rightarrow B}\rightarrow\text{Proof}\left((\alphaRightarrow\alpha)Rightarrow\beta\vdash\beta\right)\\ + & =f^{:\left(A\rightarrow A\right)\rightarrow B}\rightarrow f(x^{:A}\rightarrow x)\quad. \end{align*} \end_inset This is the final code expression that implements the type -\begin_inset Formula $(\left(A\Rightarrow A\right)\Rightarrow B)\Rightarrow B$ +\begin_inset Formula $(\left(A\rightarrow A\right)\rightarrow B)\rightarrow B$ \end_inset . @@ -10537,7 +10535,7 @@ target "http://ammonite.io/#Ammonite-Shell" Consider the type signature \begin_inset Formula \[ -\forall(A,B).\,\left(\left(\left(\left(A\Rightarrow B\right)\Rightarrow A\right)\Rightarrow A\right)\Rightarrow B\right)\Rightarrow B\quad. +\forall(A,B).\,\left(\left(\left(\left(A\rightarrow B\right)\rightarrow A\right)\rightarrow A\right)\rightarrow B\right)\rightarrow B\quad. \] \end_inset @@ -10603,7 +10601,7 @@ a => a (b => b (c => a (d => c))) \end_inset The code -\begin_inset Formula $a\Rightarrow a\left(b\Rightarrow b\left(c\Rightarrow a\left(d\Rightarrow c\right)\right)\right)$ +\begin_inset Formula $a\rightarrow a\left(b\rightarrow b\left(c\rightarrow a\left(d\rightarrow c\right)\right)\right)$ \end_inset was derived automatically for the function @@ -10703,7 +10701,7 @@ Compilation Failed The logical formula corresponding to this type signature is \begin_inset Formula \begin{equation} -\forall(\alpha,\beta).\,\left(\left(\alpha\Longrightarrow\alpha\right)\Longrightarrow\beta\right)\Longrightarrow\beta\quad.\label{eq:ch-example-3-peirce-law} +\forall(\alpha,\beta).\,\left(\left(\alphaRightarrow\alpha\right)Rightarrow\beta\right)Rightarrow\beta\quad.\label{eq:ch-example-3-peirce-law} \end{equation} \end_inset @@ -10872,7 +10870,7 @@ Curry-Howard correspondence An example of the CH correspondence is that a proof of the logical proposition \begin_inset Formula \begin{equation} -\forall(\alpha,\beta).\,\alpha\Longrightarrow\left(\beta\Longrightarrow\alpha\right)\label{eq:ch-proposition-example-2} +\forall(\alpha,\beta).\,\alphaRightarrow\left(\betaRightarrow\alpha\right)\label{eq:ch-proposition-example-2} \end{equation} \end_inset @@ -10941,7 +10939,7 @@ x => _ => x \end_inset with the type -\begin_inset Formula $A\Rightarrow(B\Rightarrow A)$ +\begin_inset Formula $A\rightarrow(B\rightarrow A)$ \end_inset @@ -11101,11 +11099,11 @@ target "https://en.wikipedia.org/wiki/Distributive_property#Rule_of_replacement" \end_inset means -\begin_inset Formula $P\Longrightarrow Q$ +\begin_inset Formula $PRightarrow Q$ \end_inset and -\begin_inset Formula $Q\Longrightarrow P$ +\begin_inset Formula $QRightarrow P$ \end_inset , the distributive law @@ -11125,8 +11123,8 @@ noprefix "false" ) means that the two formulas hold, \begin_inset Formula \begin{align} - & \forall(A,B,C).\,\left(A\vee B\right)\wedge C\Longrightarrow\left(A\wedge C\right)\vee\left(B\wedge C\right)\quad,\label{eq:ch-example-distributive-1a}\\ - & \forall(A,B,C).\,\left(A\wedge C\right)\vee\left(B\wedge C\right)\Longrightarrow\left(A\vee B\right)\wedge C\quad.\label{eq:ch-example-distributive-1b} + & \forall(A,B,C).\,\left(A\vee B\right)\wedge CRightarrow\left(A\wedge C\right)\vee\left(B\wedge C\right)\quad,\label{eq:ch-example-distributive-1a}\\ + & \forall(A,B,C).\,\left(A\wedge C\right)\vee\left(B\wedge C\right)Rightarrow\left(A\vee B\right)\wedge C\quad.\label{eq:ch-example-distributive-1b} \end{align} \end_inset @@ -11152,8 +11150,8 @@ def f2[A, B, C]: Either[(A, C), (B, C)] => (Either[A, B], C) = ??? In the type notation, these type signatures are written as \begin_inset Formula \begin{align*} - & f_{1}:\forall(A,B,C).\,\left(A+B\right)\times C\Rightarrow A\times C+B\times C\quad,\\ - & f_{2}:\forall(A,B,C).\;A\times C+B\times C\Rightarrow\left(A+B\right)\times C\quad. + & f_{1}:\forall(A,B,C).\,\left(A+B\right)\times C\rightarrow A\times C+B\times C\quad,\\ + & f_{2}:\forall(A,B,C).\;A\times C+B\times C\rightarrow\left(A+B\right)\times C\quad. \end{align*} \end_inset @@ -11677,11 +11675,11 @@ type equivalence \end_inset when there exist functions -\begin_inset Formula $f_{1}^{:P\Rightarrow Q}$ +\begin_inset Formula $f_{1}^{:P\rightarrow Q}$ \end_inset and -\begin_inset Formula $f_{2}^{:Q\Rightarrow P}$ +\begin_inset Formula $f_{2}^{:Q\rightarrow P}$ \end_inset that are inverses of each other. @@ -12552,11 +12550,11 @@ Unit . We can verify this intuition rigorously by proving that any fully parametric functions with type signatures -\begin_inset Formula $g_{1}:\bbnum 1+A\Rightarrow\bbnum 1$ +\begin_inset Formula $g_{1}:\bbnum 1+A\rightarrow\bbnum 1$ \end_inset and -\begin_inset Formula $g_{2}:\bbnum 1\Rightarrow\bbnum 1+A$ +\begin_inset Formula $g_{2}:\bbnum 1\rightarrow\bbnum 1+A$ \end_inset will not satisfy @@ -12565,7 +12563,7 @@ Unit . To verify this, we note that -\begin_inset Formula $g_{2}:\bbnum 1\Rightarrow\bbnum 1+A$ +\begin_inset Formula $g_{2}:\bbnum 1\rightarrow\bbnum 1+A$ \end_inset must have type signature @@ -12660,7 +12658,7 @@ None \end_inset has type signature -\begin_inset Formula $\bbnum 1+A\Rightarrow\bbnum 1+A$ +\begin_inset Formula $\bbnum 1+A\rightarrow\bbnum 1+A$ \end_inset or, in Scala syntax, @@ -12791,7 +12789,7 @@ not \emph default equivalent. To see why, look at the possible code of the function -\begin_inset Formula $g_{3}:\left(A+C\right)\times\left(B+C\right)\Rightarrow A\times B+C$ +\begin_inset Formula $g_{3}:\left(A+C\right)\times\left(B+C\right)\rightarrow A\times B+C$ \end_inset : @@ -12962,11 +12960,11 @@ We conclude that a logical identity some \emph default fully parametric functions of types -\begin_inset Formula $P\Rightarrow Q$ +\begin_inset Formula $P\rightarrow Q$ \end_inset and -\begin_inset Formula $Q\Rightarrow P$ +\begin_inset Formula $Q\rightarrow P$ \end_inset . @@ -12976,11 +12974,11 @@ some \end_inset that the type conversions -\begin_inset Formula $P\Rightarrow Q$ +\begin_inset Formula $P\rightarrow Q$ \end_inset or -\begin_inset Formula $Q\Rightarrow P$ +\begin_inset Formula $Q\rightarrow P$ \end_inset have no information loss @@ -13965,11 +13963,11 @@ A , and vice versa. This means implementing functions -\begin_inset Formula $f_{1}:\bbnum 0+A\Rightarrow A$ +\begin_inset Formula $f_{1}:\bbnum 0+A\rightarrow A$ \end_inset and -\begin_inset Formula $f_{2}:A\Rightarrow\bbnum 0+A$ +\begin_inset Formula $f_{2}:A\rightarrow\bbnum 0+A$ \end_inset such that @@ -14505,8 +14503,8 @@ toRight in a code notation as \begin_inset Formula \begin{align*} - & \text{toLeft}^{A,B}=x^{:A}\Rightarrow x^{:A}+\bbnum 0^{:B}\quad,\\ - & \text{toRight}^{A,B}=y^{:B}\Rightarrow\bbnum 0^{:A}+y^{:B}\quad. + & \text{toLeft}^{A,B}=x^{:A}\rightarrow x^{:A}+\bbnum 0^{:B}\quad,\\ + & \text{toRight}^{A,B}=y^{:B}\rightarrow\bbnum 0^{:A}+y^{:B}\quad. \end{align*} \end_inset @@ -14715,11 +14713,11 @@ A . We need to implement functions -\begin_inset Formula $f_{1}:\forall A.\,A\times\bbnum 1\Rightarrow A$ +\begin_inset Formula $f_{1}:\forall A.\,A\times\bbnum 1\rightarrow A$ \end_inset and -\begin_inset Formula $f_{2}:\forall A.\,A\Rightarrow A\times\bbnum 1$ +\begin_inset Formula $f_{2}:\forall A.\,A\rightarrow A\times\bbnum 1$ \end_inset and to demonstrate that they are inverses of each other. @@ -14769,8 +14767,8 @@ Now let us write a proof in the code notation. are \begin_inset Formula \begin{align*} -f_{1} & =a^{:A}\times1\Rightarrow a\quad,\\ -f_{2} & =a^{:A}\Rightarrow a\times1\quad, +f_{1} & =a^{:A}\times1\rightarrow a\quad,\\ +f_{2} & =a^{:A}\rightarrow a\times1\quad, \end{align*} \end_inset @@ -14822,8 +14820,8 @@ This shows that both compositions are identity functions. , \begin_inset Formula \begin{align*} -f_{1}\bef f_{2} & =\left(a\times1\Rightarrow a\right)\bef\left(a\Rightarrow a\times1\right)=\left(a\times1\Rightarrow a\times1\right)=\text{id}^{A\times\bbnum 1}\quad,\\ -f_{2}\bef f_{1} & =\left(a\Rightarrow a\times1\right)\bef\left(a\times1\Rightarrow a\right)=\left(a\Rightarrow a\right)=\text{id}^{A}\quad. +f_{1}\bef f_{2} & =\left(a\times1\rightarrow a\right)\bef\left(a\rightarrow a\times1\right)=\left(a\times1\rightarrow a\times1\right)=\text{id}^{A\times\bbnum 1}\quad,\\ +f_{2}\bef f_{1} & =\left(a\rightarrow a\times1\right)\bef\left(a\times1\rightarrow a\right)=\left(a\rightarrow a\right)=\text{id}^{A}\quad. \end{align*} \end_inset @@ -15292,7 +15290,7 @@ f1 as \begin_inset Formula \[ -f_{1}\triangleq x^{:A+B}\Rightarrow\begin{cases} +f_{1}\triangleq x^{:A+B}\rightarrow\begin{cases} \text{if }x=a^{:A}+\bbnum 0^{:B}\quad: & \bbnum 0^{:B}+a^{:A}\\ \text{if }x=\bbnum 0^{:A}+b^{:B}\quad: & b^{:B}+\bbnum 0^{:A} \end{cases} @@ -15393,8 +15391,8 @@ def f1[A, B]: Either[A, B] => Either[B, A] = { \[ f_{1}\triangleq\begin{array}{|c||cc|} & B & A\\ -\hline A~ & \bbnum 0 & a^{:A}\Rightarrow a\\ -B~ & b^{:B}\Rightarrow b & \bbnum 0 +\hline A~ & \bbnum 0 & a^{:A}\rightarrow a\\ +B~ & b^{:B}\rightarrow b & \bbnum 0 \end{array}\quad. \] @@ -15509,8 +15507,8 @@ def f2[A, B]: Either[B, A] => Either[A, B] = { \[ f_{2}\triangleq\begin{array}{|c||cc|} & A & B\\ -\hline B~ & \bbnum 0 & y^{:B}\Rightarrow y\\ -A~ & x^{:A}\Rightarrow x & \bbnum 0 +\hline B~ & \bbnum 0 & y^{:B}\rightarrow y\\ +A~ & x^{:A}\rightarrow x & \bbnum 0 \end{array}\quad. \] @@ -15556,23 +15554,23 @@ target "https://en.wikipedia.org/wiki/Matrix_multiplication" \begin{align*} f_{1}\bef f_{2} & =\begin{array}{|c||cc|} & B & A\\ -\hline A~ & \bbnum 0 & a^{:A}\Rightarrow a\\ -B~ & b^{:B}\Rightarrow b & \bbnum 0 +\hline A~ & \bbnum 0 & a^{:A}\rightarrow a\\ +B~ & b^{:B}\rightarrow b & \bbnum 0 \end{array}\,\bef\,\begin{array}{|c||cc|} & A & B\\ -\hline B~ & \bbnum 0 & y^{:B}\Rightarrow y\\ -A~ & x^{:A}\Rightarrow x & \bbnum 0 +\hline B~ & \bbnum 0 & y^{:B}\rightarrow y\\ +A~ & x^{:A}\rightarrow x & \bbnum 0 \end{array}\\ \text{use matrix multiplication}:\quad & =\begin{array}{|c||cc|} & A & B\\ -\hline A~ & (a^{:A}\Rightarrow a)\bef(x^{:A}\Rightarrow x) & \bbnum 0\\ -B~ & \bbnum 0 & (b^{:B}\Rightarrow b)\bef(y^{:B}\Rightarrow y) +\hline A~ & (a^{:A}\rightarrow a)\bef(x^{:A}\rightarrow x) & \bbnum 0\\ +B~ & \bbnum 0 & (b^{:B}\rightarrow b)\bef(y^{:B}\rightarrow y) \end{array}\\ \text{function composition}:\quad & =\begin{array}{|c||cc|} & A & B\\ \hline A~ & \text{id} & \bbnum 0\\ B~ & \bbnum 0 & \text{id} -\end{array}=\text{id}^{:A+B\Rightarrow A+B}\quad. +\end{array}=\text{id}^{:A+B\rightarrow A+B}\quad. \end{align*} \end_inset @@ -15615,15 +15613,15 @@ A \begin_inset Formula \begin{align*} f_{1}\bef f_{2} & =\begin{array}{||cc|} -\bbnum 0 & a^{:A}\Rightarrow a\\ -b^{:B}\Rightarrow b & \bbnum 0 +\bbnum 0 & a^{:A}\rightarrow a\\ +b^{:B}\rightarrow b & \bbnum 0 \end{array}\,\bef\,\begin{array}{||cc|} -\bbnum 0 & y^{:B}\Rightarrow y\\ -x^{:A}\Rightarrow x & \bbnum 0 +\bbnum 0 & y^{:B}\rightarrow y\\ +x^{:A}\rightarrow x & \bbnum 0 \end{array}\\ \text{use matrix multiplication}:\quad & =\begin{array}{||cc|} -(a^{:A}\Rightarrow a)\bef(x^{:A}\Rightarrow x) & \bbnum 0\\ -\bbnum 0 & (b^{:B}\Rightarrow b)\bef(y^{:B}\Rightarrow y) +(a^{:A}\rightarrow a)\bef(x^{:A}\rightarrow x) & \bbnum 0\\ +\bbnum 0 & (b^{:B}\rightarrow b)\bef(y^{:B}\rightarrow y) \end{array}\\ \text{function composition}:\quad & =\begin{array}{||cc|} \text{id} & \bbnum 0\\ @@ -17008,7 +17006,7 @@ Consider two types \end_inset ? In other words, how many distinct values does the function type -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset have? A function @@ -17081,7 +17079,7 @@ For the types , and so the estimate will give \begin_inset Formula \[ -\left|A\Rightarrow B\right|=\left(2^{32}\right)^{\left(2^{32}\right)}=2^{32\times2^{32}}=2^{2^{37}}\approx10^{4.1\times10^{10}}\quad. +\left|A\rightarrow B\right|=\left(2^{32}\right)^{\left(2^{32}\right)}=2^{32\times2^{32}}=2^{2^{37}}\approx10^{4.1\times10^{10}}\quad. \] \end_inset @@ -17091,7 +17089,7 @@ In fact, most of these functions will map integers to integers in a complicated realistic computer because their code will be much longer than the available memory. So, the number of practically implementable functions of type -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset is often much smaller than @@ -17142,21 +17140,21 @@ noprefix "false" \begin_layout Standard It is notable that no logic identity is available for the formula -\begin_inset Formula $\alpha\Longrightarrow\left(\beta\vee\gamma\right)$ +\begin_inset Formula $\alphaRightarrow\left(\beta\vee\gamma\right)$ \end_inset , and correspondingly no type equivalence is available for the type expression -\begin_inset Formula $A\Rightarrow B+C$ +\begin_inset Formula $A\rightarrow B+C$ \end_inset (although there is an identity for -\begin_inset Formula $A\Rightarrow B\times C$ +\begin_inset Formula $A\rightarrow B\times C$ \end_inset ). The presence of type expressions of the form -\begin_inset Formula $A\Rightarrow B+C$ +\begin_inset Formula $A\rightarrow B+C$ \end_inset makes type reasoning more complicated because they cannot be transformed @@ -17222,7 +17220,7 @@ Arithmetic identity \begin_layout Plain Layout \size small -\begin_inset Formula $\left(True\Longrightarrow\alpha\right)=\alpha$ +\begin_inset Formula $\left(TrueRightarrow\alpha\right)=\alpha$ \end_inset @@ -17236,7 +17234,7 @@ Arithmetic identity \begin_layout Plain Layout \size small -\begin_inset Formula $\bbnum 1\Rightarrow A\cong A$ +\begin_inset Formula $\bbnum 1\rightarrow A\cong A$ \end_inset @@ -17266,7 +17264,7 @@ Arithmetic identity \begin_layout Plain Layout \size small -\begin_inset Formula $\left(False\Longrightarrow\alpha\right)=True$ +\begin_inset Formula $\left(FalseRightarrow\alpha\right)=True$ \end_inset @@ -17280,7 +17278,7 @@ Arithmetic identity \begin_layout Plain Layout \size small -\begin_inset Formula $\bbnum 0\Rightarrow A\cong\bbnum 1$ +\begin_inset Formula $\bbnum 0\rightarrow A\cong\bbnum 1$ \end_inset @@ -17310,7 +17308,7 @@ Arithmetic identity \begin_layout Plain Layout \size small -\begin_inset Formula $\left(\alpha\Longrightarrow True\right)=True$ +\begin_inset Formula $\left(\alphaRightarrow True\right)=True$ \end_inset @@ -17324,7 +17322,7 @@ Arithmetic identity \begin_layout Plain Layout \size small -\begin_inset Formula $A\Rightarrow\bbnum 1\cong\bbnum 1$ +\begin_inset Formula $A\rightarrow\bbnum 1\cong\bbnum 1$ \end_inset @@ -17354,7 +17352,7 @@ Arithmetic identity \begin_layout Plain Layout \size small -\begin_inset Formula $\left(\alpha\Longrightarrow False\right)\neq False$ +\begin_inset Formula $\left(\alphaRightarrow False\right)\neq False$ \end_inset @@ -17368,7 +17366,7 @@ Arithmetic identity \begin_layout Plain Layout \size small -\begin_inset Formula $A\Rightarrow\bbnum 0\not\cong\bbnum 0$ +\begin_inset Formula $A\rightarrow\bbnum 0\not\cong\bbnum 0$ \end_inset @@ -17398,7 +17396,7 @@ Arithmetic identity \begin_layout Plain Layout \size small -\begin_inset Formula $\left(\alpha\vee\beta\right)\Longrightarrow\gamma=\left(\alpha\Longrightarrow\gamma\right)\wedge\left(\beta\Longrightarrow\gamma\right)$ +\begin_inset Formula $\left(\alpha\vee\beta\right)Rightarrow\gamma=\left(\alphaRightarrow\gamma\right)\wedge\left(\betaRightarrow\gamma\right)$ \end_inset @@ -17412,7 +17410,7 @@ Arithmetic identity \begin_layout Plain Layout \size small -\begin_inset Formula $A+B\Rightarrow C\cong\left(A\Rightarrow C\right)\times\left(B\Rightarrow C\right)$ +\begin_inset Formula $A+B\rightarrow C\cong\left(A\rightarrow C\right)\times\left(B\rightarrow C\right)$ \end_inset @@ -17442,7 +17440,7 @@ Arithmetic identity \begin_layout Plain Layout \size small -\begin_inset Formula $(\alpha\wedge\beta)\Longrightarrow\gamma=\alpha\Longrightarrow\left(\beta\Longrightarrow\gamma\right)$ +\begin_inset Formula $(\alpha\wedge\beta)Rightarrow\gamma=\alphaRightarrow\left(\betaRightarrow\gamma\right)$ \end_inset @@ -17456,7 +17454,7 @@ Arithmetic identity \begin_layout Plain Layout \size small -\begin_inset Formula $A\times B\Rightarrow C\cong A\Rightarrow B\Rightarrow C$ +\begin_inset Formula $A\times B\rightarrow C\cong A\rightarrow B\rightarrow C$ \end_inset @@ -17486,7 +17484,7 @@ Arithmetic identity \begin_layout Plain Layout \size small -\begin_inset Formula $\alpha\Longrightarrow\left(\beta\wedge\gamma\right)=\left(\alpha\Longrightarrow\beta\right)\wedge\left(\alpha\Longrightarrow\gamma\right)$ +\begin_inset Formula $\alphaRightarrow\left(\beta\wedge\gamma\right)=\left(\alphaRightarrow\beta\right)\wedge\left(\alphaRightarrow\gamma\right)$ \end_inset @@ -17500,7 +17498,7 @@ Arithmetic identity \begin_layout Plain Layout \size small -\begin_inset Formula $A\Rightarrow B\times C\cong\left(A\Rightarrow B\right)\times\left(A\Rightarrow C\right)$ +\begin_inset Formula $A\rightarrow B\times C\cong\left(A\rightarrow B\right)\times\left(A\rightarrow C\right)$ \end_inset @@ -17606,7 +17604,7 @@ solved examples \begin_layout Standard Verify the type equivalence -\begin_inset Formula $\bbnum 1\Rightarrow A\cong A$ +\begin_inset Formula $\bbnum 1\rightarrow A\cong A$ \end_inset . @@ -17618,7 +17616,7 @@ Solution \begin_layout Standard Recall that the type notation -\begin_inset Formula $\bbnum 1\Rightarrow A$ +\begin_inset Formula $\bbnum 1\rightarrow A$ \end_inset means the Scala function type @@ -17672,7 +17670,7 @@ A . Thus, the number of distinct values of the type -\begin_inset Formula $\bbnum 1\Rightarrow A$ +\begin_inset Formula $\bbnum 1\rightarrow A$ \end_inset is @@ -18038,8 +18036,8 @@ For comparison, let us show the same proof in the code notation. are \begin_inset Formula \begin{align*} - & f_{1}\triangleq h^{:\bbnum 1\Rightarrow A}\Rightarrow h(1)\quad,\\ - & f_{2}\triangleq x^{:A}\Rightarrow1\Rightarrow x\quad. + & f_{1}\triangleq h^{:\bbnum 1\rightarrow A}\rightarrow h(1)\quad,\\ + & f_{2}\triangleq x^{:A}\rightarrow1\rightarrow x\quad. \end{align*} \end_inset @@ -18047,12 +18045,12 @@ For comparison, let us show the same proof in the code notation. Now write the function compositions in both directions: \begin_inset Formula \begin{align*} - & f_{1}\bef f_{2}=(h^{:\bbnum 1\Rightarrow A}\Rightarrow h(1))\bef(x^{:A}\Rightarrow1\Rightarrow x)\\ -\text{compute composition}:\quad & =\left(h\Rightarrow1\Rightarrow h(1)\right)\\ -\text{note that }1\Rightarrow h(1)\text{ is the same as }h:\quad & =\left(h\Rightarrow h\right)=\text{id}\quad.\\ - & f_{2}\bef f_{1}=(x^{:A}\Rightarrow1\Rightarrow x)\bef(h^{:\bbnum 1\Rightarrow A}\Rightarrow h(1))\\ -\text{compute composition}:\quad & =x\Rightarrow(1\Rightarrow x)(1)\\ -\text{apply function}:\quad & =\left(x\Rightarrow x\right)=\text{id}\quad. + & f_{1}\bef f_{2}=(h^{:\bbnum 1\rightarrow A}\rightarrow h(1))\bef(x^{:A}\rightarrow1\rightarrow x)\\ +\text{compute composition}:\quad & =\left(h\rightarrow1\rightarrow h(1)\right)\\ +\text{note that }1\rightarrow h(1)\text{ is the same as }h:\quad & =\left(h\rightarrow h\right)=\text{id}\quad.\\ + & f_{2}\bef f_{1}=(x^{:A}\rightarrow1\rightarrow x)\bef(h^{:\bbnum 1\rightarrow A}\rightarrow h(1))\\ +\text{compute composition}:\quad & =x\rightarrow(1\rightarrow x)(1)\\ +\text{apply function}:\quad & =\left(x\rightarrow x\right)=\text{id}\quad. \end{align*} \end_inset @@ -18062,7 +18060,7 @@ Now write the function compositions in both directions: \begin_layout Standard The type -\begin_inset Formula $\bbnum 1\Rightarrow A$ +\begin_inset Formula $\bbnum 1\rightarrow A$ \end_inset is equivalent to the type @@ -18076,7 +18074,7 @@ The type \end_inset is available immediately, while a value of type -\begin_inset Formula $\bbnum 1\Rightarrow A$ +\begin_inset Formula $\bbnum 1\rightarrow A$ \end_inset is a function that still needs to be applied to an argument (of type @@ -18089,7 +18087,7 @@ The type is obtained. The type -\begin_inset Formula $\bbnum 1\Rightarrow A$ +\begin_inset Formula $\bbnum 1\rightarrow A$ \end_inset may represent an @@ -18182,7 +18180,7 @@ noprefix "false" \begin_layout Standard Verify the type equivalence -\begin_inset Formula $\bbnum 0\Rightarrow A\cong\bbnum 1$ +\begin_inset Formula $\bbnum 0\rightarrow A\cong\bbnum 1$ \end_inset . @@ -18194,7 +18192,7 @@ Solution \begin_layout Standard What could be a function -\begin_inset Formula $f^{:\bbnum 0\Rightarrow A}$ +\begin_inset Formula $f^{:\bbnum 0\rightarrow A}$ \end_inset from the type @@ -18331,16 +18329,16 @@ Let us now verify that there exists only one \emph default function of type -\begin_inset Formula $\bbnum 0\Rightarrow A$ +\begin_inset Formula $\bbnum 0\rightarrow A$ \end_inset . Suppose there are two such functions, -\begin_inset Formula $f^{:\bbnum 0\Rightarrow A}$ +\begin_inset Formula $f^{:\bbnum 0\rightarrow A}$ \end_inset and -\begin_inset Formula $g^{:\bbnum 0\Rightarrow A}$ +\begin_inset Formula $g^{:\bbnum 0\rightarrow A}$ \end_inset . @@ -18399,7 +18397,7 @@ no \end_inset of type -\begin_inset Formula $\bbnum 0\Rightarrow A$ +\begin_inset Formula $\bbnum 0\rightarrow A$ \end_inset are equal. @@ -18408,7 +18406,7 @@ no one \emph default distinct value of type -\begin_inset Formula $\bbnum 0\Rightarrow A$ +\begin_inset Formula $\bbnum 0\rightarrow A$ \end_inset ; i.e. @@ -18416,7 +18414,7 @@ one \end_inset the cardinality of the type -\begin_inset Formula $\bbnum 0\Rightarrow A$ +\begin_inset Formula $\bbnum 0\rightarrow A$ \end_inset is @@ -18425,7 +18423,7 @@ the cardinality of the type . So, the type -\begin_inset Formula $\bbnum 0\Rightarrow A$ +\begin_inset Formula $\bbnum 0\rightarrow A$ \end_inset is equivalent to the type @@ -18458,11 +18456,11 @@ noprefix "false" \begin_layout Standard Show that -\begin_inset Formula $A\Rightarrow\bbnum 0\not\cong\bbnum 0$ +\begin_inset Formula $A\rightarrow\bbnum 0\not\cong\bbnum 0$ \end_inset and -\begin_inset Formula $A\Rightarrow\bbnum 0\not\cong\bbnum 1$ +\begin_inset Formula $A\rightarrow\bbnum 0\not\cong\bbnum 1$ \end_inset . @@ -18480,7 +18478,7 @@ not equivalent, it is sufficient to show that their type cardinalities are different. Let us determine the cardinality of the type -\begin_inset Formula $A\Rightarrow\bbnum 0$ +\begin_inset Formula $A\rightarrow\bbnum 0$ \end_inset , assuming that the cardinality of @@ -18489,12 +18487,12 @@ not is known. We note that a function of type, say, -\begin_inset Formula $\text{Int}\Rightarrow\bbnum 0$ +\begin_inset Formula $\text{Int}\rightarrow\bbnum 0$ \end_inset is impossible to implement. (If we had such a function -\begin_inset Formula $f^{:\text{Int}\Rightarrow\bbnum 0}$ +\begin_inset Formula $f^{:\text{Int}\rightarrow\bbnum 0}$ \end_inset , we could evaluate, say, @@ -18515,7 +18513,7 @@ not . It follows that -\begin_inset Formula $\left|\text{Int}\Rightarrow\bbnum 0\right|=0$ +\begin_inset Formula $\left|\text{Int}\rightarrow\bbnum 0\right|=0$ \end_inset . @@ -18534,7 +18532,7 @@ noprefix "false" \end_inset shows that -\begin_inset Formula $\bbnum 0\Rightarrow\bbnum 0$ +\begin_inset Formula $\bbnum 0\rightarrow\bbnum 0$ \end_inset has cardinality @@ -18543,7 +18541,7 @@ noprefix "false" . So, the cardinality -\begin_inset Formula $\left|A\Rightarrow\bbnum 0\right|=1$ +\begin_inset Formula $\left|A\rightarrow\bbnum 0\right|=1$ \end_inset if the type @@ -18555,7 +18553,7 @@ noprefix "false" \end_inset but -\begin_inset Formula $\left|A\Rightarrow\bbnum 0\right|=0$ +\begin_inset Formula $\left|A\rightarrow\bbnum 0\right|=0$ \end_inset for all other types @@ -18564,7 +18562,7 @@ noprefix "false" . We conclude that the type -\begin_inset Formula $A\Rightarrow\bbnum 0$ +\begin_inset Formula $A\rightarrow\bbnum 0$ \end_inset is not equivalent to @@ -18613,7 +18611,7 @@ noprefix "false" \begin_layout Standard Verify the type equivalence -\begin_inset Formula $A\Rightarrow\bbnum 1\cong\bbnum 1$ +\begin_inset Formula $A\rightarrow\bbnum 1\cong\bbnum 1$ \end_inset . @@ -18685,7 +18683,7 @@ Unit In the code notation, this function is written as \begin_inset Formula \[ -f^{:A\Rightarrow\bbnum 1}\triangleq\left(\_\Rightarrow1\right)\quad. +f^{:A\rightarrow\bbnum 1}\triangleq\left(\_\rightarrow1\right)\quad. \] \end_inset @@ -18695,11 +18693,11 @@ We can show that there exist only one \emph default distinct function of type -\begin_inset Formula $A\Rightarrow\bbnum 1$ +\begin_inset Formula $A\rightarrow\bbnum 1$ \end_inset (that is, the type -\begin_inset Formula $A\Rightarrow\bbnum 1$ +\begin_inset Formula $A\rightarrow\bbnum 1$ \end_inset has cardinality @@ -18750,7 +18748,7 @@ one \end_inset of type -\begin_inset Formula $A\Rightarrow\bbnum 1$ +\begin_inset Formula $A\rightarrow\bbnum 1$ \end_inset must be equal to each other. @@ -18776,7 +18774,7 @@ Unit . So -\begin_inset Formula $A\Rightarrow\bbnum 1\cong\bbnum 1$ +\begin_inset Formula $A\rightarrow\bbnum 1\cong\bbnum 1$ \end_inset . @@ -18807,7 +18805,7 @@ noprefix "false" Verify the type equivalence \begin_inset Formula \[ -A+B\Rightarrow C\cong(A\Rightarrow C)\times(B\Rightarrow C)\quad. +A+B\rightarrow C\cong(A\rightarrow C)\times(B\rightarrow C)\quad. \] \end_inset @@ -18998,8 +18996,8 @@ def f1[A,B,C]: (Either[A, B] => C) => (A => C, B => C) = A code notation for this function is \begin_inset Formula \begin{align*} - & f_{1}:\left(A+B\Rightarrow C\right)\Rightarrow\left(A\Rightarrow C\right)\times\left(B\Rightarrow C\right)\quad,\\ - & f_{1}\triangleq h^{:A+B\Rightarrow C}\Rightarrow\left(a^{:A}\Rightarrow h(a+\bbnum 0^{:B})\right)\times\left(b^{:B}\Rightarrow h(\bbnum 0^{:A}+b)\right)\quad. + & f_{1}:\left(A+B\rightarrow C\right)\rightarrow\left(A\rightarrow C\right)\times\left(B\rightarrow C\right)\quad,\\ + & f_{1}\triangleq h^{:A+B\rightarrow C}\rightarrow\left(a^{:A}\rightarrow h(a+\bbnum 0^{:B})\right)\times\left(b^{:B}\rightarrow h(\bbnum 0^{:A}+b)\right)\quad. \end{align*} \end_inset @@ -19074,11 +19072,11 @@ def f2[A,B,C]: ((A => C, B => C)) => Either[A, B] => C = { case (f, g) => A code notation for this function can be written as \begin_inset Formula \begin{align*} - & f_{2}:\left(A\Rightarrow C\right)\times\left(B\Rightarrow C\right)\Rightarrow A+B\Rightarrow C\quad,\\ - & f_{2}\triangleq f^{:A\Rightarrow C}\times g^{:B\Rightarrow C}\Rightarrow\begin{array}{|c||c|} + & f_{2}:\left(A\rightarrow C\right)\times\left(B\rightarrow C\right)\rightarrow A+B\rightarrow C\quad,\\ + & f_{2}\triangleq f^{:A\rightarrow C}\times g^{:B\rightarrow C}\rightarrow\begin{array}{|c||c|} & C\\ -\hline A & a\Rightarrow f(a)\\ -B & b\Rightarrow g(b) +\hline A & a\rightarrow f(a)\\ +B & b\rightarrow g(b) \end{array}\quad. \end{align*} @@ -19095,7 +19093,7 @@ The matrix in the last line has only one column because the result type, \end_inset -\begin_inset Formula $a\Rightarrow f(a)$ +\begin_inset Formula $a\rightarrow f(a)$ \end_inset into @@ -19105,7 +19103,7 @@ The matrix in the last line has only one column because the result type, , and write \begin_inset Formula \[ -f_{2}\triangleq f^{:A\Rightarrow C}\times g^{:B\Rightarrow C}\Rightarrow f^{:A\Rightarrow C}\times g^{:B\Rightarrow C}\Rightarrow\begin{array}{|c||c|} +f_{2}\triangleq f^{:A\rightarrow C}\times g^{:B\rightarrow C}\rightarrow f^{:A\rightarrow C}\times g^{:B\rightarrow C}\rightarrow\begin{array}{|c||c|} & C\\ \hline A & f\\ B & g @@ -19134,13 +19132,13 @@ It remains to verify that , we write (omitting types) \begin_inset Formula \begin{align*} -f_{1}\bef f_{2} & =\left(h\Rightarrow(a\Rightarrow h(a+\bbnum 0))\times(b\Rightarrow h(\bbnum 0+b))\right)\bef\bigg(f\times g\Rightarrow\begin{array}{||c|} +f_{1}\bef f_{2} & =\left(h\rightarrow(a\rightarrow h(a+\bbnum 0))\times(b\rightarrow h(\bbnum 0+b))\right)\bef\bigg(f\times g\rightarrow\begin{array}{||c|} f\\ g \end{array}\,\bigg)\\ -\text{compute composition}:\quad & =h\Rightarrow\begin{array}{||c|} -a\Rightarrow h(a+\bbnum 0)\\ -b\Rightarrow h(\bbnum 0+b) +\text{compute composition}:\quad & =h\rightarrow\begin{array}{||c|} +a\rightarrow h(a+\bbnum 0)\\ +b\rightarrow h(\bbnum 0+b) \end{array}\quad. \end{align*} @@ -19160,7 +19158,7 @@ To proceed, we need to simplify the expressions \end_inset (an arbitrary function of type -\begin_inset Formula $A+B\Rightarrow C$ +\begin_inset Formula $A+B\rightarrow C$ \end_inset ) in the matrix notation: @@ -19168,8 +19166,8 @@ To proceed, we need to simplify the expressions \[ h\triangleq\begin{array}{|c||c|} & C\\ -\hline A & a\Rightarrow p(a)\\ -B & b\Rightarrow q(b) +\hline A & a\rightarrow p(a)\\ +B & b\rightarrow q(b) \end{array}=\begin{array}{|c||c|} & C\\ \hline A & p\\ @@ -19180,11 +19178,11 @@ B & q \end_inset where -\begin_inset Formula $p^{:A\Rightarrow C}$ +\begin_inset Formula $p^{:A\rightarrow C}$ \end_inset and -\begin_inset Formula $q^{:B\Rightarrow C}$ +\begin_inset Formula $q^{:B\rightarrow C}$ \end_inset are new arbitrary functions. @@ -19324,21 +19322,21 @@ Now we can complete the proof of : \begin_inset Formula \begin{align*} -f_{1}\bef f_{2} & =h\Rightarrow\begin{array}{||c|} -a\Rightarrow h(a+\bbnum 0)\\ -b\Rightarrow h(\bbnum 0+b) +f_{1}\bef f_{2} & =h\rightarrow\begin{array}{||c|} +a\rightarrow h(a+\bbnum 0)\\ +b\rightarrow h(\bbnum 0+b) \end{array}\\ \text{previous equations}:\quad & =\begin{array}{||c|} p\\ q -\end{array}\Rightarrow\begin{array}{||c|} -a\Rightarrow p(a)\\ -b\Rightarrow q(b) +\end{array}\rightarrow\begin{array}{||c|} +a\rightarrow p(a)\\ +b\rightarrow q(b) \end{array}\\ \text{simplify functions}:\quad & =\bigg(\begin{array}{||c|} p\\ q -\end{array}\Rightarrow\begin{array}{||c|} +\end{array}\rightarrow\begin{array}{||c|} p\\ q \end{array}\,\bigg)=\text{id}\quad. @@ -19371,22 +19369,22 @@ noprefix "false" ): \begin_inset Formula \begin{align*} -f_{2}\bef f_{1} & =\bigg(f\times g\Rightarrow\begin{array}{||c|} +f_{2}\bef f_{1} & =\bigg(f\times g\rightarrow\begin{array}{||c|} f\\ g -\end{array}\,\bigg)\bef\left(h\Rightarrow(a\Rightarrow h(a+\bbnum 0))\times(b\Rightarrow h(\bbnum 0+b))\right)\\ -\text{compute composition}:\quad & =f\times g\Rightarrow\big(a\Rightarrow\begin{array}{|cc|} +\end{array}\,\bigg)\bef\left(h\rightarrow(a\rightarrow h(a+\bbnum 0))\times(b\rightarrow h(\bbnum 0+b))\right)\\ +\text{compute composition}:\quad & =f\times g\rightarrow\big(a\rightarrow\begin{array}{|cc|} a & \bbnum 0\end{array}\,\triangleright\,\begin{array}{||c|} f\\ g -\end{array}\,\big)\times\big(b\Rightarrow\begin{array}{|cc|} +\end{array}\,\big)\times\big(b\rightarrow\begin{array}{|cc|} \bbnum 0 & b\end{array}\,\triangleright\,\begin{array}{||c|} f\\ g \end{array}\,\big)\\ -\text{matrix notation}:\quad & =f\times g\Rightarrow(a\Rightarrow\gunderline{a\triangleright f})\times(b\Rightarrow\gunderline{b\triangleright g})\\ -\text{definition of }\triangleright:\quad & =f\times g\Rightarrow\gunderline{\left(a\Rightarrow f(a)\right)}\times\gunderline{\left(b\Rightarrow g(b)\right)}\\ -\text{simplify functions}:\quad & =\left(f\times g\Rightarrow f\times g\right)=\text{id}\quad. +\text{matrix notation}:\quad & =f\times g\rightarrow(a\rightarrow\gunderline{a\triangleright f})\times(b\rightarrow\gunderline{b\triangleright g})\\ +\text{definition of }\triangleright:\quad & =f\times g\rightarrow\gunderline{\left(a\rightarrow f(a)\right)}\times\gunderline{\left(b\rightarrow g(b)\right)}\\ +\text{simplify functions}:\quad & =\left(f\times g\rightarrow f\times g\right)=\text{id}\quad. \end{align*} \end_inset @@ -19413,25 +19411,25 @@ In this way, we have proved that can be written as \begin_inset Formula \begin{align*} -f_{1}\bef f_{2} & =\left(h\Rightarrow(a\Rightarrow(a+\bbnum 0)\triangleright h)\times(b\Rightarrow(\bbnum 0+b)\triangleright h)\right)\bef\bigg(f\times g\Rightarrow\begin{array}{||c|} +f_{1}\bef f_{2} & =\left(h\rightarrow(a\rightarrow(a+\bbnum 0)\triangleright h)\times(b\rightarrow(\bbnum 0+b)\triangleright h)\right)\bef\bigg(f\times g\rightarrow\begin{array}{||c|} f\\ g \end{array}\bigg)\\ -\text{compute composition}:\quad & =h\Rightarrow\begin{array}{||c|} -\,a\,\Rightarrow\,\left|\begin{array}{cc} +\text{compute composition}:\quad & =h\rightarrow\begin{array}{||c|} +\,a\,\rightarrow\,\left|\begin{array}{cc} a & \bbnum 0\end{array}\right|\triangleright h\\ -b\Rightarrow\left|\begin{array}{cc} +b\rightarrow\left|\begin{array}{cc} \bbnum 0 & b\end{array}\right|\triangleright h \end{array}=\begin{array}{||c|} p\\ q -\end{array}\Rightarrow\begin{array}{||c|} -a\Rightarrow\begin{array}{|cc|} +\end{array}\rightarrow\begin{array}{||c|} +a\rightarrow\begin{array}{|cc|} a & \bbnum 0\end{array}\,\triangleright\,\begin{array}{||c|} p\\ q \end{array}\\ -b\,\Rightarrow\begin{array}{|cc|} +b\,\rightarrow\begin{array}{|cc|} \bbnum 0 & b\,\end{array}\,\triangleright\,\begin{array}{||c|} p\\ q @@ -19440,13 +19438,13 @@ q \text{matrix notation}:\quad & =\begin{array}{||c|} p\\ q -\end{array}\Rightarrow\begin{array}{||c|} -a\Rightarrow a\triangleright p\\ -b\Rightarrow b\triangleright q +\end{array}\rightarrow\begin{array}{||c|} +a\rightarrow a\triangleright p\\ +b\rightarrow b\triangleright q \end{array}=\big(\begin{array}{||c|} p\\ q -\end{array}\Rightarrow\begin{array}{||c|} +\end{array}\rightarrow\begin{array}{||c|} p\\ q \end{array}\,\big)=\text{id}\quad. @@ -19486,7 +19484,7 @@ noprefix "false" Verify the type equivalence \begin_inset Formula \[ -A\times B\Rightarrow C\cong A\Rightarrow B\Rightarrow C\quad. +A\times B\rightarrow C\cong A\rightarrow B\rightarrow C\quad. \] \end_inset @@ -19537,8 +19535,8 @@ def f2[A,B,C]: (A => B => C) => ((A, B)) => C = h => { case (a, b) => h(a)(b) Write these functions in the code notation: \begin_inset Formula \begin{align*} - & f_{1}=g^{:A\times B\Rightarrow C}\Rightarrow a^{:A}\Rightarrow b^{:B}\Rightarrow g(a\times b)\quad,\\ - & f_{2}=h^{:A\Rightarrow B\Rightarrow C}\Rightarrow\left(a\times b\right)^{:A\times B}\Rightarrow h(a)(b)\quad. + & f_{1}=g^{:A\times B\rightarrow C}\rightarrow a^{:A}\rightarrow b^{:B}\rightarrow g(a\times b)\quad,\\ + & f_{2}=h^{:A\rightarrow B\rightarrow C}\rightarrow\left(a\times b\right)^{:A\times B}\rightarrow h(a)(b)\quad. \end{align*} \end_inset @@ -19572,9 +19570,9 @@ Compute the function composition : \begin_inset Formula \begin{align*} -f_{1}\bef f_{2} & =(g\Rightarrow\gunderline{a\Rightarrow b\Rightarrow g(a\times b)})\bef\left(h\Rightarrow a\times b\Rightarrow h(a)(b)\right)\\ -\text{substitute }h=a\Rightarrow b\Rightarrow g(a\times b):\quad & =g\Rightarrow\gunderline{a\times b\Rightarrow g(a\times b)}\\ -\text{simplify function}:\quad & =\left(g\Rightarrow g\right)=\text{id}\quad. +f_{1}\bef f_{2} & =(g\rightarrow\gunderline{a\rightarrow b\rightarrow g(a\times b)})\bef\left(h\rightarrow a\times b\rightarrow h(a)(b)\right)\\ +\text{substitute }h=a\rightarrow b\rightarrow g(a\times b):\quad & =g\rightarrow\gunderline{a\times b\rightarrow g(a\times b)}\\ +\text{simplify function}:\quad & =\left(g\rightarrow g\right)=\text{id}\quad. \end{align*} \end_inset @@ -19586,10 +19584,10 @@ Compute the function composition : \begin_inset Formula \begin{align*} -f_{2}\bef f_{1} & =(h\Rightarrow\gunderline{a\times b\Rightarrow h(a)(b)})\bef\left(g\Rightarrow a\Rightarrow b\Rightarrow g(a\times b)\right)\\ -\text{substitute }g=a\times b\Rightarrow h(a)(b):\quad & =h\Rightarrow a\Rightarrow\gunderline{b\Rightarrow h(a)(b)}\\ -\text{simplify function }b\Rightarrow h(a)(b):\quad & =h\Rightarrow\gunderline{a\Rightarrow h(a)}\\ -\text{simplify function }a\Rightarrow h(a)\text{ to }h:\quad & =\left(h\Rightarrow h\right)=\text{id}\quad. +f_{2}\bef f_{1} & =(h\rightarrow\gunderline{a\times b\rightarrow h(a)(b)})\bef\left(g\rightarrow a\rightarrow b\rightarrow g(a\times b)\right)\\ +\text{substitute }g=a\times b\rightarrow h(a)(b):\quad & =h\rightarrow a\rightarrow\gunderline{b\rightarrow h(a)(b)}\\ +\text{simplify function }b\rightarrow h(a)(b):\quad & =h\rightarrow\gunderline{a\rightarrow h(a)}\\ +\text{simplify function }a\rightarrow h(a)\text{ to }h:\quad & =\left(h\rightarrow h\right)=\text{id}\quad. \end{align*} \end_inset @@ -19632,7 +19630,7 @@ exercises Verify the type equivalence \begin_inset Formula \[ -\left(A\Rightarrow B\times C\right)\cong\left(A\Rightarrow B\right)\times\left(A\Rightarrow C\right)\quad. +\left(A\rightarrow B\times C\right)\cong\left(A\rightarrow B\right)\times\left(A\rightarrow C\right)\quad. \] \end_inset @@ -19896,7 +19894,7 @@ q into the logical formula \begin_inset Formula \begin{equation} -{\cal CH}(\text{Array}^{A})\Longrightarrow{\cal CH}(A\Rightarrow\text{Opt}^{B})\Longrightarrow{\cal CH}(\text{Array}^{\text{Opt}^{B}})\quad.\label{eq:ch-example-quantified-proposition} +{\cal CH}(\text{Array}^{A})Rightarrow{\cal CH}(A\rightarrow\text{Opt}^{B})Rightarrow{\cal CH}(\text{Array}^{\text{Opt}^{B}})\quad.\label{eq:ch-example-quantified-proposition} \end{equation} \end_inset @@ -19930,7 +19928,7 @@ Array That method has a type signature such as \begin_inset Formula \[ -\text{map}:\forall(A,B).\,\text{Array}^{A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow\text{Array}^{B}\quad. +\text{map}:\forall(A,B).\,\text{Array}^{A}\rightarrow\left(A\rightarrow B\right)\rightarrow\text{Array}^{B}\quad. \] \end_inset @@ -19960,7 +19958,7 @@ noprefix "false" -proposition \begin_inset Formula \begin{equation} -{\cal CH}\left(\forall(A,B).\,\text{Array}^{A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow\text{Array}^{B}\right)\label{eq:ch-example-quantified-proposition-2} +{\cal CH}\left(\forall(A,B).\,\text{Array}^{A}\rightarrow\left(A\rightarrow B\right)\rightarrow\text{Array}^{B}\right)\label{eq:ch-example-quantified-proposition-2} \end{equation} \end_inset @@ -20329,14 +20327,14 @@ Option[Boolean] => Boolean \end_inset is denoted by -\begin_inset Formula $\bbnum 1+\bbnum 2\Rightarrow\bbnum 2$ +\begin_inset Formula $\bbnum 1+\bbnum 2\rightarrow\bbnum 2$ \end_inset . Its cardinality is computed as the arithmetic power \begin_inset Formula \[ -\left|\text{Opt}^{\text{Bool}}\Rightarrow\text{Bool}\right|=\left|\bbnum 1+\bbnum 2\Rightarrow\bbnum 2\right|=\left|\bbnum 2\right|^{\left|\bbnum 1+\bbnum 2\right|}=2^{3}=8\quad. +\left|\text{Opt}^{\text{Bool}}\rightarrow\text{Bool}\right|=\left|\bbnum 1+\bbnum 2\rightarrow\bbnum 2\right|=\left|\bbnum 2\right|^{\left|\bbnum 1+\bbnum 2\right|}=2^{3}=8\quad. \] \end_inset @@ -20356,7 +20354,7 @@ P in the type notation as \begin_inset Formula \[ -P=\bbnum 1+\left(\bbnum 1+\bbnum 2\Rightarrow\bbnum 2\right) +P=\bbnum 1+\left(\bbnum 1+\bbnum 2\rightarrow\bbnum 2\right) \] \end_inset @@ -20364,7 +20362,7 @@ P=\bbnum 1+\left(\bbnum 1+\bbnum 2\Rightarrow\bbnum 2\right) and find \begin_inset Formula \[ -\left|P\right|=\left|\bbnum 1+\left(\bbnum 1+\bbnum 2\Rightarrow\bbnum 2\right)\right|=1+\left|\bbnum 1+\bbnum 2\Rightarrow\bbnum 2\right|=1+8=9\quad. +\left|P\right|=\left|\bbnum 1+\left(\bbnum 1+\bbnum 2\rightarrow\bbnum 2\right)\right|=1+\left|\bbnum 1+\bbnum 2\rightarrow\bbnum 2\right|=1+8=9\quad. \] \end_inset @@ -20409,7 +20407,7 @@ P[A] for the type notation \begin_inset Formula \[ -P^{A}\triangleq1+A+\text{Int}\times A+(\text{String}\Rightarrow A)\quad. +P^{A}\triangleq1+A+\text{Int}\times A+(\text{String}\rightarrow A)\quad. \] \end_inset @@ -20745,8 +20743,8 @@ However, the corresponding logical identities To see that, we could derive the four formulas \begin_inset Formula \begin{align*} -\alpha\vee\alpha\Rightarrow\alpha\quad, & \quad\quad\alpha\Rightarrow\alpha\vee\alpha\quad,\\ -\alpha\wedge\alpha\Rightarrow\alpha\quad, & \quad\quad\alpha\Rightarrow\alpha\wedge\alpha\quad, +\alpha\vee\alpha\rightarrow\alpha\quad, & \quad\quad\alpha\rightarrow\alpha\vee\alpha\quad,\\ +\alpha\wedge\alpha\rightarrow\alpha\quad, & \quad\quad\alpha\rightarrow\alpha\wedge\alpha\quad, \end{align*} \end_inset @@ -20770,8 +20768,8 @@ noprefix "false" signatures \begin_inset Formula \begin{align*} -\forall A.\,A+A\Rightarrow A\quad, & \quad\quad\forall A.\,A\Rightarrow A+A\quad,\\ -\forall A.\,A\times A\Rightarrow A\quad, & \quad\quad\forall A.\,A\Rightarrow A\times A\quad +\forall A.\,A+A\rightarrow A\quad, & \quad\quad\forall A.\,A\rightarrow A+A\quad,\\ +\forall A.\,A\times A\rightarrow A\quad, & \quad\quad\forall A.\,A\rightarrow A\times A\quad \end{align*} \end_inset @@ -20866,16 +20864,16 @@ The code notation for these functions is \begin{align*} & f_{1}\triangleq\begin{array}{|c||c|} & A\\ -\hline A & a\Rightarrow a\\ -A & a\Rightarrow a +\hline A & a\rightarrow a\\ +A & a\rightarrow a \end{array}=\begin{array}{|c||c|} & A\\ \hline A & \text{id}\\ A & \text{id} \end{array}\quad,\\ - & f_{2}\triangleq a^{:A}\Rightarrow a+\bbnum 0^{:A}=\begin{array}{|c||cc|} + & f_{2}\triangleq a^{:A}\rightarrow a+\bbnum 0^{:A}=\begin{array}{|c||cc|} & A & A\\ -\hline A & a\Rightarrow a & \bbnum 0 +\hline A & a\rightarrow a & \bbnum 0 \end{array}=\begin{array}{|c||cc|} & A & A\\ \hline A & \text{id} & \bbnum 0 @@ -20955,8 +20953,8 @@ a2 The code notation for these functions is \begin_inset Formula \begin{align*} - & f_{1}\triangleq a_{1}^{:A}\times a_{2}^{:A}\Rightarrow a_{1}\quad,\\ - & f_{2}\triangleq a^{:A}\Rightarrow a\times a\quad. + & f_{1}\triangleq a_{1}^{:A}\times a_{2}^{:A}\rightarrow a_{1}\quad,\\ + & f_{2}\triangleq a^{:A}\rightarrow a\times a\quad. \end{align*} \end_inset @@ -20964,8 +20962,8 @@ The code notation for these functions is The composition of these functions is not equal to identity: \begin_inset Formula \begin{align*} -f_{1}\bef f_{2} & =\left(a_{1}\times a_{2}\Rightarrow a_{1}\right)\bef\left(a\Rightarrow a\times a\right)\\ - & =\left(a_{1}\times a_{2}\Rightarrow a_{1}\times a_{1}\right)\neq\text{id}=\left(a_{1}\times a_{2}\Rightarrow a_{1}\times a_{2}\right)\quad. +f_{1}\bef f_{2} & =\left(a_{1}\times a_{2}\rightarrow a_{1}\right)\bef\left(a\rightarrow a\times a\right)\\ + & =\left(a_{1}\times a_{2}\rightarrow a_{1}\times a_{1}\right)\neq\text{id}=\left(a_{1}\times a_{2}\rightarrow a_{1}\times a_{2}\right)\quad. \end{align*} \end_inset @@ -21007,7 +21005,7 @@ noprefix "false" \begin_layout Standard Show that -\begin_inset Formula $\left(\left(A\wedge B\right)\Longrightarrow C\right)\neq(A\Longrightarrow C)\vee(B\Longrightarrow C)$ +\begin_inset Formula $\left(\left(A\wedge B\right)Rightarrow C\right)\neq(ARightarrow C)\vee(BRightarrow C)$ \end_inset in the constructive logic, although the equality holds in Boolean logic. @@ -21023,8 +21021,8 @@ Solution Begin by rewriting the logical equality as two implications, \begin_inset Formula \begin{align*} - & (A\wedge B\Longrightarrow C)\Longrightarrow(A\Longrightarrow C)\vee(B\Longrightarrow C)\quad,\\ - & \left((A\Longrightarrow C)\vee(B\Longrightarrow C)\right)\Longrightarrow\left(\left(A\wedge B\right)\Longrightarrow C\right)\quad. + & (A\wedge BRightarrow C)Rightarrow(ARightarrow C)\vee(BRightarrow C)\quad,\\ + & \left((ARightarrow C)\vee(BRightarrow C)\right)Rightarrow\left(\left(A\wedge B\right)Rightarrow C\right)\quad. \end{align*} \end_inset @@ -21039,8 +21037,8 @@ no So the task is to implement fully parametric functions with the type signatures \begin_inset Formula \begin{align*} - & (A\times B\Rightarrow C)\Rightarrow(A\Rightarrow C)+(B\Rightarrow C)\quad,\\ - & (A\Rightarrow C)+(B\Rightarrow C)\Rightarrow A\times B\Rightarrow C\quad. + & (A\times B\rightarrow C)\rightarrow(A\rightarrow C)+(B\rightarrow C)\quad,\\ + & (A\rightarrow C)+(B\rightarrow C)\rightarrow A\times B\rightarrow C\quad. \end{align*} \end_inset @@ -21119,7 +21117,7 @@ k \end_inset of type -\begin_inset Formula $A\times B\Rightarrow C$ +\begin_inset Formula $A\times B\rightarrow C$ \end_inset , so the decision of whether to return a @@ -21313,29 +21311,29 @@ B => C \begin_layout Standard To repeat the same argument in the type notation: Obtaining a value of type -\begin_inset Formula $(A\Rightarrow C)+(B\Rightarrow C)$ +\begin_inset Formula $(A\rightarrow C)+(B\rightarrow C)$ \end_inset means to compute either -\begin_inset Formula $g^{:A\Rightarrow C}+\bbnum 0$ +\begin_inset Formula $g^{:A\rightarrow C}+\bbnum 0$ \end_inset or -\begin_inset Formula $\bbnum 0+h^{:B\Rightarrow C}$ +\begin_inset Formula $\bbnum 0+h^{:B\rightarrow C}$ \end_inset . This decision must be hard-coded since the only data is a function -\begin_inset Formula $k^{:A\times B\Rightarrow C}$ +\begin_inset Formula $k^{:A\times B\rightarrow C}$ \end_inset . We can compute a -\begin_inset Formula $g^{:A\Rightarrow C}$ +\begin_inset Formula $g^{:A\rightarrow C}$ \end_inset only by partially applying -\begin_inset Formula $k^{:A\times B\Rightarrow C}$ +\begin_inset Formula $k^{:A\times B\rightarrow C}$ \end_inset to a value of type @@ -21349,7 +21347,7 @@ To repeat the same argument in the type notation: Obtaining a value of type . Similarly, we cannot get an -\begin_inset Formula $h^{:B\Rightarrow C}$ +\begin_inset Formula $h^{:B\rightarrow C}$ \end_inset . @@ -21422,9 +21420,9 @@ def f2[A,B,C]: Either[A=>C, B=>C] => ((A,B)) => C = { \begin_inset Formula \[ f_{2}\triangleq\begin{array}{|c||c|} - & A\times B\Rightarrow C\\ -\hline A\Rightarrow C & g^{:A\Rightarrow C}\Rightarrow a\times b\Rightarrow g(a)\\ -B\Rightarrow C & h^{:B\Rightarrow C}\Rightarrow a\times b\Rightarrow h(b) + & A\times B\rightarrow C\\ +\hline A\rightarrow C & g^{:A\rightarrow C}\rightarrow a\times b\rightarrow g(a)\\ +B\rightarrow C & h^{:B\rightarrow C}\rightarrow a\times b\rightarrow h(b) \end{array}\quad. \] @@ -21441,7 +21439,7 @@ B\Rightarrow C & h^{:B\Rightarrow C}\Rightarrow a\times b\Rightarrow h(b) Let us now show that the logical identity \begin_inset Formula \begin{equation} -((\alpha\wedge\beta)\Longrightarrow\gamma)=((\alpha\Longrightarrow\gamma)\vee(\beta\Longrightarrow\gamma))\label{eq:ch-example-identity-boolean-not-constructive} +((\alpha\wedge\beta)Rightarrow\gamma)=((\alphaRightarrow\gamma)\vee(\betaRightarrow\gamma))\label{eq:ch-example-identity-boolean-not-constructive} \end{equation} \end_inset @@ -21466,10 +21464,10 @@ noprefix "false" We find \begin_inset Formula \begin{align*} -\text{left-hand side of Eq.~(\ref{eq:ch-example-identity-boolean-not-constructive})}:\quad & \left(\alpha\wedge\beta\right)\gunderline{\Longrightarrow}\,\gamma\\ +\text{left-hand side of Eq.~(\ref{eq:ch-example-identity-boolean-not-constructive})}:\quad & \left(\alpha\wedge\beta\right)\gunderline{Rightarrow}\,\gamma\\ \text{use Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:\quad & =\gunderline{\neg(\alpha\wedge\beta)}\vee\gamma\\ \text{use de Morgan's law}:\quad & =\neg\alpha\vee\neg\beta\vee\gamma\quad.\\ -\text{right-hand side of Eq.~(\ref{eq:ch-example-identity-boolean-not-constructive})}:\quad & (\gunderline{\alpha\Longrightarrow\gamma})\vee(\gunderline{\beta\Longrightarrow\gamma})\\ +\text{right-hand side of Eq.~(\ref{eq:ch-example-identity-boolean-not-constructive})}:\quad & (\gunderline{\alphaRightarrow\gamma})\vee(\gunderline{\betaRightarrow\gamma})\\ \text{use Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:\quad & =\neg\alpha\vee\gunderline{\gamma}\vee\neg\beta\vee\gunderline{\gamma}\\ \text{use identity }\gamma\vee\gamma=\gamma:\quad & =\neg\alpha\vee\neg\beta\vee\gamma\quad. \end{align*} @@ -21553,7 +21551,7 @@ noprefix "false" . The left-hand side, -\begin_inset Formula $\left(\alpha\wedge\beta\right)\Longrightarrow\gamma$ +\begin_inset Formula $\left(\alpha\wedge\beta\right)Rightarrow\gamma$ \end_inset , can be @@ -21593,7 +21591,7 @@ noprefix "false" \end_inset , the formula -\begin_inset Formula $\left(\alpha\wedge\beta\right)\Longrightarrow\gamma$ +\begin_inset Formula $\left(\alpha\wedge\beta\right)Rightarrow\gamma$ \end_inset is @@ -21602,7 +21600,7 @@ noprefix "false" . Let us determine when the right-hand side, -\begin_inset Formula $(\alpha\Longrightarrow\gamma)\vee(\beta\Longrightarrow\gamma)$ +\begin_inset Formula $(\alphaRightarrow\gamma)\vee(\betaRightarrow\gamma)$ \end_inset , can be @@ -21817,7 +21815,7 @@ Use known rules to verify the type equivalences: (b) \series default -\begin_inset Formula $\left(\bbnum 1+A+B\right)\Rightarrow\bbnum 1\times B\cong\left(B\Rightarrow B\right)\times\left(A\Rightarrow B\right)\times B$ +\begin_inset Formula $\left(\bbnum 1+A+B\right)\rightarrow\bbnum 1\times B\cong\left(B\rightarrow B\right)\times\left(A\rightarrow B\right)\times B$ \end_inset . @@ -21865,12 +21863,12 @@ A\times A\times A+A\times A\times\left(\bbnum 1+\bbnum 1+\bbnum 1\right)+A\times \series default Keep in mind that the conventions of the type notation make the function arrow -\begin_inset Formula $\left(\Rightarrow\right)$ +\begin_inset Formula $\left(\rightarrow\right)$ \end_inset group weaker than other type operations. So, the type expression -\begin_inset Formula $\left(\bbnum 1+A+B\right)\Rightarrow\bbnum 1\times B$ +\begin_inset Formula $\left(\bbnum 1+A+B\right)\rightarrow\bbnum 1\times B$ \end_inset means a function from @@ -21891,14 +21889,14 @@ Begin by using the rule \end_inset to obtain -\begin_inset Formula $\left(\bbnum 1+A+B\right)\Rightarrow B$ +\begin_inset Formula $\left(\bbnum 1+A+B\right)\rightarrow B$ \end_inset . Now we use the rule \begin_inset Formula \[ -A+B\Rightarrow C\cong\left(A\Rightarrow C\right)\times\left(B\Rightarrow C\right) +A+B\rightarrow C\cong\left(A\rightarrow C\right)\times\left(B\rightarrow C\right) \] \end_inset @@ -21906,20 +21904,20 @@ A+B\Rightarrow C\cong\left(A\Rightarrow C\right)\times\left(B\Rightarrow C\right and derive the equivalence \begin_inset Formula \[ -\left(\bbnum 1+A+B\right)\Rightarrow B\cong\left(\bbnum 1\Rightarrow B\right)\times\left(A\Rightarrow B\right)\times\left(B\Rightarrow B\right)\quad. +\left(\bbnum 1+A+B\right)\rightarrow B\cong\left(\bbnum 1\rightarrow B\right)\times\left(A\rightarrow B\right)\times\left(B\rightarrow B\right)\quad. \] \end_inset Finally, we note that -\begin_inset Formula $\bbnum 1\Rightarrow B\cong B$ +\begin_inset Formula $\bbnum 1\rightarrow B\cong B$ \end_inset and that the type product is commutative, so we can rearrange the last type expression into the required form: \begin_inset Formula \[ -B\times\left(A\Rightarrow B\right)\times\left(B\Rightarrow B\right)\cong\left(B\Rightarrow B\right)\times\left(A\Rightarrow B\right)\times B\quad. +B\times\left(A\rightarrow B\right)\times\left(B\rightarrow B\right)\cong\left(B\rightarrow B\right)\times\left(A\rightarrow B\right)\times B\quad. \] \end_inset @@ -21950,15 +21948,15 @@ noprefix "false" \begin_layout Standard Denote -\begin_inset Formula $\text{Read}^{E,T}\triangleq E\Rightarrow T$ +\begin_inset Formula $\text{Read}^{E,T}\triangleq E\rightarrow T$ \end_inset and implement fully parametric functions with types -\begin_inset Formula $A\Rightarrow\text{Read}^{E,A}$ +\begin_inset Formula $A\rightarrow\text{Read}^{E,A}$ \end_inset and -\begin_inset Formula $\text{Read}^{E,A}\Rightarrow(A\Rightarrow B)\Rightarrow\text{Read}^{E,B}$ +\begin_inset Formula $\text{Read}^{E,A}\rightarrow(A\rightarrow B)\rightarrow\text{Read}^{E,B}$ \end_inset . @@ -22060,16 +22058,16 @@ def map[E, A, B]: Read[E, A] => (A => B) => Read[E, B] = ??? Expanding the type alias, we see that the two curried arguments are functions of types -\begin_inset Formula $E\Rightarrow A$ +\begin_inset Formula $E\rightarrow A$ \end_inset and -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset . The forward composition of these functions is a function of type -\begin_inset Formula $E\Rightarrow B$ +\begin_inset Formula $E\rightarrow B$ \end_inset , or @@ -22103,11 +22101,11 @@ If we did not notice this shortcut, we would reason differently: We are three \emph default curried arguments -\begin_inset Formula $r^{:E\Rightarrow A}$ +\begin_inset Formula $r^{:E\rightarrow A}$ \end_inset , -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset , and @@ -22118,7 +22116,7 @@ three Write this requirement as \begin_inset Formula \[ -\text{map}\triangleq r^{:E\Rightarrow A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow e^{:E}\Rightarrow???^{:B}\quad, +\text{map}\triangleq r^{:E\rightarrow A}\rightarrow f^{:A\rightarrow B}\rightarrow e^{:E}\rightarrow???^{:B}\quad, \] \end_inset @@ -22185,7 +22183,7 @@ To fill the typed hole \end_inset is to apply -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset to some value of type @@ -22196,7 +22194,7 @@ To fill the typed hole So we write \begin_inset Formula \[ -\text{map}\triangleq r^{:E\Rightarrow A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow e^{:E}\Rightarrow f(???^{:A})\quad. +\text{map}\triangleq r^{:E\rightarrow A}\rightarrow f^{:A\rightarrow B}\rightarrow e^{:E}\rightarrow f(???^{:A})\quad. \] \end_inset @@ -22216,7 +22214,7 @@ The only way of getting an , \begin_inset Formula \[ -\text{map}\triangleq r^{:E\Rightarrow A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow e^{:E}\Rightarrow f(r(???^{:E}))\quad. +\text{map}\triangleq r^{:E\rightarrow A}\rightarrow f^{:A\rightarrow B}\rightarrow e^{:E}\rightarrow f(r(???^{:E}))\quad. \] \end_inset @@ -22233,7 +22231,7 @@ We have exactly one value of type So the code must be \begin_inset Formula \[ -\text{map}^{E,A,B}\triangleq r^{:E\Rightarrow A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow e^{:E}\Rightarrow f(r(e))\quad. +\text{map}^{E,A,B}\triangleq r^{:E\rightarrow A}\rightarrow f^{:A\rightarrow B}\rightarrow e^{:E}\rightarrow f(r(e))\quad. \] \end_inset @@ -22252,7 +22250,7 @@ def map[E, A, B]: (E => A) => (A => B) => E => B = { r => f => e => f(r(e)) \end_inset We may now notice that the expression -\begin_inset Formula $e\Rightarrow f(r(e))$ +\begin_inset Formula $e\rightarrow f(r(e))$ \end_inset is a function composition @@ -22321,11 +22319,11 @@ def m[A, B, T] : (A => T) => (A => B) => B => T = { r => f => b => ??? } \end_inset Given values -\begin_inset Formula $r^{:A\Rightarrow T}$ +\begin_inset Formula $r^{:A\rightarrow T}$ \end_inset , -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset , and @@ -22339,7 +22337,7 @@ Given values : \begin_inset Formula \[ -m=r^{:A\Rightarrow T}\Rightarrow f^{:A\Rightarrow B}\Rightarrow b^{:B}\Rightarrow???^{:T}\quad. +m=r^{:A\rightarrow T}\rightarrow f^{:A\rightarrow B}\rightarrow b^{:B}\rightarrow???^{:T}\quad. \] \end_inset @@ -22359,7 +22357,7 @@ The only way of getting a , \begin_inset Formula \[ -m=r^{:A\Rightarrow T}\Rightarrow f^{:A\Rightarrow B}\Rightarrow b^{:B}\Rightarrow r(???^{:A})\quad. +m=r^{:A\rightarrow T}\rightarrow f^{:A\rightarrow B}\rightarrow b^{:B}\rightarrow r(???^{:A})\quad. \] \end_inset @@ -22370,7 +22368,7 @@ However, we do not have any values of type . We have a function -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset that @@ -22425,7 +22423,7 @@ m is unimplementable, we need to prove that the logical formula \begin_inset Formula \begin{equation} -\forall(\alpha,\beta,\tau).\,(\alpha\Longrightarrow\tau)\Longrightarrow(\alpha\Longrightarrow\beta)\Longrightarrow(\beta\Longrightarrow\tau)\label{eq:ch-example-boolean-formula-3} +\forall(\alpha,\beta,\tau).\,(\alphaRightarrow\tau)Rightarrow(\alphaRightarrow\beta)Rightarrow(\betaRightarrow\tau)\label{eq:ch-example-boolean-formula-3} \end{equation} \end_inset @@ -22527,8 +22525,8 @@ noprefix "false" ) with the rules of Boolean logic, we find \begin_inset Formula \begin{align*} - & (\alpha\Longrightarrow\tau)\,\gunderline{\Longrightarrow}\,(\alpha\Longrightarrow\beta)\,\gunderline{\Longrightarrow}\,(\beta\Longrightarrow\tau)\\ -\text{use Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:\quad & =\neg(\gunderline{\alpha\Longrightarrow\tau})\vee\neg(\gunderline{\alpha\Longrightarrow\beta})\vee(\gunderline{\beta\Longrightarrow\tau})\\ + & (\alphaRightarrow\tau)\,\gunderline{Rightarrow}\,(\alphaRightarrow\beta)\,\gunderline{Rightarrow}\,(\betaRightarrow\tau)\\ +\text{use Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:\quad & =\neg(\gunderline{\alphaRightarrow\tau})\vee\neg(\gunderline{\alphaRightarrow\beta})\vee(\gunderline{\betaRightarrow\tau})\\ \text{use Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:\quad & =\gunderline{\neg(\neg\alpha\vee\tau)}\vee\gunderline{\neg(\neg\alpha\vee\beta)}\vee(\neg\beta\vee\tau)\\ \text{use de Morgan's law}:\quad & =\left(\alpha\wedge\neg\tau\right)\vee\gunderline{\left(\alpha\wedge\neg\beta\right)\vee\neg\beta}\vee\tau\\ \text{use identity }(p\wedge q)\vee q=q:\quad & =\gunderline{\left(\alpha\wedge\neg\tau\right)}\vee\neg\beta\vee\gunderline{\tau}\\ @@ -22625,7 +22623,7 @@ map for it, \begin_inset Formula \[ -\text{map}^{A,B}:P^{A}\Rightarrow(A\Rightarrow B)\Rightarrow P^{B}\quad. +\text{map}^{A,B}:P^{A}\rightarrow(A\rightarrow B)\rightarrow P^{B}\quad. \] \end_inset @@ -22773,7 +22771,7 @@ P2(x) \end_inset and a function -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset . @@ -23057,7 +23055,7 @@ map : \begin_inset Formula \[ -\text{map}^{A,B}\triangleq p^{:\bbnum 1+A+A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow p\triangleright\begin{array}{|c||ccc|} +\text{map}^{A,B}\triangleq p^{:\bbnum 1+A+A}\rightarrow f^{:A\rightarrow B}\rightarrow p\triangleright\begin{array}{|c||ccc|} & \bbnum 1 & B & B\\ \hline \bbnum 1 & \text{id} & \bbnum 0 & \bbnum 0\\ A & \bbnum 0 & f & \bbnum 0\\ @@ -23214,8 +23212,8 @@ flatMap are \begin_inset Formula \begin{align*} -\text{map} & :P^{A}\Rightarrow(A\Rightarrow B)\Rightarrow P^{B}\quad,\\ -\text{flatMap} & :P^{A}\Rightarrow(A\Rightarrow P^{B})\Rightarrow P^{B}\quad. +\text{map} & :P^{A}\rightarrow(A\rightarrow B)\rightarrow P^{B}\quad,\\ +\text{flatMap} & :P^{A}\rightarrow(A\rightarrow P^{B})\rightarrow P^{B}\quad. \end{align*} \end_inset @@ -23260,8 +23258,8 @@ flatMap , the type signatures are \begin_inset Formula \begin{align*} -\text{map} & :P^{A,S,T}\Rightarrow(A\Rightarrow B)\Rightarrow P^{B,S,T}\quad,\\ -\text{flatMap} & :P^{A,S,T}\Rightarrow(A\Rightarrow P^{B,S,T})\Rightarrow P^{B,S,T}\quad. +\text{map} & :P^{A,S,T}\rightarrow(A\rightarrow B)\rightarrow P^{B,S,T}\quad,\\ +\text{flatMap} & :P^{A,S,T}\rightarrow(A\rightarrow P^{B,S,T})\rightarrow P^{B,S,T}\quad. \end{align*} \end_inset @@ -23358,8 +23356,8 @@ Either[L, R] So we obtain the type signatures \begin_inset Formula \begin{align*} -\text{map} & :L+R\Rightarrow(L\Rightarrow M)\Rightarrow M+R\quad,\\ -\text{flatMap} & :L+R\Rightarrow(L\Rightarrow M+R)\Rightarrow M+R\quad. +\text{map} & :L+R\rightarrow(L\rightarrow M)\rightarrow M+R\quad,\\ +\text{flatMap} & :L+R\rightarrow(L\rightarrow M+R)\rightarrow M+R\quad. \end{align*} \end_inset @@ -23416,15 +23414,15 @@ def flatMap[L,M,R]: Either[L, R] => (L => Either[M, R]) => Either[M, R] The code notation for these functions is \begin_inset Formula \begin{align*} -\text{map} & \triangleq e^{:L+R}\Rightarrow f^{:L\Rightarrow M}\Rightarrow e\triangleright\begin{array}{|c||cc|} +\text{map} & \triangleq e^{:L+R}\rightarrow f^{:L\rightarrow M}\rightarrow e\triangleright\begin{array}{|c||cc|} & M & R\\ \hline L & f & \bbnum 0\\ R & \bbnum 0 & \text{id} \end{array}\quad,\\ -\text{flatMap} & \triangleq e^{:L+R}\Rightarrow f^{:L\Rightarrow M+R}\Rightarrow e\triangleright\begin{array}{|c||c|} +\text{flatMap} & \triangleq e^{:L+R}\rightarrow f^{:L\rightarrow M+R}\rightarrow e\triangleright\begin{array}{|c||c|} & M+R\\ \hline L & f\\ -R & y^{:R}\Rightarrow\bbnum 0^{:M}+y +R & y^{:R}\rightarrow\bbnum 0^{:M}+y \end{array}\quad. \end{align*} @@ -23476,7 +23474,7 @@ noprefix "false" \begin_layout Standard Define a type -\begin_inset Formula $\text{State}^{S,A}\equiv S\Rightarrow A\times S$ +\begin_inset Formula $\text{State}^{S,A}\equiv S\rightarrow A\times S$ \end_inset and implement the functions: @@ -23488,7 +23486,7 @@ Define a type (a) \series default -\begin_inset Formula $\text{pure}^{S,A}:A\Rightarrow\text{State}^{S,A}\quad.$ +\begin_inset Formula $\text{pure}^{S,A}:A\rightarrow\text{State}^{S,A}\quad.$ \end_inset @@ -23500,7 +23498,7 @@ Define a type (b) \series default -\begin_inset Formula $\text{map}^{S,A,B}:\text{State}^{S,A}\Rightarrow(A\Rightarrow B)\Rightarrow\text{State}^{S,B}\quad.$ +\begin_inset Formula $\text{map}^{S,A,B}:\text{State}^{S,A}\rightarrow(A\rightarrow B)\rightarrow\text{State}^{S,B}\quad.$ \end_inset @@ -23512,7 +23510,7 @@ Define a type (c) \series default -\begin_inset Formula $\text{flatMap}^{S,A,B}:\text{State}^{S,A}\Rightarrow(A\Rightarrow\text{State}^{S,B})\Rightarrow\text{State}^{S,B}\quad.$ +\begin_inset Formula $\text{flatMap}^{S,A,B}:\text{State}^{S,A}\rightarrow(A\rightarrow\text{State}^{S,B})\rightarrow\text{State}^{S,B}\quad.$ \end_inset @@ -23546,7 +23544,7 @@ type State[S, A] = S => (A, S) (a) \series default The type signature is -\begin_inset Formula $A\Rightarrow S\Rightarrow A\times S$ +\begin_inset Formula $A\rightarrow S\rightarrow A\times S$ \end_inset , and there is only one implementation, @@ -23564,7 +23562,7 @@ def pure[S, A]: A => State[S, A] = a => s => (a, s) In the code notation, this is written as \begin_inset Formula \[ -\text{pu}^{S,A}\triangleq a^{:A}\Rightarrow s^{:A}\Rightarrow a\times s\quad. +\text{pu}^{S,A}\triangleq a^{:A}\rightarrow s^{:A}\rightarrow a\times s\quad. \] \end_inset @@ -23580,7 +23578,7 @@ In the code notation, this is written as The explicit type signature is \begin_inset Formula \[ -\text{map}^{S,A,B}:(S\Rightarrow A\times S)\Rightarrow(A\Rightarrow B)\Rightarrow S\Rightarrow B\times S\quad. +\text{map}^{S,A,B}:(S\rightarrow A\times S)\rightarrow(A\rightarrow B)\rightarrow S\rightarrow B\times S\quad. \] \end_inset @@ -23603,11 +23601,11 @@ We need to compute a value of \end_inset from the curried arguments -\begin_inset Formula $t^{:S\Rightarrow A\times S}$ +\begin_inset Formula $t^{:S\rightarrow A\times S}$ \end_inset , -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset , and @@ -23630,7 +23628,7 @@ map as a typed hole, \begin_inset Formula \[ -\text{map}\triangleq t^{:S\Rightarrow A\times S}\Rightarrow f^{:A\Rightarrow B}\Rightarrow s^{:S}\Rightarrow\text{???}^{:B}\times\text{???}^{:S}\quad. +\text{map}\triangleq t^{:S\rightarrow A\times S}\rightarrow f^{:A\rightarrow B}\rightarrow s^{:S}\rightarrow\text{???}^{:B}\times\text{???}^{:S}\quad. \] \end_inset @@ -23650,7 +23648,7 @@ The only way of getting a value of type : \begin_inset Formula \[ -\text{map}\triangleq t^{:S\Rightarrow A\times S}\Rightarrow f^{:A\Rightarrow B}\Rightarrow s^{:S}\Rightarrow f(\text{???}^{:A})\times\text{???}^{:S}\quad. +\text{map}\triangleq t^{:S\rightarrow A\times S}\rightarrow f^{:A\rightarrow B}\rightarrow s^{:S}\rightarrow f(\text{???}^{:A})\times\text{???}^{:S}\quad. \] \end_inset @@ -23842,7 +23840,7 @@ map We can write explicit destructuring code like this: \begin_inset Formula \[ -\text{map}\triangleq t^{:S\Rightarrow A\times S}\Rightarrow f^{:A\Rightarrow B}\Rightarrow s^{:S}\Rightarrow(a^{:A}\times s_{2}^{:S}\Rightarrow f(a)\times s_{2})(t(s))\quad. +\text{map}\triangleq t^{:S\rightarrow A\times S}\rightarrow f^{:A\rightarrow B}\rightarrow s^{:S}\rightarrow(a^{:A}\times s_{2}^{:S}\rightarrow f(a)\times s_{2})(t(s))\quad. \] \end_inset @@ -23854,13 +23852,13 @@ If we temporarily denote by the destructuring function \begin_inset Formula \[ -q\triangleq(a^{:A}\times s_{2}^{:S}\Rightarrow f(a)\times s_{2})\quad, +q\triangleq(a^{:A}\times s_{2}^{:S}\rightarrow f(a)\times s_{2})\quad, \] \end_inset we will notice that the expression -\begin_inset Formula $s\Rightarrow q(t(s))$ +\begin_inset Formula $s\rightarrow q(t(s))$ \end_inset is a function composition applied to @@ -23869,7 +23867,7 @@ we will notice that the expression . So, we rewrite -\begin_inset Formula $s\Rightarrow q(t(s))$ +\begin_inset Formula $s\rightarrow q(t(s))$ \end_inset as the composition @@ -23879,7 +23877,7 @@ we will notice that the expression and obtain shorter code, \begin_inset Formula \[ -\text{map}\triangleq t^{:S\Rightarrow A\times S}\Rightarrow f^{:A\Rightarrow B}\Rightarrow t\bef(a^{:A}\times s^{:S}\Rightarrow f(a)\times s)\quad. +\text{map}\triangleq t^{:S\rightarrow A\times S}\rightarrow f^{:A\rightarrow B}\rightarrow t\bef(a^{:A}\times s^{:S}\rightarrow f(a)\times s)\quad. \] \end_inset @@ -23896,7 +23894,7 @@ Shorter formulas are often easier to reason about in derivations (although The required type signature is \begin_inset Formula \[ -\text{flatMap}^{S,A,B}:(S\Rightarrow A\times S)\Rightarrow(A\Rightarrow S\Rightarrow B\times S)\Rightarrow S\Rightarrow B\times S\quad. +\text{flatMap}^{S,A,B}:(S\rightarrow A\times S)\rightarrow(A\rightarrow S\rightarrow B\times S)\rightarrow S\rightarrow B\times S\quad. \] \end_inset @@ -23904,7 +23902,7 @@ Shorter formulas are often easier to reason about in derivations (although We perform t reasoning with typed holes: \begin_inset Formula \[ -\text{flatMap}\triangleq t^{:S\Rightarrow A\times S}\Rightarrow f^{:A\Rightarrow S\Rightarrow B\times S}\Rightarrow s^{:S}\Rightarrow\text{???}^{:B}\times???^{:S}\quad. +\text{flatMap}\triangleq t^{:S\rightarrow A\times S}\rightarrow f^{:A\rightarrow S\rightarrow B\times S}\rightarrow s^{:S}\rightarrow\text{???}^{:B}\times???^{:S}\quad. \] \end_inset @@ -23937,7 +23935,7 @@ To fill , which we can return without change: \begin_inset Formula \[ -\text{flatMap}\triangleq t^{:S\Rightarrow A\times S}\Rightarrow f^{:A\Rightarrow S\Rightarrow B\times S}\Rightarrow s^{:S}\Rightarrow f(\text{???}^{:A})(\text{???}^{:S})\quad. +\text{flatMap}\triangleq t^{:S\rightarrow A\times S}\rightarrow f^{:A\rightarrow S\rightarrow B\times S}\rightarrow s^{:S}\rightarrow f(\text{???}^{:A})(\text{???}^{:S})\quad. \] \end_inset @@ -23966,7 +23964,7 @@ To fill the new typed holes, we need to apply and destructure it: \begin_inset Formula \[ -\text{flatMap}\triangleq t^{:S\Rightarrow A\times S}\Rightarrow f^{:A\Rightarrow S\Rightarrow B\times S}\Rightarrow s^{:S}\Rightarrow\left(a\times s_{2}\Rightarrow f(a)(s_{2})\right)(t(s))\quad. +\text{flatMap}\triangleq t^{:S\rightarrow A\times S}\rightarrow f^{:A\rightarrow S\rightarrow B\times S}\rightarrow s^{:S}\rightarrow\left(a\times s_{2}\rightarrow f(a)(s_{2})\right)(t(s))\quad. \] \end_inset @@ -24035,7 +24033,7 @@ flatMap can be simplified to \begin_inset Formula \[ -\text{flatMap}\triangleq t^{:S\Rightarrow A\times S}\Rightarrow f^{:A\Rightarrow S\Rightarrow B\times S}\Rightarrow t\bef\left(a\times s\Rightarrow f(a)(s)\right)\quad. +\text{flatMap}\triangleq t^{:S\rightarrow A\times S}\rightarrow f^{:A\rightarrow S\rightarrow B\times S}\rightarrow t\bef\left(a\times s\rightarrow f(a)(s)\right)\quad. \] \end_inset @@ -24152,7 +24150,7 @@ Verify the type equivalences \end_inset and -\begin_inset Formula $A\times A\cong\bbnum 2\Rightarrow A$ +\begin_inset Formula $A\times A\cong\bbnum 2\rightarrow A$ \end_inset , where @@ -24197,7 +24195,7 @@ noprefix "false" \begin_layout Standard Show that -\begin_inset Formula $A\Longrightarrow(B\vee C)\neq(A\Longrightarrow B)\wedge(A\Longrightarrow C)$ +\begin_inset Formula $ARightarrow(B\vee C)\neq(ARightarrow B)\wedge(ARightarrow C)$ \end_inset in logic. @@ -24234,7 +24232,7 @@ Use known rules to verify the type equivalences: (a) \series default -\begin_inset Formula $\left(A+B\right)\times\left(A\Rightarrow B\right)\cong A\times\left(A\Rightarrow B\right)+\left(\bbnum 1+A\Rightarrow B\right)\quad.$ +\begin_inset Formula $\left(A+B\right)\times\left(A\rightarrow B\right)\cong A\times\left(A\rightarrow B\right)+\left(\bbnum 1+A\rightarrow B\right)\quad.$ \end_inset @@ -24246,7 +24244,7 @@ Use known rules to verify the type equivalences: (b) \series default -\begin_inset Formula $\left(A\times(\bbnum 1+A)\Rightarrow B\right)\cong\left(A\Rightarrow B\right)\times\left(A\Rightarrow A\Rightarrow B\right)\quad.$ +\begin_inset Formula $\left(A\times(\bbnum 1+A)\rightarrow B\right)\cong\left(A\rightarrow B\right)\times\left(A\rightarrow A\rightarrow B\right)\quad.$ \end_inset @@ -24258,7 +24256,7 @@ Use known rules to verify the type equivalences: (c) \series default -\begin_inset Formula $A\Rightarrow\left(\bbnum 1+B\right)\Rightarrow C\times D\cong\left(A\Rightarrow C\right)\times\left(A\Rightarrow D\right)\times\left(A\times B\Rightarrow C\right)\times\left(A\times B\Rightarrow D\right)\quad.$ +\begin_inset Formula $A\rightarrow\left(\bbnum 1+B\right)\rightarrow C\times D\cong\left(A\rightarrow C\right)\times\left(A\rightarrow D\right)\times\left(A\times B\rightarrow C\right)\times\left(A\times B\rightarrow D\right)\quad.$ \end_inset @@ -24382,8 +24380,8 @@ Either[Option[A], T] The required type signatures are \begin_inset Formula \begin{align*} -\text{map}^{A,B,T} & :\text{OptE}^{T,A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow\text{OptE}^{T,B}\quad,\\ -\text{flatMap}^{A,B,T} & :\text{OptE}^{T,A}\Rightarrow(A\Rightarrow\text{OptE}^{T,B})\Rightarrow\text{OptE}^{T,B}\quad. +\text{map}^{A,B,T} & :\text{OptE}^{T,A}\rightarrow\left(A\rightarrow B\right)\rightarrow\text{OptE}^{T,B}\quad,\\ +\text{flatMap}^{A,B,T} & :\text{OptE}^{T,A}\rightarrow(A\rightarrow\text{OptE}^{T,B})\rightarrow\text{OptE}^{T,B}\quad. \end{align*} \end_inset @@ -24453,7 +24451,7 @@ noprefix "false" ). The required type signature is -\begin_inset Formula $P^{A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow P^{B}$ +\begin_inset Formula $P^{A}\rightarrow\left(A\rightarrow B\right)\rightarrow P^{B}$ \end_inset . @@ -24514,7 +24512,7 @@ map function with the type signature \begin_inset Formula \[ -\text{map}^{T,A,B}:Q^{T,A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow Q^{T,B}\quad. +\text{map}^{T,A,B}:Q^{T,A}\rightarrow\left(A\rightarrow B\right)\rightarrow Q^{T,B}\quad. \] \end_inset @@ -24567,7 +24565,7 @@ map function for it, with the standard type signature \begin_inset Formula \[ -\text{map}^{A,B}:\text{Tr}_{3}{}^{A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow\text{Tr}_{3}{}^{B}\quad. +\text{map}^{A,B}:\text{Tr}_{3}{}^{A}\rightarrow\left(A\rightarrow B\right)\rightarrow\text{Tr}_{3}{}^{B}\quad. \] \end_inset @@ -24606,7 +24604,7 @@ Implement fully parametric functions with the following types: (a) \series default -\begin_inset Formula $A+Z\Rightarrow(A\Rightarrow B)\Rightarrow B+Z\quad.$ +\begin_inset Formula $A+Z\rightarrow(A\rightarrow B)\rightarrow B+Z\quad.$ \end_inset @@ -24618,7 +24616,7 @@ Implement fully parametric functions with the following types: (b) \series default -\begin_inset Formula $A+Z\Rightarrow B+Z\Rightarrow(A\Rightarrow B\Rightarrow C)\Rightarrow C+Z\quad.$ +\begin_inset Formula $A+Z\rightarrow B+Z\rightarrow(A\rightarrow B\rightarrow C)\rightarrow C+Z\quad.$ \end_inset @@ -24630,7 +24628,7 @@ Implement fully parametric functions with the following types: (c) \series default -\begin_inset Formula $\text{flatMap}^{E,A,B}:\text{Read}^{E,A}\Rightarrow(A\Rightarrow\text{Read}^{E,B})\Rightarrow\text{Read}^{E,B}\quad.$ +\begin_inset Formula $\text{flatMap}^{E,A,B}:\text{Read}^{E,A}\rightarrow(A\rightarrow\text{Read}^{E,B})\rightarrow\text{Read}^{E,B}\quad.$ \end_inset @@ -24642,7 +24640,7 @@ Implement fully parametric functions with the following types: (d) \series default -\begin_inset Formula $\text{State}^{S,A}\Rightarrow\left(S\times A\Rightarrow S\times B\right)\Rightarrow\text{State}^{S,B}\quad.$ +\begin_inset Formula $\text{State}^{S,A}\rightarrow\left(S\times A\rightarrow S\times B\right)\rightarrow\text{State}^{S,B}\quad.$ \end_inset @@ -24671,7 +24669,7 @@ noprefix "false" \begin_layout Standard Denote -\begin_inset Formula $\text{Cont}^{R,T}\triangleq\left(T\Rightarrow R\right)\Rightarrow R$ +\begin_inset Formula $\text{Cont}^{R,T}\triangleq\left(T\rightarrow R\right)\rightarrow R$ \end_inset and implement the functions: @@ -24683,7 +24681,7 @@ Denote (a) \series default -\begin_inset Formula $\text{map}^{R,T,U}:\text{Cont}^{R,T}\Rightarrow(T\Rightarrow U)\Rightarrow\text{Cont}^{R,U}\quad.$ +\begin_inset Formula $\text{map}^{R,T,U}:\text{Cont}^{R,T}\rightarrow(T\rightarrow U)\rightarrow\text{Cont}^{R,U}\quad.$ \end_inset @@ -24695,7 +24693,7 @@ Denote (b) \series default -\begin_inset Formula $\text{flatMap}^{R,T,U}:\text{Cont}^{R,T}\Rightarrow(T\Rightarrow\text{Cont}^{R,U})\Rightarrow\text{Cont}^{R,U}\quad.$ +\begin_inset Formula $\text{flatMap}^{R,T,U}:\text{Cont}^{R,T}\rightarrow(T\rightarrow\text{Cont}^{R,U})\rightarrow\text{Cont}^{R,U}\quad.$ \end_inset @@ -24724,7 +24722,7 @@ noprefix "false" \begin_layout Standard Denote -\begin_inset Formula $\text{Select}^{Z,T}\triangleq\left(T\Rightarrow Z\right)\Rightarrow T$ +\begin_inset Formula $\text{Select}^{Z,T}\triangleq\left(T\rightarrow Z\right)\rightarrow T$ \end_inset and implement the functions: @@ -24736,7 +24734,7 @@ Denote (a) \series default -\begin_inset Formula $\text{map}^{Z,A,B}:\text{Select}^{Z,A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow\text{Select}^{Z,B}\quad.$ +\begin_inset Formula $\text{map}^{Z,A,B}:\text{Select}^{Z,A}\rightarrow\left(A\rightarrow B\right)\rightarrow\text{Select}^{Z,B}\quad.$ \end_inset @@ -24748,7 +24746,7 @@ Denote (b) \series default -\begin_inset Formula $\text{flatMap}^{Z,A,B}:\text{Select}^{Z,A}\Rightarrow(A\Rightarrow\text{Select}^{Z,B})\Rightarrow\text{Select}^{Z,B}\quad.$ +\begin_inset Formula $\text{flatMap}^{Z,A,B}:\text{Select}^{Z,A}\rightarrow(A\rightarrow\text{Select}^{Z,B})\rightarrow\text{Select}^{Z,B}\quad.$ \end_inset @@ -24924,7 +24922,7 @@ Int => Int is not a meaningful task. Only a fully parametric type signature, such as -\begin_inset Formula $A\Rightarrow\left(A\Rightarrow B\right)\Rightarrow B$ +\begin_inset Formula $A\rightarrow\left(A\rightarrow B\right)\rightarrow B$ \end_inset , gives enough information for possibly deriving the function's code. @@ -25804,7 +25802,7 @@ negation It is defined as \begin_inset Formula \[ -\neg\alpha\triangleq\alpha\Longrightarrow False\quad, +\neg\alpha\triangleq\alphaRightarrow False\quad, \] \end_inset @@ -25837,7 +25835,7 @@ ve logic. \end_inset and -\begin_inset Formula $\left(\alpha\Longrightarrow\beta\right)=(\neg\alpha\vee\beta)$ +\begin_inset Formula $\left(\alphaRightarrow\beta\right)=(\neg\alpha\vee\beta)$ \end_inset do not hold in the constructive logic. @@ -25895,7 +25893,7 @@ To verify that a formula is true in Boolean logic, we only need to check is translated into the Boolean formula \begin_inset Formula \[ -\alpha,\beta\vdash\gamma=\left(\left(\alpha\wedge\beta\right)\Longrightarrow\gamma\right)=\left(\neg\alpha\vee\neg\beta\vee\gamma\right)\quad. +\alpha,\beta\vdash\gamma=\left(\left(\alpha\wedge\beta\right)Rightarrow\gamma\right)=\left(\neg\alpha\vee\neg\beta\vee\gamma\right)\quad. \] \end_inset @@ -26039,7 +26037,7 @@ Boolean logic \begin_layout Plain Layout \size small -\begin_inset Formula $\frac{\Gamma,\alpha\vdash\beta}{\Gamma\vdash\alpha\Longrightarrow\beta}\quad(\text{create function})$ +\begin_inset Formula $\frac{\Gamma,\alpha\vdash\beta}{\Gamma\vdash\alphaRightarrow\beta}\quad(\text{create function})$ \end_inset @@ -26053,7 +26051,7 @@ Boolean logic \begin_layout Plain Layout \size small -\begin_inset Formula $\left(\neg\Gamma\vee\neg\alpha\vee\beta\right)=\left(\neg\Gamma\vee\left(\alpha\Longrightarrow\beta\right)\right)$ +\begin_inset Formula $\left(\neg\Gamma\vee\neg\alpha\vee\beta\right)=\left(\neg\Gamma\vee\left(\alphaRightarrow\beta\right)\right)$ \end_inset @@ -26069,7 +26067,7 @@ Boolean logic \begin_layout Plain Layout \size small -\begin_inset Formula $\frac{\Gamma\vdash\alpha\quad\quad\Gamma\vdash\alpha\Longrightarrow\beta}{\Gamma\vdash\beta}\quad(\text{use function})$ +\begin_inset Formula $\frac{\Gamma\vdash\alpha\quad\quad\Gamma\vdash\alphaRightarrow\beta}{\Gamma\vdash\beta}\quad(\text{use function})$ \end_inset @@ -26083,7 +26081,7 @@ Boolean logic \begin_layout Plain Layout \size small -\begin_inset Formula $\left(\left(\neg\Gamma\vee\alpha\right)\wedge\left(\neg\Gamma\vee\left(\alpha\Longrightarrow\beta\right)\right)\right)\Longrightarrow\left(\neg\Gamma\vee\beta\right)$ +\begin_inset Formula $\left(\left(\neg\Gamma\vee\alpha\right)\wedge\left(\neg\Gamma\vee\left(\alphaRightarrow\beta\right)\right)\right)Rightarrow\left(\neg\Gamma\vee\beta\right)$ \end_inset @@ -26143,7 +26141,7 @@ Boolean logic \begin_layout Plain Layout \size small -\begin_inset Formula $\left(\neg\Gamma\vee\left(\alpha\wedge\beta\right)\right)\Longrightarrow\left(\neg\Gamma\vee\alpha\right)$ +\begin_inset Formula $\left(\neg\Gamma\vee\left(\alpha\wedge\beta\right)\right)Rightarrow\left(\neg\Gamma\vee\alpha\right)$ \end_inset @@ -26173,7 +26171,7 @@ Boolean logic \begin_layout Plain Layout \size small -\begin_inset Formula $\left(\neg\Gamma\vee\alpha\right)\Longrightarrow\left(\neg\Gamma\vee\left(\alpha\vee\beta\right)\right)$ +\begin_inset Formula $\left(\neg\Gamma\vee\alpha\right)Rightarrow\left(\neg\Gamma\vee\left(\alpha\vee\beta\right)\right)$ \end_inset @@ -26203,7 +26201,7 @@ Boolean logic \begin_layout Plain Layout \size small -\begin_inset Formula $\left(\left(\neg\Gamma\vee\alpha\vee\beta\right)\wedge\left(\neg\Gamma\vee\neg\alpha\vee\gamma\right)\wedge\left(\neg\Gamma\vee\neg\beta\vee\gamma\right)\right)\Longrightarrow\left(\neg\Gamma\vee\gamma\right)$ +\begin_inset Formula $\left(\left(\neg\Gamma\vee\alpha\vee\beta\right)\wedge\left(\neg\Gamma\vee\neg\alpha\vee\gamma\right)\wedge\left(\neg\Gamma\vee\neg\beta\vee\gamma\right)\right)Rightarrow\left(\neg\Gamma\vee\gamma\right)$ \end_inset @@ -26304,7 +26302,7 @@ To simplify the calculations, note that all terms in the formulas contain \begin_inset Formula \begin{align*} -\text{formula ``use function''}:\quad & \left(\alpha\wedge\left(\alpha\Longrightarrow\beta\right)\right)\Longrightarrow\beta\\ +\text{formula ``use function''}:\quad & \left(\alpha\wedge\left(\alphaRightarrow\beta\right)\right)Rightarrow\beta\\ \text{use Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:\quad & =\gunderline{\neg}(\alpha\,\gunderline{\wedge}\,(\neg\alpha\,\gunderline{\vee}\,\beta))\vee\beta\\ \text{de Morgan's laws}:\quad & =\gunderline{\neg\alpha\vee(\alpha\wedge\neg\beta)}\vee\beta\\ \text{identity }p\vee(\neg p\wedge q)=p\vee q\text{ with }p=\neg\alpha\text{ and }q=\beta:\quad & =\neg\alpha\vee\gunderline{\neg\beta\vee\beta}\\ @@ -26316,7 +26314,7 @@ To simplify the calculations, note that all terms in the formulas contain \begin_inset Formula \begin{align*} -\text{formula ``use Either''}:\quad & \left(\left(\alpha\vee\beta\right)\wedge\left(\alpha\Longrightarrow\gamma\right)\wedge\left(\beta\Longrightarrow\gamma\right)\right)\Longrightarrow\gamma\\ +\text{formula ``use Either''}:\quad & \left(\left(\alpha\vee\beta\right)\wedge\left(\alphaRightarrow\gamma\right)\wedge\left(\betaRightarrow\gamma\right)\right)Rightarrow\gamma\\ \text{use Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:\quad & =\neg\left(\left(\alpha\vee\beta\right)\wedge\left(\neg\alpha\vee\gamma\right)\wedge\left(\neg\beta\vee\gamma\right)\right)\vee\gamma\\ \text{de Morgan's laws}:\quad & =\left(\neg\alpha\wedge\neg\beta\right)\vee\gunderline{\left(\alpha\wedge\neg\gamma\right)}\vee\gunderline{\left(\beta\wedge\neg\gamma\right)}\vee\gamma\\ \text{identity }p\vee(\neg p\wedge q)=p\vee q:\quad & =\gunderline{\left(\neg\alpha\wedge\neg\beta\right)\vee\alpha}\vee\beta\vee\gamma\\ @@ -26341,13 +26339,13 @@ Since each proof rule of the constructive logic is translated into a true is translated into a chain of Boolean implications that look like this, \begin_inset Formula \[ -True=(...)\Longrightarrow(...)\Longrightarrow...\Longrightarrow f(\alpha,\beta,\gamma)\quad. +True=(...)Rightarrow(...)Rightarrow...Rightarrow f(\alpha,\beta,\gamma)\quad. \] \end_inset Since -\begin_inset Formula $\left(True\Longrightarrow\alpha\right)=\alpha$ +\begin_inset Formula $\left(TrueRightarrow\alpha\right)=\alpha$ \end_inset , this chain proves the Boolean formula @@ -26375,11 +26373,11 @@ noprefix "false" is translated into \begin_inset Formula \begin{align*} -\text{axiom ``use arg''}:\quad & True=\left(\neg\left(\left(\alpha\Longrightarrow\alpha\right)\Longrightarrow\beta\right)\vee\neg\alpha\vee\alpha\right)\\ -\text{rule ``create function''}:\quad & \quad\Rightarrow\neg\left(\left(\alpha\Longrightarrow\alpha\right)\Longrightarrow\beta\right)\vee\left(\alpha\Longrightarrow\alpha\right)\quad.\\ -\text{axiom ``use arg''}:\quad & True=\neg\left(\left(\alpha\Longrightarrow\alpha\right)\Longrightarrow\beta\right)\vee\left(\left(\alpha\Longrightarrow\alpha\right)\Longrightarrow\beta\right)\quad.\\ -\text{rule ``use function''}:\quad & True\Rightarrow\left(\neg\left(\left(\alpha\Longrightarrow\alpha\right)\Longrightarrow\beta\right)\vee\beta\right)\\ -\text{rule ``create function''}:\quad & \quad\Rightarrow\left(\left(\left(\alpha\Longrightarrow\alpha\right)\Longrightarrow\beta\right)\Longrightarrow\beta\right)\quad. +\text{axiom ``use arg''}:\quad & True=\left(\neg\left(\left(\alphaRightarrow\alpha\right)Rightarrow\beta\right)\vee\neg\alpha\vee\alpha\right)\\ +\text{rule ``create function''}:\quad & \quad\rightarrow\neg\left(\left(\alphaRightarrow\alpha\right)Rightarrow\beta\right)\vee\left(\alphaRightarrow\alpha\right)\quad.\\ +\text{axiom ``use arg''}:\quad & True=\neg\left(\left(\alphaRightarrow\alpha\right)Rightarrow\beta\right)\vee\left(\left(\alphaRightarrow\alpha\right)Rightarrow\beta\right)\quad.\\ +\text{rule ``use function''}:\quad & True\rightarrow\left(\neg\left(\left(\alphaRightarrow\alpha\right)Rightarrow\beta\right)\vee\beta\right)\\ +\text{rule ``create function''}:\quad & \quad\rightarrow\left(\left(\left(\alphaRightarrow\alpha\right)Rightarrow\beta\right)Rightarrow\beta\right)\quad. \end{align*} \end_inset @@ -26426,8 +26424,8 @@ noprefix "false" \begin_inset Formula \begin{align*} & \forall\alpha.\,\alpha\quad,\\ - & \forall(\alpha,\beta).\,\alpha\Longrightarrow\beta\quad,\\ - & \forall(\alpha,\beta).\,(\alpha\Longrightarrow\beta)\Longrightarrow\beta\quad. + & \forall(\alpha,\beta).\,\alphaRightarrow\beta\quad,\\ + & \forall(\alpha,\beta).\,(\alphaRightarrow\beta)Rightarrow\beta\quad. \end{align*} \end_inset @@ -26451,7 +26449,7 @@ noprefix "false" \end_inset uses the Boolean identity -\begin_inset Formula $\left(\alpha\Longrightarrow\beta\right)=(\neg\alpha\vee\beta)$ +\begin_inset Formula $\left(\alphaRightarrow\beta\right)=(\neg\alpha\vee\beta)$ \end_inset , which does not hold in the constructive logic, to translate the constructive @@ -26525,7 +26523,7 @@ To see why, consider what it would mean for \end_inset , is defined as the implication -\begin_inset Formula $\alpha\Longrightarrow False$ +\begin_inset Formula $\alphaRightarrow False$ \end_inset . @@ -26534,13 +26532,13 @@ To see why, consider what it would mean for \end_inset corresponds to the type -\begin_inset Formula $\forall A.\,\left(A\Rightarrow\bbnum 0\right)+A$ +\begin_inset Formula $\forall A.\,\left(A\rightarrow\bbnum 0\right)+A$ \end_inset . Can we compute a value of this type in a fully parametric function? We would need to compute either a value of type -\begin_inset Formula $A\Rightarrow\bbnum 0$ +\begin_inset Formula $A\rightarrow\bbnum 0$ \end_inset or a value of type @@ -26558,7 +26556,7 @@ To see why, consider what it would mean for \end_inset or -\begin_inset Formula $A\Rightarrow\bbnum 0$ +\begin_inset Formula $A\rightarrow\bbnum 0$ \end_inset ? We certainly cannot compute a value of type @@ -26585,7 +26583,7 @@ noprefix "false" \end_inset , a value of type -\begin_inset Formula $A\Rightarrow\bbnum 0$ +\begin_inset Formula $A\rightarrow\bbnum 0$ \end_inset exists if the type @@ -26623,7 +26621,7 @@ Int \end_inset , we cannot compute a value of type -\begin_inset Formula $A\Rightarrow\bbnum 0$ +\begin_inset Formula $A\rightarrow\bbnum 0$ \end_inset . @@ -26645,7 +26643,7 @@ noprefix "false" \end_inset showed that the type -\begin_inset Formula $A\Rightarrow\bbnum 0$ +\begin_inset Formula $A\rightarrow\bbnum 0$ \end_inset is equivalent to @@ -26671,7 +26669,7 @@ noprefix "false" is either void or not void. So, why exactly is it impossible to implement a value of the type -\begin_inset Formula $\left(A\Rightarrow\bbnum 0\right)+A$ +\begin_inset Formula $\left(A\rightarrow\bbnum 0\right)+A$ \end_inset ? We could say that if @@ -26679,11 +26677,11 @@ noprefix "false" \end_inset is void then -\begin_inset Formula $\left(A\Rightarrow\bbnum 0\right)\cong\bbnum 1$ +\begin_inset Formula $\left(A\rightarrow\bbnum 0\right)\cong\bbnum 1$ \end_inset is not void, and so one of the types in the disjunction -\begin_inset Formula $\left(A\Rightarrow\bbnum 0\right)+A$ +\begin_inset Formula $\left(A\rightarrow\bbnum 0\right)+A$ \end_inset should be non-void (i.e. @@ -26706,7 +26704,7 @@ should exist \end_inset ; the real requirement is to compute a value of type -\begin_inset Formula $\left(A\Rightarrow\bbnum 0\right)+A$ +\begin_inset Formula $\left(A\rightarrow\bbnum 0\right)+A$ \end_inset in fully parametric code that works the same way for all types diff --git a/sofp-src/sofp-curry-howard.tex b/sofp-src/sofp-curry-howard.tex index 46b2f41df..d08272c10 100644 --- a/sofp-src/sofp-curry-howard.tex +++ b/sofp-src/sofp-curry-howard.tex @@ -152,7 +152,7 @@ \subsection{Motivation} & X,Y,...,Z\text{ can compute a value of type }A\quad.\label{eq:ch-CH-proposition-def} \end{align} Here $X$, $Y$, ..., $Z$, $A$ may be either type parameters or -more complicated type expressions such as $B\Rightarrow C$ or $(C\Rightarrow D)\Rightarrow E$, +more complicated type expressions such as $B\rightarrow C$ or $(C\rightarrow D)\rightarrow E$, built from other type parameters. If arguments of types $X$, $Y$, ..., $Z$ are given, it means we @@ -172,10 +172,10 @@ \subsection{Motivation} means proving sequents of the form~(\ref{eq:ch-example-sequent}). Our previous examples are denoted by the following sequents: \begin{align*} -{\color{greenunder}\text{\texttt{fmap} for \texttt{Option}}:}\quad & {\cal CH}(A\Rightarrow B)\vdash{\cal CH}(\text{\texttt{Option[A]}}\Rightarrow\text{\texttt{Option[B]}})\\ -{\color{greenunder}\text{the function \texttt{before}}:}\quad & {\cal CH}(A\Rightarrow B),{\cal CH}(B\Rightarrow C)\vdash{\cal CH}(A\Rightarrow C)\\ -{\color{greenunder}\text{value of type }A\text{ within \texttt{fmap}}:}\quad & {\cal CH}(A\Rightarrow B),{\cal CH}(\text{\texttt{Option[A]}})\vdash{\cal CH}(A)\\ -{\color{greenunder}\text{value of type }C\Rightarrow A\text{ within \texttt{before}}:}\quad & {\cal CH}(A\Rightarrow B),{\cal CH}(B\Rightarrow C)\vdash{\cal CH}(C\Rightarrow A) +{\color{greenunder}\text{\texttt{fmap} for \texttt{Option}}:}\quad & {\cal CH}(A\rightarrow B)\vdash{\cal CH}(\text{\texttt{Option[A]}}\rightarrow\text{\texttt{Option[B]}})\\ +{\color{greenunder}\text{the function \texttt{before}}:}\quad & {\cal CH}(A\rightarrow B),{\cal CH}(B\rightarrow C)\vdash{\cal CH}(A\rightarrow C)\\ +{\color{greenunder}\text{value of type }A\text{ within \texttt{fmap}}:}\quad & {\cal CH}(A\rightarrow B),{\cal CH}(\text{\texttt{Option[A]}})\vdash{\cal CH}(A)\\ +{\color{greenunder}\text{value of type }C\rightarrow A\text{ within \texttt{before}}:}\quad & {\cal CH}(A\rightarrow B),{\cal CH}(B\rightarrow C)\vdash{\cal CH}(C\rightarrow A) \end{align*} Calculations in formal logic are called \textbf{proofs}\index{proof}. So, in this section we gave informal arguments towards proving the @@ -313,7 +313,7 @@ \subsection{Type notation and ${\cal CH}$-propositions for standard type constru \paragraph{4) Rule for function types} Consider now a function type such as \lstinline!A => B!. (This type -is written in the type notation as $A\Rightarrow B$.) To compute +is written in the type notation as $A\rightarrow B$.) To compute a value of that type, we need to write code such as \begin{wrapfigure}{l}{0.5\columnwidth}% @@ -329,15 +329,15 @@ \subsection{Type notation and ${\cal CH}$-propositions for standard type constru \noindent The inner scope of the function needs to compute a value of type $B$, and the given value \lstinline!a:A! may be used for -that. So, ${\cal CH}(A\Rightarrow B)$ is true if and only if we are +that. So, ${\cal CH}(A\rightarrow B)$ is true if and only if we are able to compute a value of type $B$ when we are given a value of type $A$. To translate this statement into the language of logical propositions, we need to use the logical\index{logical implication} -\textbf{implication}, ${\cal CH}(A)\Longrightarrow{\cal CH}(B)$, -which means that ${\cal CH}(B)$ can be proved if ${\cal CH}(A)$ -already holds. So the rule for function types is +\textbf{implication}, ${\cal CH}(A)Rightarrow{\cal CH}(B)$, which +means that ${\cal CH}(B)$ can be proved if ${\cal CH}(A)$ already +holds. So the rule for function types is \[ -{\cal CH}(A\Rightarrow B)={\cal CH}(A)\Longrightarrow{\cal CH}(B)\quad. +{\cal CH}(A\rightarrow B)={\cal CH}(A)Rightarrow{\cal CH}(B)\quad. \] @@ -352,19 +352,19 @@ \subsection{Type notation and ${\cal CH}$-propositions for standard type constru for \emph{all} possible types \lstinline!A! and \lstinline!B!. In the notation of formal logic, this is written as \[ -{\cal CH}\left(\forall(A,B).\,A\Rightarrow(A\Rightarrow B)\Rightarrow B\right) +{\cal CH}\left(\forall(A,B).\,A\rightarrow(A\rightarrow B)\rightarrow B\right) \] and is equivalent to \[ -\forall(A,B).\,{\cal CH}\left(A\Rightarrow(A\Rightarrow B)\Rightarrow B\right)\quad. +\forall(A,B).\,{\cal CH}\left(A\rightarrow(A\rightarrow B)\rightarrow B\right)\quad. \] The code notation for the parameterized function \lstinline!f! is \[ -f^{A,B}:A\Rightarrow\left(A\Rightarrow B\right)\Rightarrow B\quad, +f^{A,B}:A\rightarrow\left(A\rightarrow B\right)\rightarrow B\quad, \] and its type can be written as \[ -\forall(A,B).\,A\Rightarrow\left(A\Rightarrow B\right)\Rightarrow B\quad. +\forall(A,B).\,A\rightarrow\left(A\rightarrow B\right)\rightarrow B\quad. \] The symbol $\forall$ means ``for all'' and is known as the \index{universal quantifier}\textbf{universal quantifier} in logic. @@ -380,12 +380,12 @@ \subsection{Type notation and ${\cal CH}$-propositions for standard type constru \end{lstlisting} This is written in the type notation as \begin{align*} -F^{A,B} & \triangleq A\Rightarrow\left(A\Rightarrow B\right)\Rightarrow B\quad,\\ -f^{A,B}:F^{A,B} & \triangleq x^{:A}\Rightarrow g^{:A\Rightarrow B}\Rightarrow g(x)\quad, +F^{A,B} & \triangleq A\rightarrow\left(A\rightarrow B\right)\rightarrow B\quad,\\ +f^{A,B}:F^{A,B} & \triangleq x^{:A}\rightarrow g^{:A\rightarrow B}\rightarrow g(x)\quad, \end{align*} or equivalently (although somewhat less readably) \[ -f:\big(\forall(A,B).\,F^{A,B}\big)\triangleq\forall(A,B).\,x^{:A}\Rightarrow g^{:A\Rightarrow B}\Rightarrow g(x)\quad. +f:\big(\forall(A,B).\,F^{A,B}\big)\triangleq\forall(A,B).\,x^{:A}\rightarrow g^{:A\rightarrow B}\rightarrow g(x)\quad. \] In Scala 3, the function \lstinline!f! can be written as a value @@ -423,17 +423,17 @@ \subsection{Type notation and ${\cal CH}$-propositions for standard type constru is, $A+B\times C$ means $A+\left(B\times C\right)$. This convention makes type expressions easier to reason about (for people familiar with arithmetic). -\item The function type arrows ($\Rightarrow$) group weaker than the operators -$+$ and $\times$, so that often-used types such as $A\Rightarrow\bbnum 1+B$ -(representing \lstinline!A => Option[B]!) or $A\times B\Rightarrow C$ +\item The function type arrows ($\rightarrow$) group weaker than the operators +$+$ and $\times$, so that often-used types such as $A\rightarrow\bbnum 1+B$ +(representing \lstinline!A => Option[B]!) or $A\times B\rightarrow C$ (representing \lstinline!((A, B)) => C!) can be written without any -parentheses. Type expressions such as $\left(A\Rightarrow B\right)\times C$ +parentheses. Type expressions such as $\left(A\rightarrow B\right)\times C$ will require parentheses but are used less often. \item The type quantifiers group weaker than all other operators, so we -can write types such as $\forall A.\,A\Rightarrow A\Rightarrow A$ +can write types such as $\forall A.\,A\rightarrow A\rightarrow A$ without parentheses. Type quantifiers are most often placed outside a type expression. When this is not the case, parentheses are necessary, -e.g.~in the type expression $\left(\forall A.\,A\Rightarrow A\right)\Rightarrow\bbnum 1$. +e.g.~in the type expression $\left(\forall A.\,A\rightarrow A\right)\rightarrow\bbnum 1$. \end{itemize} \begin{table} \begin{centering} @@ -448,7 +448,7 @@ \subsection{Type notation and ${\cal CH}$-propositions for standard type constru \hline {\small{}disjunctive type} & \lstinline!Either[A, B]! & $A+B$ & ${\cal CH}(A)$ $\vee$ ${\cal CH}(B)$\tabularnewline \hline -{\small{}function type} & \lstinline!A => B! & $A\Rightarrow B$ & ${\cal CH}(A)$ $\Longrightarrow$ ${\cal CH}(B)$\tabularnewline +{\small{}function type} & \lstinline!A => B! & $A\rightarrow B$ & ${\cal CH}(A)$ $Rightarrow$ ${\cal CH}(B)$\tabularnewline \hline {\small{}unit or a ``named unit'' type} & \lstinline!Unit! & $\bbnum 1$ & ${\cal CH}(\bbnum 1)=True$\tabularnewline \hline @@ -516,27 +516,27 @@ \subsubsection{Example \label{subsec:Example-ch-dupl-function}\ref{subsec:Exampl It is convenient to use the letter $\Delta$ for the function \lstinline!delta!. In the type notation, the type signature of $\Delta$ is written as \[ -\Delta^{A}:A\Rightarrow A\times A\quad. +\Delta^{A}:A\rightarrow A\times A\quad. \] So the proposition ${\cal CH}(\Delta)$ (meaning ``the function $\Delta$ can be implemented'') is \[ -{\cal CH}(\Delta)=\forall A.{\cal \,CH}\left(A\Rightarrow A\times A\right)\quad. +{\cal CH}(\Delta)=\forall A.{\cal \,CH}\left(A\rightarrow A\times A\right)\quad. \] -In the type expression $A\Rightarrow A\times A$, the product symbol -($\times$) binds stronger than the function arrow ($\Rightarrow$), -so the parentheses in $A\Rightarrow\left(A\times A\right)$ may be +In the type expression $A\rightarrow A\times A$, the product symbol +($\times$) binds stronger than the function arrow ($\rightarrow$), +so the parentheses in $A\rightarrow\left(A\times A\right)$ may be omitted. Using the rules for transforming ${\cal CH}$-propositions, we rewrite \begin{align*} - & {\cal CH}(A\Rightarrow A\times A)\\ -{\color{greenunder}\text{rule for function types}:}\quad & ={\cal CH}(A)\Longrightarrow{\cal CH}(A\times A)\\ -{\color{greenunder}\text{rule for tuple types}:}\quad & ={\cal CH}(A)\Longrightarrow\left({\cal CH}(A)\wedge{\cal CH}(A)\right)\quad. + & {\cal CH}(A\rightarrow A\times A)\\ +{\color{greenunder}\text{rule for function types}:}\quad & ={\cal CH}(A)Rightarrow{\cal CH}(A\times A)\\ +{\color{greenunder}\text{rule for tuple types}:}\quad & ={\cal CH}(A)Rightarrow\left({\cal CH}(A)\wedge{\cal CH}(A)\right)\quad. \end{align*} Thus the proposition ${\cal CH}(\Delta)$ is equivalent to \[ -{\cal CH}(\Delta)=\forall A.\,{\cal CH}(A)\Longrightarrow({\cal CH}(A)\wedge{\cal CH}(A))\quad. +{\cal CH}(\Delta)=\forall A.\,{\cal CH}(A)Rightarrow({\cal CH}(A)\wedge{\cal CH}(A))\quad. \] @@ -597,7 +597,7 @@ \subsubsection{Example \label{subsec:Example-ch-notation-function-3}\ref{subsec: Define a Scala type constructor \lstinline!F[A]! corresponding to the type notation \[ -F^{A}\triangleq\bbnum 1+\text{Int}\times A\times A+\text{Int}\times\left(\text{Int}\Rightarrow A\right)\quad. +F^{A}\triangleq\bbnum 1+\text{Int}\times A\times A+\text{Int}\times\left(\text{Int}\rightarrow A\right)\quad. \] @@ -618,7 +618,7 @@ \subsubsection{Example \label{subsec:Example-ch-notation-function-3}\ref{subsec: \end{lstlisting} Each of these case classes represents one part of the disjunctive type: \lstinline!F1! represents $\bbnum 1$, \lstinline!F2! represents -$\text{Int}\times A\times A$, and \lstinline!F3! represents $\text{Int}\times\left(\text{Int}\Rightarrow A\right)$. +$\text{Int}\times A\times A$, and \lstinline!F3! represents $\text{Int}\times\left(\text{Int}\rightarrow A\right)$. To define these case classes, we need to name their parts. The final code is \begin{lstlisting} @@ -648,17 +648,17 @@ \subsubsection{Example \label{subsec:Example-ch-notation-function-4}\ref{subsec: The type notation for \lstinline!Option[A]! is $\bbnum 1+A$. Now we can write the type signature of \lstinline!fmap! as \begin{align*} - & \text{fmap}^{A,B}:\left(A\Rightarrow B\right)\Rightarrow\bbnum 1+A\Rightarrow\bbnum 1+B\quad,\\ -{\color{greenunder}\text{or equivalently}:}\quad & \text{fmap}:\forall(A,B).\,\left(A\Rightarrow B\right)\Rightarrow\bbnum 1+A\Rightarrow\bbnum 1+B\quad. + & \text{fmap}^{A,B}:\left(A\rightarrow B\right)\rightarrow\bbnum 1+A\rightarrow\bbnum 1+B\quad,\\ +{\color{greenunder}\text{or equivalently}:}\quad & \text{fmap}:\forall(A,B).\,\left(A\rightarrow B\right)\rightarrow\bbnum 1+A\rightarrow\bbnum 1+B\quad. \end{align*} We do not put parentheses around $\bbnum 1+A$ and $\bbnum 1+B$ because -the function arrows ($\Rightarrow$) group weaker than the other type -operations. Parentheses around $\left(A\Rightarrow B\right)$ are +the function arrows ($\rightarrow$) group weaker than the other type +operations. Parentheses around $\left(A\rightarrow B\right)$ are required. We will usually prefer to write type parameters in superscripts rather -than under type quantifiers. So, we will prefer to write $\text{id}^{A}=x^{:A}\Rightarrow x$ -rather than $\text{id}:(\forall A.\,A\Rightarrow A)=x^{:A}\Rightarrow x$. +than under type quantifiers. So, we will prefer to write $\text{id}^{A}=x^{:A}\rightarrow x$ +rather than $\text{id}:(\forall A.\,A\rightarrow A)=x^{:A}\rightarrow x$. \subsection{Exercises: Type notation\index{exercises}} @@ -667,7 +667,7 @@ \subsubsection{Exercise \label{subsec:Exercise-type-notation-1}\ref{subsec:Exerc Define a Scala disjunctive type \lstinline!Q[T,A]! corresponding to the type notation \[ -Q^{T,A}\triangleq\bbnum 1+T\times A+\text{Int}\times(T\Rightarrow T)+\text{String}\times A\quad. +Q^{T,A}\triangleq\bbnum 1+T\times A+\text{Int}\times(T\rightarrow T)+\text{String}\times A\quad. \] @@ -685,7 +685,7 @@ \subsubsection{Exercise \label{subsec:Exercise-type-notation-4}\ref{subsec:Exerc Write a Scala type signature for the fully parametric function \[ -\text{flatMap}^{A,B}:\bbnum 1+A\Rightarrow\left(A\Rightarrow\bbnum 1+B\right)\Rightarrow\bbnum 1+B +\text{flatMap}^{A,B}:\bbnum 1+A\rightarrow\left(A\rightarrow\bbnum 1+B\right)\rightarrow\bbnum 1+B \] and implement this function, preserving information as much as possible. @@ -706,27 +706,27 @@ \subsection{Motivation and first examples\label{subsec:ch-Motivation-and-first-e \forall\alpha.\,\alpha=\alpha\quad. \] In logic, equivalence of propositions is usually understood as \index{implication}\textbf{implication} -($\Longrightarrow$) in both directions: $\alpha=\beta$ means $\left(\alpha\Longrightarrow\beta\right)\wedge\left(\beta\Longrightarrow\alpha\right)$. +($Rightarrow$) in both directions: $\alpha=\beta$ means $\left(\alphaRightarrow\beta\right)\wedge\left(\betaRightarrow\alpha\right)$. So, the above formula is the same as \[ -\forall\alpha.\,\alpha\Longrightarrow\alpha\quad. +\forall\alpha.\,\alphaRightarrow\alpha\quad. \] If the proposition $\alpha$ is a ${\cal CH}$-proposition, $\alpha\triangleq{\cal CH}(A)$ for some type $A$, we obtain the formula \begin{equation} -\forall A.\,{\cal CH}(A)\Longrightarrow{\cal CH}(A)\quad.\label{eq:ch-type-sig-1} +\forall A.\,{\cal CH}(A)Rightarrow{\cal CH}(A)\quad.\label{eq:ch-type-sig-1} \end{equation} We expect true ${\cal CH}$-propositions to correspond to types that \emph{can} be computed in a fully parametric function. Let us see if this example fits our expectations. We can rewrite Eq.~(\ref{eq:ch-type-sig-1}) as \begin{align*} - & \forall A.\,\gunderline{{\cal CH}(A)\Longrightarrow{\cal CH}(A)}\\ -{\color{greenunder}\text{rule for function types}:}\quad & =\gunderline{\forall A}.\,{\cal CH}\left(A\Rightarrow A\right)\\ -{\color{greenunder}\text{rule for parameterized types}:}\quad & ={\cal CH}\left(\forall A.\,A\Rightarrow A\right)\quad. + & \forall A.\,\gunderline{{\cal CH}(A)Rightarrow{\cal CH}(A)}\\ +{\color{greenunder}\text{rule for function types}:}\quad & =\gunderline{\forall A}.\,{\cal CH}\left(A\rightarrow A\right)\\ +{\color{greenunder}\text{rule for parameterized types}:}\quad & ={\cal CH}\left(\forall A.\,A\rightarrow A\right)\quad. \end{align*} The last line shows the ${\cal CH}$-proposition that corresponds -to the function type $\forall A.\,A\Rightarrow A$. Translating the +to the function type $\forall A.\,A\rightarrow A$. Translating the type notation into a Scala type signature, we get \begin{lstlisting} def f[A]: A => A @@ -746,10 +746,9 @@ \subsection{Motivation and first examples\label{subsec:ch-Motivation-and-first-e A well-known set of logical rules is called \index{Boolean logic}Boolean logic. In that logic, each proposition is either $True$ or $False$, -and the implication operation ($\Longrightarrow$) is \emph{defined} -by +and the implication operation ($Rightarrow$) is \emph{defined} by \begin{equation} -\left(\alpha\Longrightarrow\beta\right)\triangleq\left((\neg\alpha)\vee\beta\right)\quad.\label{eq:ch-definition-of-implication-in-Boolean-logic} +\left(\alphaRightarrow\beta\right)\triangleq\left((\neg\alpha)\vee\beta\right)\quad.\label{eq:ch-definition-of-implication-in-Boolean-logic} \end{equation} To verify a formula, substitute $True$ or $False$ into every variable and check if the formula has the value $True$ in all possible cases. @@ -760,7 +759,7 @@ \subsection{Motivation and first examples\label{subsec:ch-Motivation-and-first-e {\small{}}% \begin{tabular}{|c|c|c|c|c|c|} \hline -{\small{}$\alpha$} & {\small{}$\beta$} & \textbf{\small{}$\alpha\vee\beta$} & \textbf{\small{}$\alpha\wedge\beta$} & \textbf{\small{}$\neg\alpha$} & \textbf{\small{}$\alpha\Longrightarrow\beta$}\tabularnewline +{\small{}$\alpha$} & {\small{}$\beta$} & \textbf{\small{}$\alpha\vee\beta$} & \textbf{\small{}$\alpha\wedge\beta$} & \textbf{\small{}$\neg\alpha$} & \textbf{\small{}$\alphaRightarrow\beta$}\tabularnewline \hline \hline {\small{}$True$} & {\small{}$True$} & {\small{}$True$} & {\small{}$True$} & {\small{}$False$} & {\small{}$True$}\tabularnewline @@ -774,19 +773,19 @@ \subsection{Motivation and first examples\label{subsec:ch-Motivation-and-first-e \end{tabular}{\small\par} \par\end{center} -The formula $\alpha\Longrightarrow\alpha$ has the value $True$ whether +The formula $\alphaRightarrow\alpha$ has the value $True$ whether $\alpha$ itself is $True$ or $False$. This check is sufficient -to show that $\forall\alpha.\,\alpha\Longrightarrow\alpha$ is true -in Boolean logic. +to show that $\forall\alpha.\,\alphaRightarrow\alpha$ is true in +Boolean logic. -Here is the truth table for the formula $\forall(\alpha,\beta).\,(\alpha\wedge\beta)\Longrightarrow\alpha$; +Here is the truth table for the formula $\forall(\alpha,\beta).\,(\alpha\wedge\beta)Rightarrow\alpha$; that formula is true in Boolean logic since all values in the last column are $True$: \begin{center} {\small{}}% \begin{tabular}{|c|c|c|c|} \hline -{\small{}$\alpha$} & {\small{}$\beta$} & \textbf{\small{}$\alpha\wedge\beta$} & {\small{}$(\alpha\wedge\beta)\Longrightarrow\alpha$}\tabularnewline +{\small{}$\alpha$} & {\small{}$\beta$} & \textbf{\small{}$\alpha\wedge\beta$} & {\small{}$(\alpha\wedge\beta)Rightarrow\alpha$}\tabularnewline \hline \hline {\small{}$True$} & {\small{}$True$} & {\small{}$True$} & {\small{}$True$}\tabularnewline @@ -800,14 +799,14 @@ \subsection{Motivation and first examples\label{subsec:ch-Motivation-and-first-e \end{tabular}{\small\par} \par\end{center} -The formula $\forall(\alpha,\beta).\,\alpha\Longrightarrow(\alpha\wedge\beta)$ +The formula $\forall(\alpha,\beta).\,\alphaRightarrow(\alpha\wedge\beta)$ is not true in Boolean logic, which we can see from the following truth table (one value in the last column is $False$): \begin{center} {\small{}}% \begin{tabular}{|c|c|c|c|} \hline -{\small{}$\alpha$} & {\small{}$\beta$} & \textbf{\small{}$\alpha\wedge\beta$} & {\small{}$\alpha\Longrightarrow(\alpha\wedge\beta)$}\tabularnewline +{\small{}$\alpha$} & {\small{}$\beta$} & \textbf{\small{}$\alpha\wedge\beta$} & {\small{}$\alphaRightarrow(\alpha\wedge\beta)$}\tabularnewline \hline \hline {\small{}$True$} & {\small{}$True$} & {\small{}$True$} & {\small{}$True$}\tabularnewline @@ -834,15 +833,15 @@ \subsection{Motivation and first examples\label{subsec:ch-Motivation-and-first-e \textbf{\small{}Logic formula} & \textbf{\small{}Type formula} & \textbf{\small{}Scala code}\tabularnewline \hline \hline -{\footnotesize{}$\forall\alpha.\,\alpha\Longrightarrow\alpha$} & {\footnotesize{}$\forall A.\,A\Rightarrow A$} & \lstinline!def id[A](x: A): A = x!\tabularnewline +{\footnotesize{}$\forall\alpha.\,\alphaRightarrow\alpha$} & {\footnotesize{}$\forall A.\,A\rightarrow A$} & \lstinline!def id[A](x: A): A = x!\tabularnewline \hline -{\footnotesize{}$\forall\alpha.\,\alpha\Longrightarrow True$} & {\footnotesize{}$\forall A.\,A\Rightarrow\bbnum 1$} & \lstinline!def toUnit[A](x: A): Unit = ()!\tabularnewline +{\footnotesize{}$\forall\alpha.\,\alphaRightarrow True$} & {\footnotesize{}$\forall A.\,A\rightarrow\bbnum 1$} & \lstinline!def toUnit[A](x: A): Unit = ()!\tabularnewline \hline -{\footnotesize{}$\forall(\alpha,\beta).\,\alpha\Longrightarrow(\alpha\vee\beta)$} & {\footnotesize{}$\forall(A,B).\,A\Rightarrow A+B$} & \lstinline!def toL[A, B](x: A): Either[A, B] = Left(x)!\tabularnewline +{\footnotesize{}$\forall(\alpha,\beta).\,\alphaRightarrow(\alpha\vee\beta)$} & {\footnotesize{}$\forall(A,B).\,A\rightarrow A+B$} & \lstinline!def toL[A, B](x: A): Either[A, B] = Left(x)!\tabularnewline \hline -{\footnotesize{}$\forall(\alpha,\beta).\,(\alpha\wedge\beta)\Longrightarrow\alpha$} & {\footnotesize{}$\forall(A,B).\,A\times B\Rightarrow A$} & \lstinline!def first[A, B](p: (A, B)): A = p._1!\tabularnewline +{\footnotesize{}$\forall(\alpha,\beta).\,(\alpha\wedge\beta)Rightarrow\alpha$} & {\footnotesize{}$\forall(A,B).\,A\times B\rightarrow A$} & \lstinline!def first[A, B](p: (A, B)): A = p._1!\tabularnewline \hline -{\footnotesize{}$\forall(\alpha,\beta).\,\alpha\Longrightarrow(\beta\Longrightarrow\alpha)$} & {\footnotesize{}$\forall(A,B).\,A\Rightarrow(B\Rightarrow A)$} & \lstinline!def const[A, B](x: A): B => A = (_ => x)!\tabularnewline +{\footnotesize{}$\forall(\alpha,\beta).\,\alphaRightarrow(\betaRightarrow\alpha)$} & {\footnotesize{}$\forall(A,B).\,A\rightarrow(B\rightarrow A)$} & \lstinline!def const[A, B](x: A): B => A = (_ => x)!\tabularnewline \hline \end{tabular} \par\end{centering} @@ -861,13 +860,13 @@ \subsection{Motivation and first examples\label{subsec:ch-Motivation-and-first-e \textbf{\small{}Logic formula} & \textbf{\small{}Type formula} & \textbf{\small{}Scala type signature}\tabularnewline \hline \hline -{\footnotesize{}$\forall\alpha.\,True\Longrightarrow\alpha$} & {\footnotesize{}$\forall A.\,\bbnum 1\Rightarrow A$} & \lstinline!def f[A](x: Unit): A!\tabularnewline +{\footnotesize{}$\forall\alpha.\,TrueRightarrow\alpha$} & {\footnotesize{}$\forall A.\,\bbnum 1\rightarrow A$} & \lstinline!def f[A](x: Unit): A!\tabularnewline \hline -{\footnotesize{}$\forall(\alpha,\beta).\,(\alpha\vee\beta)\Longrightarrow\alpha$} & {\footnotesize{}$\forall(A,B).\,A+B\Rightarrow A$} & \lstinline!def f[A,B](x: Either[A, B])!\tabularnewline +{\footnotesize{}$\forall(\alpha,\beta).\,(\alpha\vee\beta)Rightarrow\alpha$} & {\footnotesize{}$\forall(A,B).\,A+B\rightarrow A$} & \lstinline!def f[A,B](x: Either[A, B])!\tabularnewline \hline -{\footnotesize{}$\forall(\alpha,\beta).\,\alpha\Longrightarrow(\alpha\wedge\beta)$} & {\footnotesize{}$\forall(A,B).\,A\Rightarrow A\times B$} & \lstinline!def f[A,B](p: A): (A, B)!\tabularnewline +{\footnotesize{}$\forall(\alpha,\beta).\,\alphaRightarrow(\alpha\wedge\beta)$} & {\footnotesize{}$\forall(A,B).\,A\rightarrow A\times B$} & \lstinline!def f[A,B](p: A): (A, B)!\tabularnewline \hline -{\footnotesize{}$\forall(\alpha,\beta).\,(\alpha\Longrightarrow\beta)\Longrightarrow\alpha$} & {\footnotesize{}$\forall(A,B).\,(A\Rightarrow B)\Rightarrow A$} & \lstinline!def f[A,B](x: A => B): A!\tabularnewline +{\footnotesize{}$\forall(\alpha,\beta).\,(\alphaRightarrow\beta)Rightarrow\alpha$} & {\footnotesize{}$\forall(A,B).\,(A\rightarrow B)\rightarrow A$} & \lstinline!def f[A,B](x: A => B): A!\tabularnewline \hline \end{tabular} \par\end{centering} @@ -887,7 +886,7 @@ \subsection{Example: Failure of Boolean logic for type reasoning\label{subsec:Ex Boolean logic to reason about values computed by fully parametric functions, consider the following type, \begin{equation} -\forall(A,B,C).\,\left(A\Rightarrow B+C\right)\Rightarrow\left(A\Rightarrow B\right)+\left(A\Rightarrow C\right)\quad,\label{eq:ch-example-boolean-bad-type} +\forall(A,B,C).\,\left(A\rightarrow B+C\right)\rightarrow\left(A\rightarrow B\right)+\left(A\rightarrow C\right)\quad,\label{eq:ch-example-boolean-bad-type} \end{equation} which corresponds to the Scala type signature \begin{lstlisting} @@ -895,21 +894,21 @@ \subsection{Example: Failure of Boolean logic for type reasoning\label{subsec:Ex \end{lstlisting} The function \lstinline!bad! cannot be implemented as a fully parametric function. To see why, consider that the only available data is a function -$g^{:A\Rightarrow B+C}$, which returns values of type $B$ or $C$ +$g^{:A\rightarrow B+C}$, which returns values of type $B$ or $C$ depending (in some unknown way) on the input value of type $A$. The -function \lstinline!bad! must return either a function of type $A\Rightarrow B$ -or a function of type $A\Rightarrow C$. How can the code of \lstinline!bad! +function \lstinline!bad! must return either a function of type $A\rightarrow B$ +or a function of type $A\rightarrow C$. How can the code of \lstinline!bad! make this decision? The only input data is the function $g$ that takes an argument of type $A$. We could imagine applying $g$ to various arguments of type $A$ and to see whether $g$ returns a $B$ or a $C$. However, the type $A$ is arbitrary, and a fully parametric function cannot produce a value of type $A$ in order to apply $g$ -to it. So the decision about whether to return $A\Rightarrow B$ or -$A\Rightarrow C$ must be independent of the function $g$; that decision +to it. So the decision about whether to return $A\rightarrow B$ or +$A\rightarrow C$ must be independent of the function $g$; that decision must be hard-coded in the function \lstinline!bad!. -Suppose we hard-coded the decision to return a function of type $A\Rightarrow B$. -How can we create a function of type $A\Rightarrow B$ in the body +Suppose we hard-coded the decision to return a function of type $A\rightarrow B$. +How can we create a function of type $A\rightarrow B$ in the body of \lstinline!bad!? Given a value $x^{:A}$ of type $A$, we would need to compute some value of type $B$. Since the type $B$ is arbitrary (it is a type parameter), we cannot produce a value of type $B$ from @@ -919,20 +918,20 @@ \subsection{Example: Failure of Boolean logic for type reasoning\label{subsec:Ex where \lstinline!c! is of type $C$. In that case, we will have a value of type $C$, not $B$. So, in general, we cannot guarantee that we can always obtain a value of type $B$ from a given value -$x^{:A}$. This means we cannot build a function of type $A\Rightarrow B$ +$x^{:A}$. This means we cannot build a function of type $A\rightarrow B$ out of the function $g$. Similarly, we cannot build a function of -type $A\Rightarrow C$ out of $g$. +type $A\rightarrow C$ out of $g$. -Whether we decide to return $A\Rightarrow B$ or $A\Rightarrow C$, +Whether we decide to return $A\rightarrow B$ or $A\rightarrow C$, we will not be able to return a value of the required type, as we just saw. We must conclude that we cannot implement \lstinline!bad! as a fully parametric function. -We could try to switch between $A\Rightarrow B$ and $A\Rightarrow C$ +We could try to switch between $A\rightarrow B$ and $A\rightarrow C$ depending on a given value of type $A$. This idea, however, means that we are working with a different type signature: \[ -\forall(A,B,C).\,\left(A\Rightarrow B+C\right)\Rightarrow A\Rightarrow\left(A\Rightarrow B\right)+\left(A\Rightarrow C\right)\quad. +\forall(A,B,C).\,\left(A\rightarrow B+C\right)\rightarrow A\rightarrow\left(A\rightarrow B\right)+\left(A\rightarrow C\right)\quad. \] This type signature \emph{can} be implemented, for instance, by this Scala code: @@ -949,7 +948,7 @@ \subsection{Example: Failure of Boolean logic for type reasoning\label{subsec:Ex Now let us convert the type signature~(\ref{eq:ch-example-boolean-bad-type}) into a ${\cal CH}$-proposition: \begin{align} - & \forall(\alpha,\beta,\gamma).\,\left(\alpha\Longrightarrow\left(\beta\vee\gamma\right)\right)\Longrightarrow\left(\left(\alpha\Longrightarrow\beta\right)\vee\left(\alpha\Longrightarrow\gamma\right)\right)\quad,\label{eq:abc-example-classical-logic-bad}\\ + & \forall(\alpha,\beta,\gamma).\,\left(\alphaRightarrow\left(\beta\vee\gamma\right)\right)Rightarrow\left(\left(\alphaRightarrow\beta\right)\vee\left(\alphaRightarrow\gamma\right)\right)\quad,\label{eq:abc-example-classical-logic-bad}\\ \text{where}\quad & \alpha\triangleq{\cal CH}(A),\quad\beta\triangleq{\cal CH}(B),\quad\gamma\triangleq{\cal CH}(C)\quad.\nonumber \end{align} It turns out that this formula is true \emph{in Boolean logic}. To @@ -958,25 +957,25 @@ \subsection{Example: Failure of Boolean logic for type reasoning\label{subsec:Ex $\beta$, $\gamma$. One way is to rewrite the expression~(\ref{eq:abc-example-classical-logic-bad}) using the rules of Boolean logic, such as Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic}): \begin{align*} - & \gunderline{\alpha\Longrightarrow}\left(\beta\vee\gamma\right)\\ -{\color{greenunder}\text{definition of }\Rightarrow\text{ via Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:}\quad & \quad=(\neg\alpha)\vee\beta\vee\gamma\quad,\\ - & \gunderline{\left(\alpha\Longrightarrow\beta\right)}\vee\gunderline{\left(\alpha\Longrightarrow\gamma\right)}\\ -{\color{greenunder}\text{definition of }\Rightarrow\text{ via Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:}\quad & \quad=\gunderline{(\neg\alpha)}\vee\beta\vee\gunderline{(\neg\alpha)}\vee\gamma\\ + & \gunderline{\alphaRightarrow}\left(\beta\vee\gamma\right)\\ +{\color{greenunder}\text{definition of }\rightarrow\text{ via Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:}\quad & \quad=(\neg\alpha)\vee\beta\vee\gamma\quad,\\ + & \gunderline{\left(\alphaRightarrow\beta\right)}\vee\gunderline{\left(\alphaRightarrow\gamma\right)}\\ +{\color{greenunder}\text{definition of }\rightarrow\text{ via Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:}\quad & \quad=\gunderline{(\neg\alpha)}\vee\beta\vee\gunderline{(\neg\alpha)}\vee\gamma\\ {\color{greenunder}\text{property }x\vee x=x\text{ in Boolean logic}:}\quad & \quad=(\neg\alpha)\vee\beta\vee\gamma\quad, \end{align*} -showing that $\alpha\Longrightarrow(\beta\vee\gamma)$ is in fact -\emph{equal} to $\left(\alpha\Longrightarrow\beta\right)\vee\left(\alpha\Longrightarrow\gamma\right)$ +showing that $\alphaRightarrow(\beta\vee\gamma)$ is in fact \emph{equal} +to $\left(\alphaRightarrow\beta\right)\vee\left(\alphaRightarrow\gamma\right)$ in Boolean logic. Let us also give a proof via truth-value reasoning. The only possibility -for an implication $X\Longrightarrow Y$ to be $False$ is when $X=True$ +for an implication $XRightarrowY$ to be $False$ is when $X=True$ and $Y=False$. So, Eq.~(\ref{eq:abc-example-classical-logic-bad}) -can be $False$ only if $\left(\alpha\Longrightarrow(\beta\vee\gamma)\right)=True$ -and $\left(\alpha\Longrightarrow\beta\right)\vee\left(\alpha\Longrightarrow\gamma\right)=False$. +can be $False$ only if $\left(\alphaRightarrow(\beta\vee\gamma)\right)=True$ +and $\left(\alphaRightarrow\beta\right)\vee\left(\alphaRightarrow\gamma\right)=False$. A disjunction can be false only when both parts are false; so we must -have both $\left(\alpha\Longrightarrow\beta\right)=False$ and $\left(\alpha\Longrightarrow\gamma\right)=False$. +have both $\left(\alphaRightarrow\beta\right)=False$ and $\left(\alphaRightarrow\gamma\right)=False$. This is only possible if $\alpha=True$ and $\beta=\gamma=False$. -But, with these value assignments, we find $\left(\alpha\Longrightarrow(\beta\vee\gamma)\right)=False$ +But, with these value assignments, we find $\left(\alphaRightarrow(\beta\vee\gamma)\right)=False$ rather than $True$ as we assumed. It follows that we cannot ever make Eq.~(\ref{eq:abc-example-classical-logic-bad}) equal to $False$. This proves Eq.~(\ref{eq:abc-example-classical-logic-bad}) to be @@ -1107,7 +1106,7 @@ \subsection{The rules of proof for ${\cal CH}$-propositions\label{subsec:The-rul \paragraph{3) Create a function} At any place in the code, we may compute a nameless function of type, -say, $A\Rightarrow B$, by writing \lstinline!(x:A) => expr! as long +say, $A\rightarrow B$, by writing \lstinline!(x:A) => expr! as long as a value \lstinline!expr! of type $B$ can be computed in the inner scope of the function. The code for \lstinline!expr! is also required to be fully parametric; it may use \lstinline!x! and/or other values @@ -1119,21 +1118,21 @@ \subsection{The rules of proof for ${\cal CH}$-propositions\label{subsec:The-rul to all previously available premises. Translating this into the language of ${\cal CH}$-propositions, we find that we will prove the sequent \[ -\Gamma\vdash{\cal CH}(A\Rightarrow B)\quad=\quad\Gamma\vdash{\cal CH}(A)\Longrightarrow{\cal CH}(B)\quad\triangleq\quad\Gamma\vdash\alpha\Rightarrow\beta +\Gamma\vdash{\cal CH}(A\rightarrow B)\quad=\quad\Gamma\vdash{\cal CH}(A)Rightarrow{\cal CH}(B)\quad\triangleq\quad\Gamma\vdash\alpha\rightarrow\beta \] if we can prove the sequent $\Gamma,{\cal CH}(A)\vdash{\cal CH}(B)=\Gamma,\alpha\vdash\beta$. In the notation of formal logic, this is a \textbf{derivation rule}\index{derivation rule} (rather than an axiom) and is written as \[ -\frac{\Gamma,\alpha\vdash\beta}{\Gamma\vdash\alpha\Longrightarrow\beta}\quad(\text{create function})\quad\quad. +\frac{\Gamma,\alpha\vdash\beta}{\Gamma\vdash\alphaRightarrow\beta}\quad(\text{create function})\quad\quad. \] The \textbf{turnstile}\index{turnstile} symbol, $\vdash$, groups -weaker than other operators. So, we can write sequents such as $(\Gamma,\alpha)\vdash(\beta\Longrightarrow\gamma)$ -with fewer parentheses: $\Gamma,\alpha\vdash\beta\Longrightarrow\gamma$. +weaker than other operators. So, we can write sequents such as $(\Gamma,\alpha)\vdash(\betaRightarrow\gamma)$ +with fewer parentheses: $\Gamma,\alpha\vdash\betaRightarrow\gamma$. What code corresponds to the ``$\text{create function}$'' rule? -The proof of $\Gamma\vdash\alpha\Longrightarrow\beta$ depends on -a proof of another sequent. So, the corresponding code must be a \emph{function} +The proof of $\Gamma\vdash\alphaRightarrow\beta$ depends on a proof +of another sequent. So, the corresponding code must be a \emph{function} that takes a proof of the previous sequent as an argument and returns a proof of the new sequent. By the CH correspondence, a proof of a sequent corresponds to a code expression of the type given by the @@ -1141,13 +1140,13 @@ \subsection{The rules of proof for ${\cal CH}$-propositions\label{subsec:The-rul to the premises of the sequent. So, a proof of the sequent $\Gamma,\alpha\vdash\beta$ is an expression \lstinline!exprB! of type $B$ that may use a given value of type $A$ as well as any other arguments given previously. -Then we can write the proof code for the sequent $\Gamma\vdash\alpha\Longrightarrow\beta$ +Then we can write the proof code for the sequent $\Gamma\vdash\alphaRightarrow\beta$ as the nameless function \lstinline!(x:A) => exprB!. This function -has type $A\Rightarrow B$ and requires us to already have a suitable +has type $A\rightarrow B$ and requires us to already have a suitable \lstinline!exprB!. This exactly corresponds to the proof rule ``$\text{create function}$''. We may write the corresponding code as \[ -\text{Proof}(\Gamma\vdash{\cal CH}(A)\Longrightarrow{\cal CH}(B))=x^{:A}\Rightarrow\text{Proof}(\Gamma,x^{:A}\vdash{\cal CH}(B))\quad. +\text{Proof}(\Gamma\vdash{\cal CH}(A)Rightarrow{\cal CH}(B))=x^{:A}\rightarrow\text{Proof}(\Gamma,x^{:A}\vdash{\cal CH}(B))\quad. \] Here we wrote $x^{:A}$ instead of ${\cal CH}(A)$ since the value $x^{:A}$ is a proof of the proposition ${\cal CH}(A)$. We will see @@ -1157,18 +1156,18 @@ \subsection{The rules of proof for ${\cal CH}$-propositions\label{subsec:The-rul \paragraph{4) Use a function} At any place in the code, we may apply an already defined function -of type $A\Rightarrow B$ to an already computed value of type $A$. +of type $A\rightarrow B$ to an already computed value of type $A$. The result will be a value of type $B$. This corresponds to assuming -${\cal CH}(A\Rightarrow B)$ and ${\cal CH}(A)$, and then deriving +${\cal CH}(A\rightarrow B)$ and ${\cal CH}(A)$, and then deriving ${\cal CH}(B)$. The formal logic notation for this proof rule is \[ -\frac{\Gamma\vdash\alpha\quad\quad\Gamma\vdash\alpha\Longrightarrow\beta}{\Gamma\vdash\beta}\quad(\text{use function})\quad\quad. +\frac{\Gamma\vdash\alpha\quad\quad\Gamma\vdash\alphaRightarrow\beta}{\Gamma\vdash\beta}\quad(\text{use function})\quad\quad. \] The code corresponding to this proof rule takes previously computed values \lstinline!x:A! and \lstinline!f:A => B!, and writes the expression \lstinline!f(x)!. This can be written as a function application, \[ -\text{Proof}(\Gamma\vdash\beta)=\text{Proof}\left(\Gamma\vdash\alpha\Longrightarrow\beta\right)(\text{Proof}(\Gamma\vdash\alpha))\quad. +\text{Proof}(\Gamma\vdash\beta)=\text{Proof}\left(\Gamma\vdash\alphaRightarrow\beta\right)(\text{Proof}(\Gamma\vdash\alpha))\quad. \] @@ -1289,8 +1288,8 @@ \subsection{The rules of proof for ${\cal CH}$-propositions\label{subsec:The-rul {\small{} \begin{align*} {\color{greenunder}\text{axioms}:}\quad & \frac{~}{\Gamma\vdash{\cal CH}(\bbnum 1)}\quad(\text{create unit})\quad\quad\quad\quad\frac{~}{\Gamma,\alpha\vdash\alpha}\quad(\text{use arg})\\ -{\color{greenunder}\text{derivation rules}:}\quad & \frac{\Gamma,\alpha\vdash\beta}{\Gamma\vdash\alpha\Longrightarrow\beta}\quad(\text{create function})\\ - & \frac{\Gamma\vdash\alpha\quad\quad\Gamma\vdash\alpha\Longrightarrow\beta}{\Gamma\vdash\beta}\quad(\text{use function})\\ +{\color{greenunder}\text{derivation rules}:}\quad & \frac{\Gamma,\alpha\vdash\beta}{\Gamma\vdash\alphaRightarrow\beta}\quad(\text{create function})\\ + & \frac{\Gamma\vdash\alpha\quad\quad\Gamma\vdash\alphaRightarrow\beta}{\Gamma\vdash\beta}\quad(\text{use function})\\ & \frac{\Gamma\vdash\alpha\quad\quad\Gamma\vdash\beta}{\Gamma\vdash\alpha\wedge\beta}\quad(\text{create tuple})\\ & \frac{\Gamma\vdash\alpha\wedge\beta}{\Gamma\vdash\alpha}\quad(\text{use tuple-}1)\quad\quad\quad\frac{\Gamma\vdash\alpha\wedge\beta}{\Gamma\vdash\beta}\quad(\text{use tuple-}2)\\ & \frac{\Gamma\vdash\alpha}{\Gamma\vdash\alpha\vee\beta}\quad(\text{create \texttt{Left}})\quad\quad\quad\frac{\Gamma\vdash\beta}{\Gamma\vdash\alpha\vee\beta}\quad(\text{create \texttt{Right}})\\ @@ -1319,7 +1318,7 @@ \subsection{Example: Proving a ${\cal CH}$-proposition and deriving code\label{s \noindent Implementing this function is the same as being able to compute a value of type \[ -F\triangleq\forall(A,B).\,((A\Rightarrow A)\Rightarrow B)\Rightarrow B\quad. +F\triangleq\forall(A,B).\,((A\rightarrow A)\rightarrow B)\rightarrow B\quad. \] Since the type parameters $A$ and $B$ are arbitrary, the body of the fully parametric function \lstinline!f! cannot use any previously @@ -1330,7 +1329,7 @@ \subsection{Example: Proving a ${\cal CH}$-proposition and deriving code\label{s this sequent using the rules of Table~\ref{tab:ch-correspondence-type-notation-CH-propositions}, we get \begin{equation} -\forall(\alpha,\beta).\;\emptyset\vdash((\alpha\Longrightarrow\alpha)\Longrightarrow\beta)\Longrightarrow\beta\quad,\label{eq:ch-example-sequent-2} +\forall(\alpha,\beta).\;\emptyset\vdash((\alphaRightarrow\alpha)Rightarrow\beta)Rightarrow\beta\quad,\label{eq:ch-example-sequent-2} \end{equation} where we denoted $\alpha\triangleq{\cal CH}(A)$ and $\beta\triangleq{\cal CH}(B)$. @@ -1341,38 +1340,38 @@ \subsection{Example: Proving a ${\cal CH}$-proposition and deriving code\label{s Begin by looking for a proof rule whose ``denominator'' has a sequent similar to Eq.~(\ref{eq:ch-example-sequent-2}), i.e.~has an implication -($p\Rightarrow q$) in the goal. We have only one rule that can prove -a sequent of the form $\Gamma\vdash(p\Longrightarrow q$); this is -the rule ``$\text{create function}$''. That rule requires us to -already have a proof of the sequent $(\Gamma,p)\vdash q$. So, we -use this rule with $\Gamma=\emptyset$, $p=(\alpha\Longrightarrow\alpha)\Longrightarrow\beta$, +($p\rightarrow q$) in the goal. We have only one rule that can prove +a sequent of the form $\Gamma\vdash(pRightarrowq$); this is the rule +``$\text{create function}$''. That rule requires us to already +have a proof of the sequent $(\Gamma,p)\vdash q$. So, we use this +rule with $\Gamma=\emptyset$, $p=(\alphaRightarrow\alpha)Rightarrow\beta$, and $q=\beta$: \[ -\frac{(\alpha\Longrightarrow\alpha)\Longrightarrow\beta\vdash\beta}{\emptyset\vdash((\alpha\Longrightarrow\alpha)\Longrightarrow\beta)\Longrightarrow\beta}\quad. +\frac{(\alphaRightarrow\alpha)Rightarrow\beta\vdash\beta}{\emptyset\vdash((\alphaRightarrow\alpha)Rightarrow\beta)Rightarrow\beta}\quad. \] -We now need to prove the sequent $(\alpha\Longrightarrow\alpha)\Longrightarrow\beta)\vdash\beta$, -which we can write as $\Gamma_{1}\vdash\beta$ where $\Gamma_{1}\triangleq[(\alpha\Rightarrow\alpha)\Rightarrow\beta]$ -denotes the set containing the single premise $(\alpha\Longrightarrow\alpha)\Longrightarrow\beta$. +We now need to prove the sequent $(\alphaRightarrow\alpha)Rightarrow\beta)\vdash\beta$, +which we can write as $\Gamma_{1}\vdash\beta$ where $\Gamma_{1}\triangleq[(\alpha\rightarrow\alpha)\rightarrow\beta]$ +denotes the set containing the single premise $(\alphaRightarrow\alpha)Rightarrow\beta$. There are no proof rules that derive a sequent with an explicit premise -of the form of an implication $p\Longrightarrow q$. However, we have -a rule called ``$\text{use function}$'' that derives a sequent -by assuming another sequent containing an implication. We would be -able to use that rule, +of the form of an implication $pRightarrowq$. However, we have a +rule called ``$\text{use function}$'' that derives a sequent by +assuming another sequent containing an implication. We would be able +to use that rule, \[ -\frac{\Gamma_{1}\vdash\alpha\Longrightarrow\alpha\quad\quad\Gamma_{1}\vdash(\alpha\Longrightarrow\alpha)\Longrightarrow\beta}{\Gamma_{1}\vdash\beta}\quad, +\frac{\Gamma_{1}\vdash\alphaRightarrow\alpha\quad\quad\Gamma_{1}\vdash(\alphaRightarrow\alpha)Rightarrow\beta}{\Gamma_{1}\vdash\beta}\quad, \] -if we could prove the two sequents $\Gamma_{1}\vdash\alpha\Longrightarrow\alpha$ -and $\Gamma_{1}\vdash(\alpha\Longrightarrow\alpha)\Longrightarrow\beta$. -To prove these sequents, note that the rule ``$\text{create function}$'' -applies to $\Gamma_{1}\vdash\alpha\Longrightarrow\alpha$ as follows, +if we could prove the two sequents $\Gamma_{1}\vdash\alphaRightarrow\alpha$ +and $\Gamma_{1}\vdash(\alphaRightarrow\alpha)Rightarrow\beta$. To +prove these sequents, note that the rule ``$\text{create function}$'' +applies to $\Gamma_{1}\vdash\alphaRightarrow\alpha$ as follows, \[ -\frac{\Gamma_{1},\alpha\vdash\alpha}{\Gamma_{1}\vdash\alpha\Longrightarrow\alpha}\quad. +\frac{\Gamma_{1},\alpha\vdash\alpha}{\Gamma_{1}\vdash\alphaRightarrow\alpha}\quad. \] The sequent $\Gamma_{1},\alpha\vdash\alpha$ is proved directly by -the axiom ``$\text{use arg}$''. The sequent $\Gamma_{1}\vdash(\alpha\Longrightarrow\alpha)\Longrightarrow\beta$ +the axiom ``$\text{use arg}$''. The sequent $\Gamma_{1}\vdash(\alphaRightarrow\alpha)Rightarrow\beta$ is also proved by the axiom ``$\text{use arg}$'' because $\Gamma_{1}$ -already contains $(\alpha\Longrightarrow\alpha)\Longrightarrow\beta$. +already contains $(\alphaRightarrow\alpha)Rightarrow\beta$. The proof of the sequent~(\ref{eq:ch-example-sequent-2}) is now complete and can be visualized as a tree (Figure~\ref{fig:Proof-of-the-sequent-example-2}). @@ -1405,30 +1404,30 @@ \subsection{Example: Proving a ${\cal CH}$-proposition and deriving code\label{s $\Gamma_{1},\alpha\vdash\alpha$. So, we need to use the same $x^{:A}$ when we write the code for the previous rule, ``$\text{create function}$'': \[ -\text{Proof}\left(\Gamma_{1}\vdash\alpha\Longrightarrow\alpha\right)=(x^{:A}\Rightarrow\text{Proof}\left(\Gamma_{1},\alpha\vdash\alpha\right))=(x^{:A}\Rightarrow x)\quad. +\text{Proof}\left(\Gamma_{1}\vdash\alphaRightarrow\alpha\right)=(x^{:A}\rightarrow\text{Proof}\left(\Gamma_{1},\alpha\vdash\alpha\right))=(x^{:A}\rightarrow x)\quad. \] The right-most leaf ``$\text{use arg}$'' corresponds to the code -$f^{:(A\Rightarrow A)\Rightarrow B}$, where $f$ is the premise contained +$f^{:(A\rightarrow A)\rightarrow B}$, where $f$ is the premise contained in $\Gamma_{1}$. So we can write \[ -\text{Proof}\left(\Gamma_{1}\vdash(\alpha\Longrightarrow\alpha)\Longrightarrow\beta\right)=f^{:(A\Rightarrow A)\Rightarrow B}\quad. +\text{Proof}\left(\Gamma_{1}\vdash(\alphaRightarrow\alpha)Rightarrow\beta\right)=f^{:(A\rightarrow A)\rightarrow B}\quad. \] The previous rule, ``$\text{use function}$'', combines the two preceding proofs: \begin{align*} - & \text{Proof}\left((\alpha\Longrightarrow\alpha)\Longrightarrow\beta\vdash\beta\right)\\ - & =\text{Proof}(\Gamma_{1}\vdash(\alpha\Longrightarrow\alpha)\Longrightarrow\beta)\left(\text{Proof}(\Gamma_{1}\vdash\alpha\Longrightarrow\alpha)\right)\\ - & =f(x^{:A}\Rightarrow x)\quad. + & \text{Proof}\left((\alphaRightarrow\alpha)Rightarrow\beta\vdash\beta\right)\\ + & =\text{Proof}(\Gamma_{1}\vdash(\alphaRightarrow\alpha)Rightarrow\beta)\left(\text{Proof}(\Gamma_{1}\vdash\alphaRightarrow\alpha)\right)\\ + & =f(x^{:A}\rightarrow x)\quad. \end{align*} Keep going backwards and find that the rule applied before ``$\text{use function}$'' -is ``$\text{create function}$''. We need to provide the same $f^{:\left(A\Rightarrow A\right)\Rightarrow B}$ +is ``$\text{create function}$''. We need to provide the same $f^{:\left(A\rightarrow A\right)\rightarrow B}$ as in the premise above, and so we obtain the code \begin{align*} - & \text{Proof}\left(\emptyset\vdash((\alpha\Longrightarrow\alpha)\Longrightarrow\beta)\Longrightarrow\beta\right)\\ - & =f^{:\left(A\Rightarrow A\right)\Rightarrow B}\Rightarrow\text{Proof}\left((\alpha\Longrightarrow\alpha)\Longrightarrow\beta\vdash\beta\right)\\ - & =f^{:\left(A\Rightarrow A\right)\Rightarrow B}\Rightarrow f(x^{:A}\Rightarrow x)\quad. + & \text{Proof}\left(\emptyset\vdash((\alphaRightarrow\alpha)Rightarrow\beta)Rightarrow\beta\right)\\ + & =f^{:\left(A\rightarrow A\right)\rightarrow B}\rightarrow\text{Proof}\left((\alphaRightarrow\alpha)Rightarrow\beta\vdash\beta\right)\\ + & =f^{:\left(A\rightarrow A\right)\rightarrow B}\rightarrow f(x^{:A}\rightarrow x)\quad. \end{align*} -This is the final code expression that implements the type $(\left(A\Rightarrow A\right)\Rightarrow B)\Rightarrow B$. +This is the final code expression that implements the type $(\left(A\rightarrow A\right)\rightarrow B)\rightarrow B$. In this way, we have systematically derived the code from the type signature of a function. This function can be implemented in Scala as @@ -1456,7 +1455,7 @@ \subsection{Example: Proving a ${\cal CH}$-proposition and deriving code\label{s Consider the type signature \[ -\forall(A,B).\,\left(\left(\left(\left(A\Rightarrow B\right)\Rightarrow A\right)\Rightarrow A\right)\Rightarrow B\right)\Rightarrow B\quad. +\forall(A,B).\,\left(\left(\left(\left(A\rightarrow B\right)\rightarrow A\right)\rightarrow A\right)\rightarrow B\right)\rightarrow B\quad. \] It is not immediately clear whether it is even possible to implement a function with this type signature. It turns out that it \emph{is} @@ -1471,7 +1470,7 @@ \subsection{Example: Proving a ${\cal CH}$-proposition and deriving code\label{s @ println(f.lambdaTerm.prettyPrint) a => a (b => b (c => a (d => c))) \end{lstlisting} -The code $a\Rightarrow a\left(b\Rightarrow b\left(c\Rightarrow a\left(d\Rightarrow c\right)\right)\right)$ +The code $a\rightarrow a\left(b\rightarrow b\left(c\rightarrow a\left(d\rightarrow c\right)\right)\right)$ was derived automatically for the function \lstinline!f!. The function \lstinline!f! was compiled and is ready to be used in any subsequent code. @@ -1495,7 +1494,7 @@ \subsection{Example: Proving a ${\cal CH}$-proposition and deriving code\label{s \noindent The logical formula corresponding to this type signature is \begin{equation} -\forall(\alpha,\beta).\,\left(\left(\alpha\Longrightarrow\alpha\right)\Longrightarrow\beta\right)\Longrightarrow\beta\quad.\label{eq:ch-example-3-peirce-law} +\forall(\alpha,\beta).\,\left(\left(\alphaRightarrow\alpha\right)Rightarrow\beta\right)Rightarrow\beta\quad.\label{eq:ch-example-3-peirce-law} \end{equation} This formula is known as ``Peirce's law''.\footnote{\texttt{\href{https://en.wikipedia.org/wiki/Peirce\%27s_law}{https://en.wikipedia.org/wiki/Peirce\%27s\_law}}} It is another example showing that the logic of types in functional @@ -1528,7 +1527,7 @@ \section{Solved examples: Equivalence of types} An example of the CH correspondence is that a proof of the logical proposition \begin{equation} -\forall(\alpha,\beta).\,\alpha\Longrightarrow\left(\beta\Longrightarrow\alpha\right)\label{eq:ch-proposition-example-2} +\forall(\alpha,\beta).\,\alphaRightarrow\left(\betaRightarrow\alpha\right)\label{eq:ch-proposition-example-2} \end{equation} corresponds to the code of the function \begin{lstlisting} @@ -1537,7 +1536,7 @@ \section{Solved examples: Equivalence of types} With the CH correspondence in mind, we may say that the function \lstinline!f!'s code ``is'' the proof of the proposition~(\ref{eq:ch-proposition-example-2}). In this sense, the \emph{existence} of the code \lstinline!x => _ => x! -with the type $A\Rightarrow(B\Rightarrow A)$ ``is'' a proof of +with the type $A\rightarrow(B\rightarrow A)$ ``is'' a proof of the logical formula~(\ref{eq:ch-proposition-example-2}). The Curry-Howard correspondence maps logic formulas such as $(\alpha\vee\beta)\wedge\gamma$ @@ -1571,12 +1570,12 @@ \subsection{Logical identity does not correspond to type equivalence\label{subse \end{equation} This formula is the well-known ``distributive law''\footnote{\texttt{\href{https://en.wikipedia.org/wiki/Distributive_property\#Rule_of_replacement}{https://en.wikipedia.org/wiki/Distributive\_property\#Rule\_of\_replacement}}} valid in Boolean logic as well as in the constructive logic. Since -a logical equation $P=Q$ means $P\Longrightarrow Q$ and $Q\Longrightarrow P$, +a logical equation $P=Q$ means $PRightarrowQ$ and $QRightarrowP$, the distributive law~(\ref{eq:ch-example-distributive-1}) means that the two formulas hold, \begin{align} - & \forall(A,B,C).\,\left(A\vee B\right)\wedge C\Longrightarrow\left(A\wedge C\right)\vee\left(B\wedge C\right)\quad,\label{eq:ch-example-distributive-1a}\\ - & \forall(A,B,C).\,\left(A\wedge C\right)\vee\left(B\wedge C\right)\Longrightarrow\left(A\vee B\right)\wedge C\quad.\label{eq:ch-example-distributive-1b} + & \forall(A,B,C).\,\left(A\vee B\right)\wedge CRightarrow\left(A\wedge C\right)\vee\left(B\wedge C\right)\quad,\label{eq:ch-example-distributive-1a}\\ + & \forall(A,B,C).\,\left(A\wedge C\right)\vee\left(B\wedge C\right)Rightarrow\left(A\vee B\right)\wedge C\quad.\label{eq:ch-example-distributive-1b} \end{align} The CH correspondence maps these logical formulas to fully parametric functions with types @@ -1586,8 +1585,8 @@ \subsection{Logical identity does not correspond to type equivalence\label{subse \end{lstlisting} In the type notation, these type signatures are written as \begin{align*} - & f_{1}:\forall(A,B,C).\,\left(A+B\right)\times C\Rightarrow A\times C+B\times C\quad,\\ - & f_{2}:\forall(A,B,C).\;A\times C+B\times C\Rightarrow\left(A+B\right)\times C\quad. + & f_{1}:\forall(A,B,C).\,\left(A+B\right)\times C\rightarrow A\times C+B\times C\quad,\\ + & f_{2}:\forall(A,B,C).\;A\times C+B\times C\rightarrow\left(A+B\right)\times C\quad. \end{align*} Since the two logical formulas (\ref{eq:ch-example-distributive-1a})\textendash (\ref{eq:ch-example-distributive-1b}) are true theorems in constructive logic, we expect to be able to implement @@ -1649,7 +1648,7 @@ \subsection{Logical identity does not correspond to type equivalence\label{subse Generally, we say that types $P$ and $Q$ are \textbf{equivalent} or \textbf{isomorphic} (denoted $P\cong Q$) \index{type equivalence}when -there exist functions $f_{1}^{:P\Rightarrow Q}$ and $f_{2}^{:Q\Rightarrow P}$ +there exist functions $f_{1}^{:P\rightarrow Q}$ and $f_{2}^{:Q\rightarrow P}$ that are inverses of each other. We can write these conditions using the notation $(f_{1}\bef f_{2})(x)\triangleq f_{2}(f_{1}(x))$ as \[ @@ -1742,9 +1741,9 @@ \subsection{Logical identity does not correspond to type equivalence\label{subse a value of type \lstinline!A!, which cannot possibly be stored in a value of type \lstinline!Unit!. We can verify this intuition rigorously by proving that any fully parametric functions with type signatures -$g_{1}:\bbnum 1+A\Rightarrow\bbnum 1$ and $g_{2}:\bbnum 1\Rightarrow\bbnum 1+A$ +$g_{1}:\bbnum 1+A\rightarrow\bbnum 1$ and $g_{2}:\bbnum 1\rightarrow\bbnum 1+A$ will not satisfy $g_{1}\bef g_{2}=\text{id}$. To verify this, we -note that $g_{2}:\bbnum 1\Rightarrow\bbnum 1+A$ must have type signature +note that $g_{2}:\bbnum 1\rightarrow\bbnum 1+A$ must have type signature \begin{wrapfigure}{l}{0.4\columnwidth}% \vspace{-0.8\baselineskip} @@ -1759,7 +1758,7 @@ \subsection{Logical identity does not correspond to type equivalence\label{subse a fully parametric function cannot produce values of an arbitrary type \lstinline!A! from scratch. Therefore, $g_{1}\bef g_{2}$ is also a function that always returns \lstinline!None!. The function -$g_{1}\bef g_{2}$ has type signature $\bbnum 1+A\Rightarrow\bbnum 1+A$ +$g_{1}\bef g_{2}$ has type signature $\bbnum 1+A\rightarrow\bbnum 1+A$ or, in Scala syntax, \lstinline!Option[A] => Option[A]!, and is not equal to the identity function, because the identity function does not \emph{always} return \lstinline!None!. @@ -1780,7 +1779,7 @@ \subsection{Logical identity does not correspond to type equivalence\label{subse \end{equation} However, the types $A\times B+C$ and $\left(A+C\right)\times\left(B+C\right)$ are \emph{not} equivalent. To see why, look at the possible code of -the function $g_{3}:\left(A+C\right)\times\left(B+C\right)\Rightarrow A\times B+C$: +the function $g_{3}:\left(A+C\right)\times\left(B+C\right)\rightarrow A\times B+C$: \begin{lstlisting}[numbers=left,numberstyle={\small}] def g3[A,B,C]: ((Either[A, C], Either[B, C])) => Either[(A, B), C] = { case (Left(a), Left(b)) => Left((a, b)) // No other choice. @@ -1800,9 +1799,9 @@ \subsection{Logical identity does not correspond to type equivalence\label{subse We conclude that a logical identity ${\cal CH}(P)={\cal CH}(Q)$ guarantees, via the CH correspondence, that we can implement \emph{some} fully -parametric functions of types $P\Rightarrow Q$ and $Q\Rightarrow P$. +parametric functions of types $P\rightarrow Q$ and $Q\rightarrow P$. However, it is not guaranteed that these functions are inverses of -each other, i.e.~that the type conversions $P\Rightarrow Q$ or $Q\Rightarrow P$ +each other, i.e.~that the type conversions $P\rightarrow Q$ or $Q\rightarrow P$ have no information loss\index{information loss}. So, the type equivalence $P\cong Q$ does not automatically follow from the logical identity ${\cal CH}(P)={\cal CH}(Q)$. @@ -1921,7 +1920,7 @@ \subsubsection{Example \label{subsec:ch-Example-0-plus-A}\ref{subsec:ch-Example- \lstinline!Either[Nothing, A]!. We need to show that any value of that type can be mapped without loss of information to a value of type \lstinline!A!, and vice versa. This means implementing functions -$f_{1}:\bbnum 0+A\Rightarrow A$ and $f_{2}:A\Rightarrow\bbnum 0+A$ +$f_{1}:\bbnum 0+A\rightarrow A$ and $f_{2}:A\rightarrow\bbnum 0+A$ such that $f_{1}\bef f_{2}=\text{id}$ and $f_{2}\bef f_{1}=\text{id}$. The argument of $f_{1}$ is of type \lstinline!Either[Nothing, A]!. @@ -1976,8 +1975,8 @@ \subsubsection{Example \label{subsec:ch-Example-0-plus-A}\ref{subsec:ch-Example- \noindent We can write the functions \lstinline!toLeft! and \lstinline!toRight! in a code notation as \begin{align*} - & \text{toLeft}^{A,B}=x^{:A}\Rightarrow x^{:A}+\bbnum 0^{:B}\quad,\\ - & \text{toRight}^{A,B}=y^{:B}\Rightarrow\bbnum 0^{:A}+y^{:B}\quad. + & \text{toLeft}^{A,B}=x^{:A}\rightarrow x^{:A}+\bbnum 0^{:B}\quad,\\ + & \text{toRight}^{A,B}=y^{:B}\rightarrow\bbnum 0^{:A}+y^{:B}\quad. \end{align*} In this notation, a value of the disjunctive type is shown without using Scala class names such as \lstinline!Either!, \lstinline!Right!, @@ -2004,8 +2003,8 @@ \subsubsection{Example \label{subsec:ch-Example-1xA}\ref{subsec:ch-Example-1xA}} \subparagraph{Solution} The corresponding Scala types are the tuple \lstinline!(A, Unit)! -and the type \lstinline!A!. We need to implement functions $f_{1}:\forall A.\,A\times\bbnum 1\Rightarrow A$ -and $f_{2}:\forall A.\,A\Rightarrow A\times\bbnum 1$ and to demonstrate +and the type \lstinline!A!. We need to implement functions $f_{1}:\forall A.\,A\times\bbnum 1\rightarrow A$ +and $f_{2}:\forall A.\,A\rightarrow A\times\bbnum 1$ and to demonstrate that they are inverses of each other. The Scala code for these functions is \begin{lstlisting} @@ -2020,8 +2019,8 @@ \subsubsection{Example \label{subsec:ch-Example-1xA}\ref{subsec:ch-Example-1xA}} Now let us write a proof in the code notation. The codes of $f_{1}$ and $f_{2}$ are \begin{align*} -f_{1} & =a^{:A}\times1\Rightarrow a\quad,\\ -f_{2} & =a^{:A}\Rightarrow a\times1\quad, +f_{1} & =a^{:A}\times1\rightarrow a\quad,\\ +f_{2} & =a^{:A}\rightarrow a\times1\quad, \end{align*} where we denoted by $1$ the value \lstinline!()! of the \lstinline!Unit! type. We find @@ -2033,8 +2032,8 @@ \subsubsection{Example \label{subsec:ch-Example-1xA}\ref{subsec:ch-Example-1xA}} way of writing the proof is by computing the function compositions symbolically, without applying to a value $a^{:A}$, \begin{align*} -f_{1}\bef f_{2} & =\left(a\times1\Rightarrow a\right)\bef\left(a\Rightarrow a\times1\right)=\left(a\times1\Rightarrow a\times1\right)=\text{id}^{A\times\bbnum 1}\quad,\\ -f_{2}\bef f_{1} & =\left(a\Rightarrow a\times1\right)\bef\left(a\times1\Rightarrow a\right)=\left(a\Rightarrow a\right)=\text{id}^{A}\quad. +f_{1}\bef f_{2} & =\left(a\times1\rightarrow a\right)\bef\left(a\rightarrow a\times1\right)=\left(a\times1\rightarrow a\times1\right)=\text{id}^{A\times\bbnum 1}\quad,\\ +f_{2}\bef f_{1} & =\left(a\rightarrow a\times1\right)\bef\left(a\times1\rightarrow a\right)=\left(a\rightarrow a\right)=\text{id}^{A}\quad. \end{align*} @@ -2098,7 +2097,7 @@ \subsubsection{Example \label{subsec:ch-Example-A+B}\ref{subsec:ch-Example-A+B}} depending on whether the argument of \lstinline!f1! has type $A+\bbnum 0$ or $\bbnum 0+B$. So, we may write the code of \lstinline!f1! as \[ -f_{1}\triangleq x^{:A+B}\Rightarrow\begin{cases} +f_{1}\triangleq x^{:A+B}\rightarrow\begin{cases} \text{if }x=a^{:A}+\bbnum 0^{:B}\quad: & \bbnum 0^{:B}+a^{:A}\\ \text{if }x=\bbnum 0^{:A}+b^{:B}\quad: & b^{:B}+\bbnum 0^{:A} \end{cases} @@ -2120,8 +2119,8 @@ \subsubsection{Example \label{subsec:ch-Example-A+B}\ref{subsec:ch-Example-A+B}} \[ f_{1}\triangleq\begin{array}{|c||cc|} & B & A\\ -\hline A~ & \bbnum 0 & a^{:A}\Rightarrow a\\ -B~ & b^{:B}\Rightarrow b & \bbnum 0 +\hline A~ & \bbnum 0 & a^{:A}\rightarrow a\\ +B~ & b^{:B}\rightarrow b & \bbnum 0 \end{array}\quad. \] \vspace{-0.5\baselineskip} @@ -2148,8 +2147,8 @@ \subsubsection{Example \label{subsec:ch-Example-A+B}\ref{subsec:ch-Example-A+B}} \[ f_{2}\triangleq\begin{array}{|c||cc|} & A & B\\ -\hline B~ & \bbnum 0 & y^{:B}\Rightarrow y\\ -A~ & x^{:A}\Rightarrow x & \bbnum 0 +\hline B~ & \bbnum 0 & y^{:B}\rightarrow y\\ +A~ & x^{:A}\rightarrow x & \bbnum 0 \end{array}\quad. \] \vspace{-0.8\baselineskip} @@ -2161,23 +2160,23 @@ \subsubsection{Example \label{subsec:ch-Example-A+B}\ref{subsec:ch-Example-A+B}} \begin{align*} f_{1}\bef f_{2} & =\begin{array}{|c||cc|} & B & A\\ -\hline A~ & \bbnum 0 & a^{:A}\Rightarrow a\\ -B~ & b^{:B}\Rightarrow b & \bbnum 0 +\hline A~ & \bbnum 0 & a^{:A}\rightarrow a\\ +B~ & b^{:B}\rightarrow b & \bbnum 0 \end{array}\,\bef\,\begin{array}{|c||cc|} & A & B\\ -\hline B~ & \bbnum 0 & y^{:B}\Rightarrow y\\ -A~ & x^{:A}\Rightarrow x & \bbnum 0 +\hline B~ & \bbnum 0 & y^{:B}\rightarrow y\\ +A~ & x^{:A}\rightarrow x & \bbnum 0 \end{array}\\ {\color{greenunder}\text{use matrix multiplication}:}\quad & =\begin{array}{|c||cc|} & A & B\\ -\hline A~ & (a^{:A}\Rightarrow a)\bef(x^{:A}\Rightarrow x) & \bbnum 0\\ -B~ & \bbnum 0 & (b^{:B}\Rightarrow b)\bef(y^{:B}\Rightarrow y) +\hline A~ & (a^{:A}\rightarrow a)\bef(x^{:A}\rightarrow x) & \bbnum 0\\ +B~ & \bbnum 0 & (b^{:B}\rightarrow b)\bef(y^{:B}\rightarrow y) \end{array}\\ {\color{greenunder}\text{function composition}:}\quad & =\begin{array}{|c||cc|} & A & B\\ \hline A~ & \text{id} & \bbnum 0\\ B~ & \bbnum 0 & \text{id} -\end{array}=\text{id}^{:A+B\Rightarrow A+B}\quad. +\end{array}=\text{id}^{:A+B\rightarrow A+B}\quad. \end{align*} Several features of the matrix notation are helpful in such calculations. The parts of the code of $f_{1}$ are automatically composed with @@ -2191,15 +2190,15 @@ \subsubsection{Example \label{subsec:ch-Example-A+B}\ref{subsec:ch-Example-A+B}} type annotations and write the derivation as \begin{align*} f_{1}\bef f_{2} & =\begin{array}{||cc|} -\bbnum 0 & a^{:A}\Rightarrow a\\ -b^{:B}\Rightarrow b & \bbnum 0 +\bbnum 0 & a^{:A}\rightarrow a\\ +b^{:B}\rightarrow b & \bbnum 0 \end{array}\,\bef\,\begin{array}{||cc|} -\bbnum 0 & y^{:B}\Rightarrow y\\ -x^{:A}\Rightarrow x & \bbnum 0 +\bbnum 0 & y^{:B}\rightarrow y\\ +x^{:A}\rightarrow x & \bbnum 0 \end{array}\\ {\color{greenunder}\text{use matrix multiplication}:}\quad & =\begin{array}{||cc|} -(a^{:A}\Rightarrow a)\bef(x^{:A}\Rightarrow x) & \bbnum 0\\ -\bbnum 0 & (b^{:B}\Rightarrow b)\bef(y^{:B}\Rightarrow y) +(a^{:A}\rightarrow a)\bef(x^{:A}\rightarrow x) & \bbnum 0\\ +\bbnum 0 & (b^{:B}\rightarrow b)\bef(y^{:B}\rightarrow y) \end{array}\\ {\color{greenunder}\text{function composition}:}\quad & =\begin{array}{||cc|} \text{id} & \bbnum 0\\ @@ -2354,9 +2353,9 @@ \subsubsection{Example \label{subsec:ch-Example-cardinality-option-either}\ref{s Begin by writing the given types in the type notation: \lstinline!Option[A]! is written as $\bbnum 1+A$, and \lstinline!Either[Unit, A]! is written -also as $\bbnum 1+A$. This already indicates, by looking at the notation -alone, that the types are equivalent. But let us verify explicitly -that the type notation is not misleading here. +also as $\bbnum 1+A$. The notation already indicates that the types +are equivalent. But let us verify explicitly that the type notation +is not misleading here. To establish type equivalence, we need to implement two fully parametric functions @@ -2406,7 +2405,7 @@ \subsection{Type equivalence involving function types} Consider two types $A$ and $B$, whose cardinalities are known as $\left|A\right|$ and $\left|B\right|$. What is the cardinality of the set of all maps between given sets $A$ and $B$? In other words, -how many distinct values does the function type $A\Rightarrow B$ +how many distinct values does the function type $A\rightarrow B$ have? A function \lstinline!f: A => B! needs to select a value of type $B$ for each possible value of type $A$. Therefore, the number of different functions \lstinline!f: A => B! is $\left|B\right|^{\left|A\right|}$ @@ -2416,13 +2415,13 @@ \subsection{Type equivalence involving function types} For the types $A=B=\text{Int}$, we have $\left|A\right|=\left|B\right|=2^{32}$, and so the estimate will give \[ -\left|A\Rightarrow B\right|=\left(2^{32}\right)^{\left(2^{32}\right)}=2^{32\times2^{32}}=2^{2^{37}}\approx10^{4.1\times10^{10}}\quad. +\left|A\rightarrow B\right|=\left(2^{32}\right)^{\left(2^{32}\right)}=2^{32\times2^{32}}=2^{2^{37}}\approx10^{4.1\times10^{10}}\quad. \] In fact, most of these functions will map integers to integers in a complicated (and practically useless) way and will be impossible to implement on a realistic computer because their code will be much longer than the available memory. So, the number of practically implementable -functions of type $A\Rightarrow B$ is often much smaller than $\left|B\right|^{\left|A\right|}$. +functions of type $A\rightarrow B$ is often much smaller than $\left|B\right|^{\left|A\right|}$. Nevertheless, the estimate $\left|B\right|^{\left|A\right|}$ is useful since it shows the number of distinct functions that are possible in principle. @@ -2434,10 +2433,10 @@ \subsection{Type equivalence involving function types} and $c\triangleq\left|C\right|$ for brevity.) It is notable that no logic identity is available for the formula -$\alpha\Rightarrow\left(\beta\vee\gamma\right)$, and correspondingly -no type equivalence is available for the type expression $A\Rightarrow B+C$ -(although there is an identity for $A\Rightarrow B\times C$). The -presence of type expressions of the form $A\Rightarrow B+C$ makes +$\alphaRightarrow\left(\beta\vee\gamma\right)$, and correspondingly +no type equivalence is available for the type expression $A\rightarrow B+C$ +(although there is an identity for $A\rightarrow B\times C$). The +presence of type expressions of the form $A\rightarrow B+C$ makes type reasoning more complicated because they cannot be transformed into equivalent formulas with simpler parts. @@ -2448,19 +2447,19 @@ \subsection{Type equivalence involving function types} \textbf{\small{}Logical identity (if holds)} & \textbf{\small{}Type equivalence} & \textbf{\small{}Arithmetic identity}\tabularnewline \hline \hline -{\small{}$\left(True\Longrightarrow\alpha\right)=\alpha$} & {\small{}$\bbnum 1\Rightarrow A\cong A$} & {\small{}$a^{1}=a$}\tabularnewline +{\small{}$\left(TrueRightarrow\alpha\right)=\alpha$} & {\small{}$\bbnum 1\rightarrow A\cong A$} & {\small{}$a^{1}=a$}\tabularnewline \hline -{\small{}$\left(False\Longrightarrow\alpha\right)=True$} & {\small{}$\bbnum 0\Rightarrow A\cong\bbnum 1$} & {\small{}$a^{0}=1$}\tabularnewline +{\small{}$\left(FalseRightarrow\alpha\right)=True$} & {\small{}$\bbnum 0\rightarrow A\cong\bbnum 1$} & {\small{}$a^{0}=1$}\tabularnewline \hline -{\small{}$\left(\alpha\Longrightarrow True\right)=True$} & {\small{}$A\Rightarrow\bbnum 1\cong\bbnum 1$} & {\small{}$1^{a}=1$}\tabularnewline +{\small{}$\left(\alphaRightarrow True\right)=True$} & {\small{}$A\rightarrow\bbnum 1\cong\bbnum 1$} & {\small{}$1^{a}=1$}\tabularnewline \hline -{\small{}$\left(\alpha\Longrightarrow False\right)\neq False$} & {\small{}$A\Rightarrow\bbnum 0\not\cong\bbnum 0$} & {\small{}$0^{a}\neq0$}\tabularnewline +{\small{}$\left(\alphaRightarrow False\right)\neq False$} & {\small{}$A\rightarrow\bbnum 0\not\cong\bbnum 0$} & {\small{}$0^{a}\neq0$}\tabularnewline \hline -{\small{}$\left(\alpha\vee\beta\right)\Longrightarrow\gamma=\left(\alpha\Longrightarrow\gamma\right)\wedge\left(\beta\Longrightarrow\gamma\right)$} & {\small{}$A+B\Rightarrow C\cong\left(A\Rightarrow C\right)\times\left(B\Rightarrow C\right)$} & {\small{}$c^{a+b}=c^{a}\times c^{b}$}\tabularnewline +{\small{}$\left(\alpha\vee\beta\right)Rightarrow\gamma=\left(\alphaRightarrow\gamma\right)\wedge\left(\betaRightarrow\gamma\right)$} & {\small{}$A+B\rightarrow C\cong\left(A\rightarrow C\right)\times\left(B\rightarrow C\right)$} & {\small{}$c^{a+b}=c^{a}\times c^{b}$}\tabularnewline \hline -{\small{}$(\alpha\wedge\beta)\Longrightarrow\gamma=\alpha\Longrightarrow\left(\beta\Longrightarrow\gamma\right)$} & {\small{}$A\times B\Rightarrow C\cong A\Rightarrow B\Rightarrow C$} & {\small{}$c^{a\times b}=\left(c^{b}\right)^{a}$}\tabularnewline +{\small{}$(\alpha\wedge\beta)Rightarrow\gamma=\alphaRightarrow\left(\betaRightarrow\gamma\right)$} & {\small{}$A\times B\rightarrow C\cong A\rightarrow B\rightarrow C$} & {\small{}$c^{a\times b}=\left(c^{b}\right)^{a}$}\tabularnewline \hline -{\small{}$\alpha\Longrightarrow\left(\beta\wedge\gamma\right)=\left(\alpha\Longrightarrow\beta\right)\wedge\left(\alpha\Longrightarrow\gamma\right)$} & {\small{}$A\Rightarrow B\times C\cong\left(A\Rightarrow B\right)\times\left(A\Rightarrow C\right)$} & {\small{}$\left(b\times c\right)^{a}=b^{a}\times c^{a}$}\tabularnewline +{\small{}$\alphaRightarrow\left(\beta\wedge\gamma\right)=\left(\alphaRightarrow\beta\right)\wedge\left(\alphaRightarrow\gamma\right)$} & {\small{}$A\rightarrow B\times C\cong\left(A\rightarrow B\right)\times\left(A\rightarrow C\right)$} & {\small{}$\left(b\times c\right)^{a}=b^{a}\times c^{a}$}\tabularnewline \hline \end{tabular} \par\end{centering} @@ -2472,15 +2471,15 @@ \subsection{Type equivalence involving function types} \subsubsection{Example \label{subsec:ch-Example-type-identity-f}\ref{subsec:ch-Example-type-identity-f}\index{solved examples}} -Verify the type equivalence $\bbnum 1\Rightarrow A\cong A$. +Verify the type equivalence $\bbnum 1\rightarrow A\cong A$. \subparagraph{Solution} -Recall that the type notation $\bbnum 1\Rightarrow A$ means the Scala +Recall that the type notation $\bbnum 1\rightarrow A$ means the Scala function type \lstinline!Unit => A!. There is only one value of type \lstinline!Unit!, so the choice of a function of the type \lstinline!Unit => A! is the same as the choice of a value of type \lstinline!A!. Thus, -the number of distinct values of the type $\bbnum 1\Rightarrow A$ +the number of distinct values of the type $\bbnum 1\rightarrow A$ is $\left|A\right|$, and the arithmetic identity holds. To verify the type equivalence explicitly, we need to implement two @@ -2531,25 +2530,25 @@ \subsubsection{Example \label{subsec:ch-Example-type-identity-f}\ref{subsec:ch-E For comparison, let us show the same proof in the code notation. The functions $f_{1}$ and $f_{2}$ are \begin{align*} - & f_{1}\triangleq h^{:\bbnum 1\Rightarrow A}\Rightarrow h(1)\quad,\\ - & f_{2}\triangleq x^{:A}\Rightarrow1\Rightarrow x\quad. + & f_{1}\triangleq h^{:\bbnum 1\rightarrow A}\rightarrow h(1)\quad,\\ + & f_{2}\triangleq x^{:A}\rightarrow1\rightarrow x\quad. \end{align*} Now write the function compositions in both directions: \begin{align*} - & f_{1}\bef f_{2}=(h^{:\bbnum 1\Rightarrow A}\Rightarrow h(1))\bef(x^{:A}\Rightarrow1\Rightarrow x)\\ -{\color{greenunder}\text{compute composition}:}\quad & =\left(h\Rightarrow1\Rightarrow h(1)\right)\\ -{\color{greenunder}\text{note that }1\Rightarrow h(1)\text{ is the same as }h:}\quad & =\left(h\Rightarrow h\right)=\text{id}\quad.\\ - & f_{2}\bef f_{1}=(x^{:A}\Rightarrow1\Rightarrow x)\bef(h^{:\bbnum 1\Rightarrow A}\Rightarrow h(1))\\ -{\color{greenunder}\text{compute composition}:}\quad & =x\Rightarrow(1\Rightarrow x)(1)\\ -{\color{greenunder}\text{apply function}:}\quad & =\left(x\Rightarrow x\right)=\text{id}\quad. + & f_{1}\bef f_{2}=(h^{:\bbnum 1\rightarrow A}\rightarrow h(1))\bef(x^{:A}\rightarrow1\rightarrow x)\\ +{\color{greenunder}\text{compute composition}:}\quad & =\left(h\rightarrow1\rightarrow h(1)\right)\\ +{\color{greenunder}\text{note that }1\rightarrow h(1)\text{ is the same as }h:}\quad & =\left(h\rightarrow h\right)=\text{id}\quad.\\ + & f_{2}\bef f_{1}=(x^{:A}\rightarrow1\rightarrow x)\bef(h^{:\bbnum 1\rightarrow A}\rightarrow h(1))\\ +{\color{greenunder}\text{compute composition}:}\quad & =x\rightarrow(1\rightarrow x)(1)\\ +{\color{greenunder}\text{apply function}:}\quad & =\left(x\rightarrow x\right)=\text{id}\quad. \end{align*} -The type $\bbnum 1\Rightarrow A$ is equivalent to the type $A$, +The type $\bbnum 1\rightarrow A$ is equivalent to the type $A$, but these types are not the same. The most important difference between these types is that a value of type $A$ is available immediately, -while a value of type $\bbnum 1\Rightarrow A$ is a function that +while a value of type $\bbnum 1\rightarrow A$ is a function that still needs to be applied to an argument (of type $\bbnum 1$) before -a value of type $A$ is obtained. The type $\bbnum 1\Rightarrow A$ +a value of type $A$ is obtained. The type $\bbnum 1\rightarrow A$ may represent an ``on-call''\index{on-call value} value of type $A$; that is, a value computed on demand every time. (See Section~\ref{subsec:Lazy-values-iterators-and-streams} for more details about ``on-call'' values.) @@ -2558,11 +2557,11 @@ \subsubsection{Example \label{subsec:ch-Example-type-identity-f}\ref{subsec:ch-E \subsubsection{Example \label{subsec:ch-Example-type-identity-0-to-A}\ref{subsec:ch-Example-type-identity-0-to-A}} -Verify the type equivalence $\bbnum 0\Rightarrow A\cong\bbnum 1$. +Verify the type equivalence $\bbnum 0\rightarrow A\cong\bbnum 1$. \subparagraph{Solution} -What could be a function $f^{:\bbnum 0\Rightarrow A}$ from the type +What could be a function $f^{:\bbnum 0\rightarrow A}$ from the type $\bbnum 0$ to a type $A$? Since there exist no values of type $\bbnum 0$, the function $f$ will never be applied to any arguments and so \emph{does not need} to compute any actual values of type $A$. So, $f$ is a @@ -2590,43 +2589,43 @@ \subsubsection{Example \label{subsec:ch-Example-type-identity-0-to-A}\ref{subsec type, e.g.~the type $A$. Let us now verify that there exists \emph{only one} function of type -$\bbnum 0\Rightarrow A$. Suppose there are two such functions, $f^{:\bbnum 0\Rightarrow A}$ -and $g^{:\bbnum 0\Rightarrow A}$. Are $f$ and $g$ different functions? +$\bbnum 0\rightarrow A$. Suppose there are two such functions, $f^{:\bbnum 0\rightarrow A}$ +and $g^{:\bbnum 0\rightarrow A}$. Are $f$ and $g$ different functions? We would see that $f$ and $g$ are different only if we had a value $x$ such that $f(x)\neq g(x)$, where $x$ must have type $\bbnum 0$. However, there are \emph{no} values of type $\bbnum 0$, and so we will never be able to find such $x$. It follows that any two functions -$f$ and $g$ of type $\bbnum 0\Rightarrow A$ are equal. In other -words, there exists only \emph{one} distinct value of type $\bbnum 0\Rightarrow A$; -i.e.~the cardinality of the type $\bbnum 0\Rightarrow A$ is $1$. -So, the type $\bbnum 0\Rightarrow A$ is equivalent to the type $\bbnum 1$. +$f$ and $g$ of type $\bbnum 0\rightarrow A$ are equal. In other +words, there exists only \emph{one} distinct value of type $\bbnum 0\rightarrow A$; +i.e.~the cardinality of the type $\bbnum 0\rightarrow A$ is $1$. +So, the type $\bbnum 0\rightarrow A$ is equivalent to the type $\bbnum 1$. \subsubsection{Example \label{subsec:ch-Example-type-identity-A-0}\ref{subsec:ch-Example-type-identity-A-0}} -Show that $A\Rightarrow\bbnum 0\not\cong\bbnum 0$ and $A\Rightarrow\bbnum 0\not\cong\bbnum 1$. +Show that $A\rightarrow\bbnum 0\not\cong\bbnum 0$ and $A\rightarrow\bbnum 0\not\cong\bbnum 1$. \subparagraph{Solution} To prove that two types are \emph{not} equivalent, it is sufficient to show that their type cardinalities are different. Let us determine -the cardinality of the type $A\Rightarrow\bbnum 0$, assuming that +the cardinality of the type $A\rightarrow\bbnum 0$, assuming that the cardinality of $A$ is known. We note that a function of type, -say, $\text{Int}\Rightarrow\bbnum 0$ is impossible to implement. -(If we had such a function $f^{:\text{Int}\Rightarrow\bbnum 0}$, +say, $\text{Int}\rightarrow\bbnum 0$ is impossible to implement. +(If we had such a function $f^{:\text{Int}\rightarrow\bbnum 0}$, we could evaluate, say, $x\triangleq f(123)$ and obtain a value $x$ of type $\bbnum 0$, which is impossible by definition of the type -$\bbnum 0$. It follows that $\left|\text{Int}\Rightarrow\bbnum 0\right|=0$. +$\bbnum 0$. It follows that $\left|\text{Int}\rightarrow\bbnum 0\right|=0$. However, Example~\ref{subsec:ch-Example-type-identity-0-to-A} shows -that $\bbnum 0\Rightarrow\bbnum 0$ has cardinality $1$. So, the -cardinality $\left|A\Rightarrow\bbnum 0\right|=1$ if the type $A$ -is itself $\bbnum 0$ but $\left|A\Rightarrow\bbnum 0\right|=0$ for -all other types $A$. We conclude that the type $A\Rightarrow\bbnum 0$ +that $\bbnum 0\rightarrow\bbnum 0$ has cardinality $1$. So, the +cardinality $\left|A\rightarrow\bbnum 0\right|=1$ if the type $A$ +is itself $\bbnum 0$ but $\left|A\rightarrow\bbnum 0\right|=0$ for +all other types $A$. We conclude that the type $A\rightarrow\bbnum 0$ is not equivalent to $\bbnum 0$ or $\bbnum 1$ for all $A$; it is equivalent to $\bbnum 0$ only for non-void types $A$. \subsubsection{Example \label{subsec:ch-Example-type-identity-2}\ref{subsec:ch-Example-type-identity-2}} -Verify the type equivalence $A\Rightarrow\bbnum 1\cong\bbnum 1$. +Verify the type equivalence $A\rightarrow\bbnum 1\cong\bbnum 1$. \subparagraph{Solution} @@ -2639,22 +2638,22 @@ \subsubsection{Example \label{subsec:ch-Example-type-identity-2}\ref{subsec:ch-E its argument and return the fixed value \lstinline!()! of type \lstinline!Unit!. In the code notation, this function is written as \[ -f^{:A\Rightarrow\bbnum 1}\triangleq\left(\_\Rightarrow1\right)\quad. +f^{:A\rightarrow\bbnum 1}\triangleq\left(\_\rightarrow1\right)\quad. \] We can show that there exist only \emph{one} distinct function of -type $A\Rightarrow\bbnum 1$ (that is, the type $A\Rightarrow\bbnum 1$ +type $A\rightarrow\bbnum 1$ (that is, the type $A\rightarrow\bbnum 1$ has cardinality $1$). Assume that $f$ and $g$ are two such functions, and try to find a value $x^{:A}$ such that $f(x)\neq g(x)$. We cannot find any such $x$ because $f(x)=1$ and $g(x)=1$ for all $x$. So, -any two functions $f$ and $g$ of type $A\Rightarrow\bbnum 1$ must +any two functions $f$ and $g$ of type $A\rightarrow\bbnum 1$ must be equal to each other. Any type having cardinality $1$ is equivalent -to the \lstinline!Unit! type, $\bbnum 1$. So $A\Rightarrow\bbnum 1\cong\bbnum 1$. +to the \lstinline!Unit! type, $\bbnum 1$. So $A\rightarrow\bbnum 1\cong\bbnum 1$. \subsubsection{Example \label{subsec:ch-Example-type-identity-5}\ref{subsec:ch-Example-type-identity-5}} Verify the type equivalence \[ -A+B\Rightarrow C\cong(A\Rightarrow C)\times(B\Rightarrow C)\quad. +A+B\rightarrow C\cong(A\rightarrow C)\times(B\rightarrow C)\quad. \] @@ -2682,8 +2681,8 @@ \subsubsection{Example \label{subsec:ch-Example-type-identity-5}\ref{subsec:ch-E \end{lstlisting} A code notation for this function is \begin{align*} - & f_{1}:\left(A+B\Rightarrow C\right)\Rightarrow\left(A\Rightarrow C\right)\times\left(B\Rightarrow C\right)\quad,\\ - & f_{1}\triangleq h^{:A+B\Rightarrow C}\Rightarrow\left(a^{:A}\Rightarrow h(a+\bbnum 0^{:B})\right)\times\left(b^{:B}\Rightarrow h(\bbnum 0^{:A}+b)\right)\quad. + & f_{1}:\left(A+B\rightarrow C\right)\rightarrow\left(A\rightarrow C\right)\times\left(B\rightarrow C\right)\quad,\\ + & f_{1}\triangleq h^{:A+B\rightarrow C}\rightarrow\left(a^{:A}\rightarrow h(a+\bbnum 0^{:B})\right)\times\left(b^{:B}\rightarrow h(\bbnum 0^{:A}+b)\right)\quad. \end{align*} For the function \lstinline!f2!, we need to apply pattern matching @@ -2699,18 +2698,18 @@ \subsubsection{Example \label{subsec:ch-Example-type-identity-5}\ref{subsec:ch-E \end{lstlisting} A code notation for this function can be written as \begin{align*} - & f_{2}:\left(A\Rightarrow C\right)\times\left(B\Rightarrow C\right)\Rightarrow A+B\Rightarrow C\quad,\\ - & f_{2}\triangleq f^{:A\Rightarrow C}\times g^{:B\Rightarrow C}\Rightarrow\begin{array}{|c||c|} + & f_{2}:\left(A\rightarrow C\right)\times\left(B\rightarrow C\right)\rightarrow A+B\rightarrow C\quad,\\ + & f_{2}\triangleq f^{:A\rightarrow C}\times g^{:B\rightarrow C}\rightarrow\begin{array}{|c||c|} & C\\ -\hline A & a\Rightarrow f(a)\\ -B & b\Rightarrow g(b) +\hline A & a\rightarrow f(a)\\ +B & b\rightarrow g(b) \end{array}\quad. \end{align*} The matrix in the last line has only one column because the result type, $C$, is not known to be a disjunctive type. We may simplify -the functions, e.g.~$a\Rightarrow f(a)$ into $f$, and write +the functions, e.g.~$a\rightarrow f(a)$ into $f$, and write \[ -f_{2}\triangleq f^{:A\Rightarrow C}\times g^{:B\Rightarrow C}\Rightarrow f^{:A\Rightarrow C}\times g^{:B\Rightarrow C}\Rightarrow\begin{array}{|c||c|} +f_{2}\triangleq f^{:A\rightarrow C}\times g^{:B\rightarrow C}\rightarrow f^{:A\rightarrow C}\times g^{:B\rightarrow C}\rightarrow\begin{array}{|c||c|} & C\\ \hline A & f\\ B & g @@ -2721,30 +2720,30 @@ \subsubsection{Example \label{subsec:ch-Example-type-identity-5}\ref{subsec:ch-E To compute the composition $f_{1}\bef f_{2}$, we write (omitting types) \begin{align*} -f_{1}\bef f_{2} & =\left(h\Rightarrow(a\Rightarrow h(a+\bbnum 0))\times(b\Rightarrow h(\bbnum 0+b))\right)\bef\bigg(f\times g\Rightarrow\begin{array}{||c|} +f_{1}\bef f_{2} & =\left(h\rightarrow(a\rightarrow h(a+\bbnum 0))\times(b\rightarrow h(\bbnum 0+b))\right)\bef\bigg(f\times g\rightarrow\begin{array}{||c|} f\\ g \end{array}\,\bigg)\\ -{\color{greenunder}\text{compute composition}:}\quad & =h\Rightarrow\begin{array}{||c|} -a\Rightarrow h(a+\bbnum 0)\\ -b\Rightarrow h(\bbnum 0+b) +{\color{greenunder}\text{compute composition}:}\quad & =h\rightarrow\begin{array}{||c|} +a\rightarrow h(a+\bbnum 0)\\ +b\rightarrow h(\bbnum 0+b) \end{array}\quad. \end{align*} To proceed, we need to simplify the expressions $h(a+\bbnum 0)$ and $h(\bbnum 0+b)$. We rewrite the argument $h$ (an arbitrary function -of type $A+B\Rightarrow C$) in the matrix notation: +of type $A+B\rightarrow C$) in the matrix notation: \[ h\triangleq\begin{array}{|c||c|} & C\\ -\hline A & a\Rightarrow p(a)\\ -B & b\Rightarrow q(b) +\hline A & a\rightarrow p(a)\\ +B & b\rightarrow q(b) \end{array}=\begin{array}{|c||c|} & C\\ \hline A & p\\ B & q \end{array}\quad, \] -where $p^{:A\Rightarrow C}$ and $q^{:B\Rightarrow C}$ are new arbitrary +where $p^{:A\rightarrow C}$ and $q^{:B\rightarrow C}$ are new arbitrary functions. Since we already checked the types, we can omit all type annotations and express $h$ as \[ @@ -2798,21 +2797,21 @@ \subsubsection{Example \label{subsec:ch-Example-type-identity-5}\ref{subsec:ch-E \end{align*} Now we can complete the proof of $f_{1}\bef f_{2}=\text{id}$: \begin{align*} -f_{1}\bef f_{2} & =h\Rightarrow\begin{array}{||c|} -a\Rightarrow h(a+\bbnum 0)\\ -b\Rightarrow h(\bbnum 0+b) +f_{1}\bef f_{2} & =h\rightarrow\begin{array}{||c|} +a\rightarrow h(a+\bbnum 0)\\ +b\rightarrow h(\bbnum 0+b) \end{array}\\ {\color{greenunder}\text{previous equations}:}\quad & =\begin{array}{||c|} p\\ q -\end{array}\Rightarrow\begin{array}{||c|} -a\Rightarrow p(a)\\ -b\Rightarrow q(b) +\end{array}\rightarrow\begin{array}{||c|} +a\rightarrow p(a)\\ +b\rightarrow q(b) \end{array}\\ {\color{greenunder}\text{simplify functions}:}\quad & =\bigg(\begin{array}{||c|} p\\ q -\end{array}\Rightarrow\begin{array}{||c|} +\end{array}\rightarrow\begin{array}{||c|} p\\ q \end{array}\,\bigg)=\text{id}\quad. @@ -2820,22 +2819,22 @@ \subsubsection{Example \label{subsec:ch-Example-type-identity-5}\ref{subsec:ch-E To prove that $f_{2}\bef f_{1}=\text{id}$, use the notation~(\ref{eq:forward-notation-}): \begin{align*} -f_{2}\bef f_{1} & =\bigg(f\times g\Rightarrow\begin{array}{||c|} +f_{2}\bef f_{1} & =\bigg(f\times g\rightarrow\begin{array}{||c|} f\\ g -\end{array}\,\bigg)\bef\left(h\Rightarrow(a\Rightarrow h(a+\bbnum 0))\times(b\Rightarrow h(\bbnum 0+b))\right)\\ -{\color{greenunder}\text{compute composition}:}\quad & =f\times g\Rightarrow\big(a\Rightarrow\begin{array}{|cc|} +\end{array}\,\bigg)\bef\left(h\rightarrow(a\rightarrow h(a+\bbnum 0))\times(b\rightarrow h(\bbnum 0+b))\right)\\ +{\color{greenunder}\text{compute composition}:}\quad & =f\times g\rightarrow\big(a\rightarrow\begin{array}{|cc|} a & \bbnum 0\end{array}\,\triangleright\,\begin{array}{||c|} f\\ g -\end{array}\,\big)\times\big(b\Rightarrow\begin{array}{|cc|} +\end{array}\,\big)\times\big(b\rightarrow\begin{array}{|cc|} \bbnum 0 & b\end{array}\,\triangleright\,\begin{array}{||c|} f\\ g \end{array}\,\big)\\ -{\color{greenunder}\text{matrix notation}:}\quad & =f\times g\Rightarrow(a\Rightarrow\gunderline{a\triangleright f})\times(b\Rightarrow\gunderline{b\triangleright g})\\ -{\color{greenunder}\text{definition of }\triangleright:}\quad & =f\times g\Rightarrow\gunderline{\left(a\Rightarrow f(a)\right)}\times\gunderline{\left(b\Rightarrow g(b)\right)}\\ -{\color{greenunder}\text{simplify functions}:}\quad & =\left(f\times g\Rightarrow f\times g\right)=\text{id}\quad. +{\color{greenunder}\text{matrix notation}:}\quad & =f\times g\rightarrow(a\rightarrow\gunderline{a\triangleright f})\times(b\rightarrow\gunderline{b\triangleright g})\\ +{\color{greenunder}\text{definition of }\triangleright:}\quad & =f\times g\rightarrow\gunderline{\left(a\rightarrow f(a)\right)}\times\gunderline{\left(b\rightarrow g(b)\right)}\\ +{\color{greenunder}\text{simplify functions}:}\quad & =\left(f\times g\rightarrow f\times g\right)=\text{id}\quad. \end{align*} In this way, we have proved that $f_{1}$ and $f_{2}$ are mutual @@ -2844,25 +2843,25 @@ \subsubsection{Example \label{subsec:ch-Example-type-identity-5}\ref{subsec:ch-E this notation, the proof for $f_{1}\bef f_{2}=\text{id}$ can be written as \begin{align*} -f_{1}\bef f_{2} & =\left(h\Rightarrow(a\Rightarrow(a+\bbnum 0)\triangleright h)\times(b\Rightarrow(\bbnum 0+b)\triangleright h)\right)\bef\bigg(f\times g\Rightarrow\begin{array}{||c|} +f_{1}\bef f_{2} & =\left(h\rightarrow(a\rightarrow(a+\bbnum 0)\triangleright h)\times(b\rightarrow(\bbnum 0+b)\triangleright h)\right)\bef\bigg(f\times g\rightarrow\begin{array}{||c|} f\\ g \end{array}\bigg)\\ -{\color{greenunder}\text{compute composition}:}\quad & =h\Rightarrow\begin{array}{||c|} -\,a\,\Rightarrow\,\left|\begin{array}{cc} +{\color{greenunder}\text{compute composition}:}\quad & =h\rightarrow\begin{array}{||c|} +\,a\,\rightarrow\,\left|\begin{array}{cc} a & \bbnum 0\end{array}\right|\triangleright h\\ -b\Rightarrow\left|\begin{array}{cc} +b\rightarrow\left|\begin{array}{cc} \bbnum 0 & b\end{array}\right|\triangleright h \end{array}=\begin{array}{||c|} p\\ q -\end{array}\Rightarrow\begin{array}{||c|} -a\Rightarrow\begin{array}{|cc|} +\end{array}\rightarrow\begin{array}{||c|} +a\rightarrow\begin{array}{|cc|} a & \bbnum 0\end{array}\,\triangleright\,\begin{array}{||c|} p\\ q \end{array}\\ -b\,\Rightarrow\begin{array}{|cc|} +b\,\rightarrow\begin{array}{|cc|} \bbnum 0 & b\,\end{array}\,\triangleright\,\begin{array}{||c|} p\\ q @@ -2871,13 +2870,13 @@ \subsubsection{Example \label{subsec:ch-Example-type-identity-5}\ref{subsec:ch-E {\color{greenunder}\text{matrix notation}:}\quad & =\begin{array}{||c|} p\\ q -\end{array}\Rightarrow\begin{array}{||c|} -a\Rightarrow a\triangleright p\\ -b\Rightarrow b\triangleright q +\end{array}\rightarrow\begin{array}{||c|} +a\rightarrow a\triangleright p\\ +b\rightarrow b\triangleright q \end{array}=\big(\begin{array}{||c|} p\\ q -\end{array}\Rightarrow\begin{array}{||c|} +\end{array}\rightarrow\begin{array}{||c|} p\\ q \end{array}\,\big)=\text{id}\quad. @@ -2891,7 +2890,7 @@ \subsubsection{Example \label{subsec:ch-Example-type-identity-6}\ref{subsec:ch-E Verify the type equivalence \[ -A\times B\Rightarrow C\cong A\Rightarrow B\Rightarrow C\quad. +A\times B\rightarrow C\cong A\rightarrow B\rightarrow C\quad. \] @@ -2909,8 +2908,8 @@ \subsubsection{Example \label{subsec:ch-Example-type-identity-6}\ref{subsec:ch-E \end{lstlisting} Write these functions in the code notation: \begin{align*} - & f_{1}=g^{:A\times B\Rightarrow C}\Rightarrow a^{:A}\Rightarrow b^{:B}\Rightarrow g(a\times b)\quad,\\ - & f_{2}=h^{:A\Rightarrow B\Rightarrow C}\Rightarrow\left(a\times b\right)^{:A\times B}\Rightarrow h(a)(b)\quad. + & f_{1}=g^{:A\times B\rightarrow C}\rightarrow a^{:A}\rightarrow b^{:B}\rightarrow g(a\times b)\quad,\\ + & f_{2}=h^{:A\rightarrow B\rightarrow C}\rightarrow\left(a\times b\right)^{:A\times B}\rightarrow h(a)(b)\quad. \end{align*} We denote by $\left(a\times b\right)^{:A\times B}$ the argument of type \lstinline!(A, B)! with pattern matching implied. This notation @@ -2918,16 +2917,16 @@ \subsubsection{Example \label{subsec:ch-Example-type-identity-6}\ref{subsec:ch-E Compute the function composition $f_{1}\bef f_{2}$: \begin{align*} -f_{1}\bef f_{2} & =(g\Rightarrow\gunderline{a\Rightarrow b\Rightarrow g(a\times b)})\bef\left(h\Rightarrow a\times b\Rightarrow h(a)(b)\right)\\ -{\color{greenunder}\text{substitute }h=a\Rightarrow b\Rightarrow g(a\times b):}\quad & =g\Rightarrow\gunderline{a\times b\Rightarrow g(a\times b)}\\ -{\color{greenunder}\text{simplify function}:}\quad & =\left(g\Rightarrow g\right)=\text{id}\quad. +f_{1}\bef f_{2} & =(g\rightarrow\gunderline{a\rightarrow b\rightarrow g(a\times b)})\bef\left(h\rightarrow a\times b\rightarrow h(a)(b)\right)\\ +{\color{greenunder}\text{substitute }h=a\rightarrow b\rightarrow g(a\times b):}\quad & =g\rightarrow\gunderline{a\times b\rightarrow g(a\times b)}\\ +{\color{greenunder}\text{simplify function}:}\quad & =\left(g\rightarrow g\right)=\text{id}\quad. \end{align*} Compute the function composition $f_{2}\bef f_{1}$: \begin{align*} -f_{2}\bef f_{1} & =(h\Rightarrow\gunderline{a\times b\Rightarrow h(a)(b)})\bef\left(g\Rightarrow a\Rightarrow b\Rightarrow g(a\times b)\right)\\ -{\color{greenunder}\text{substitute }g=a\times b\Rightarrow h(a)(b):}\quad & =h\Rightarrow a\Rightarrow\gunderline{b\Rightarrow h(a)(b)}\\ -{\color{greenunder}\text{simplify function }b\Rightarrow h(a)(b):}\quad & =h\Rightarrow\gunderline{a\Rightarrow h(a)}\\ -{\color{greenunder}\text{simplify function }a\Rightarrow h(a)\text{ to }h:}\quad & =\left(h\Rightarrow h\right)=\text{id}\quad. +f_{2}\bef f_{1} & =(h\rightarrow\gunderline{a\times b\rightarrow h(a)(b)})\bef\left(g\rightarrow a\rightarrow b\rightarrow g(a\times b)\right)\\ +{\color{greenunder}\text{substitute }g=a\times b\rightarrow h(a)(b):}\quad & =h\rightarrow a\rightarrow\gunderline{b\rightarrow h(a)(b)}\\ +{\color{greenunder}\text{simplify function }b\rightarrow h(a)(b):}\quad & =h\rightarrow\gunderline{a\rightarrow h(a)}\\ +{\color{greenunder}\text{simplify function }a\rightarrow h(a)\text{ to }h:}\quad & =\left(h\rightarrow h\right)=\text{id}\quad. \end{align*} @@ -2935,7 +2934,7 @@ \subsubsection{Exercise \label{subsec:ch-solvedExample-5-1}\ref{subsec:ch-solved Verify the type equivalence \[ -\left(A\Rightarrow B\times C\right)\cong\left(A\Rightarrow B\right)\times\left(A\Rightarrow C\right)\quad. +\left(A\rightarrow B\times C\right)\cong\left(A\rightarrow B\right)\times\left(A\rightarrow C\right)\quad. \] @@ -2990,18 +2989,18 @@ \section{Summary} via the Curry-Howard correspondence. The algorithm would have to convert the type signature of \lstinline!q! into the logical formula \begin{equation} -{\cal CH}(\text{Array}^{A})\Longrightarrow{\cal CH}(A\Rightarrow\text{Opt}^{B})\Longrightarrow{\cal CH}(\text{Array}^{\text{Opt}^{B}})\quad.\label{eq:ch-example-quantified-proposition} +{\cal CH}(\text{Array}^{A})Rightarrow{\cal CH}(A\rightarrow\text{Opt}^{B})Rightarrow{\cal CH}(\text{Array}^{\text{Opt}^{B}})\quad.\label{eq:ch-example-quantified-proposition} \end{equation} To derive an implementation, the algorithm would need to use the available \lstinline!.map! method for \lstinline!Array!. That method has a type signature such as \[ -\text{map}:\forall(A,B).\,\text{Array}^{A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow\text{Array}^{B}\quad. +\text{map}:\forall(A,B).\,\text{Array}^{A}\rightarrow\left(A\rightarrow B\right)\rightarrow\text{Array}^{B}\quad. \] To derive the ${\cal CH}$-proposition~(\ref{eq:ch-example-quantified-proposition}), the algorithm will need to assume that the ${\cal CH}$-proposition \begin{equation} -{\cal CH}\left(\forall(A,B).\,\text{Array}^{A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow\text{Array}^{B}\right)\label{eq:ch-example-quantified-proposition-2} +{\cal CH}\left(\forall(A,B).\,\text{Array}^{A}\rightarrow\left(A\rightarrow B\right)\rightarrow\text{Array}^{B}\right)\label{eq:ch-example-quantified-proposition-2} \end{equation} already holds, i.e.~that Eq.~(\ref{eq:ch-example-quantified-proposition-2}) is one of the premises of a sequent to be proved. Reasoning about @@ -3049,18 +3048,18 @@ \subsubsection{Example \label{subsec:ch-solvedExample-1}\ref{subsec:ch-solvedExa \] The function type \lstinline!Option[Boolean] => Boolean! is denoted -by $\bbnum 1+\bbnum 2\Rightarrow\bbnum 2$. Its cardinality is computed +by $\bbnum 1+\bbnum 2\rightarrow\bbnum 2$. Its cardinality is computed as the arithmetic power \[ -\left|\text{Opt}^{\text{Bool}}\Rightarrow\text{Bool}\right|=\left|\bbnum 1+\bbnum 2\Rightarrow\bbnum 2\right|=\left|\bbnum 2\right|^{\left|\bbnum 1+\bbnum 2\right|}=2^{3}=8\quad. +\left|\text{Opt}^{\text{Bool}}\rightarrow\text{Bool}\right|=\left|\bbnum 1+\bbnum 2\rightarrow\bbnum 2\right|=\left|\bbnum 2\right|^{\left|\bbnum 1+\bbnum 2\right|}=2^{3}=8\quad. \] Finally, the we write \lstinline!P! in the type notation as \[ -P=\bbnum 1+\left(\bbnum 1+\bbnum 2\Rightarrow\bbnum 2\right) +P=\bbnum 1+\left(\bbnum 1+\bbnum 2\rightarrow\bbnum 2\right) \] and find \[ -\left|P\right|=\left|\bbnum 1+\left(\bbnum 1+\bbnum 2\Rightarrow\bbnum 2\right)\right|=1+\left|\bbnum 1+\bbnum 2\Rightarrow\bbnum 2\right|=1+8=9\quad. +\left|P\right|=\left|\bbnum 1+\left(\bbnum 1+\bbnum 2\rightarrow\bbnum 2\right)\right|=1+\left|\bbnum 1+\bbnum 2\rightarrow\bbnum 2\right|=1+8=9\quad. \] @@ -3068,7 +3067,7 @@ \subsubsection{Example \label{subsec:ch-solvedExample-2}\ref{subsec:ch-solvedExa Implement a Scala type \lstinline!P[A]! for the type notation \[ -P^{A}\triangleq1+A+\text{Int}\times A+(\text{String}\Rightarrow A)\quad. +P^{A}\triangleq1+A+\text{Int}\times A+(\text{String}\rightarrow A)\quad. \] @@ -3142,15 +3141,15 @@ \subsubsection{Example \label{subsec:ch-solvedExample-3}\ref{subsec:ch-solvedExa and $\alpha\wedge\alpha=\alpha$ hold. To see that, we could derive the four formulas \begin{align*} -\alpha\vee\alpha\Rightarrow\alpha\quad, & \quad\quad\alpha\Rightarrow\alpha\vee\alpha\quad,\\ -\alpha\wedge\alpha\Rightarrow\alpha\quad, & \quad\quad\alpha\Rightarrow\alpha\wedge\alpha\quad, +\alpha\vee\alpha\rightarrow\alpha\quad, & \quad\quad\alpha\rightarrow\alpha\vee\alpha\quad,\\ +\alpha\wedge\alpha\rightarrow\alpha\quad, & \quad\quad\alpha\rightarrow\alpha\wedge\alpha\quad, \end{align*} using the proof rules of Section~\ref{subsec:The-rules-of-proof}. Alternatively, we may use the CH correspondence and show that the type signatures \begin{align*} -\forall A.\,A+A\Rightarrow A\quad, & \quad\quad\forall A.\,A\Rightarrow A+A\quad,\\ -\forall A.\,A\times A\Rightarrow A\quad, & \quad\quad\forall A.\,A\Rightarrow A\times A\quad +\forall A.\,A+A\rightarrow A\quad, & \quad\quad\forall A.\,A\rightarrow A+A\quad,\\ +\forall A.\,A\times A\rightarrow A\quad, & \quad\quad\forall A.\,A\rightarrow A\times A\quad \end{align*} can be implemented via fully parametric functions. For a programmer, it is easier to write code than to guess the correct sequence of proof @@ -3172,16 +3171,16 @@ \subsubsection{Example \label{subsec:ch-solvedExample-3}\ref{subsec:ch-solvedExa \begin{align*} & f_{1}\triangleq\begin{array}{|c||c|} & A\\ -\hline A & a\Rightarrow a\\ -A & a\Rightarrow a +\hline A & a\rightarrow a\\ +A & a\rightarrow a \end{array}=\begin{array}{|c||c|} & A\\ \hline A & \text{id}\\ A & \text{id} \end{array}\quad,\\ - & f_{2}\triangleq a^{:A}\Rightarrow a+\bbnum 0^{:A}=\begin{array}{|c||cc|} + & f_{2}\triangleq a^{:A}\rightarrow a+\bbnum 0^{:A}=\begin{array}{|c||cc|} & A & A\\ -\hline A & a\Rightarrow a & \bbnum 0 +\hline A & a\rightarrow a & \bbnum 0 \end{array}=\begin{array}{|c||cc|} & A & A\\ \hline A & \text{id} & \bbnum 0 @@ -3212,13 +3211,13 @@ \subsubsection{Example \label{subsec:ch-solvedExample-3}\ref{subsec:ch-solvedExa The code notation for these functions is \begin{align*} - & f_{1}\triangleq a_{1}^{:A}\times a_{2}^{:A}\Rightarrow a_{1}\quad,\\ - & f_{2}\triangleq a^{:A}\Rightarrow a\times a\quad. + & f_{1}\triangleq a_{1}^{:A}\times a_{2}^{:A}\rightarrow a_{1}\quad,\\ + & f_{2}\triangleq a^{:A}\rightarrow a\times a\quad. \end{align*} The composition of these functions is not equal to identity: \begin{align*} -f_{1}\bef f_{2} & =\left(a_{1}\times a_{2}\Rightarrow a_{1}\right)\bef\left(a\Rightarrow a\times a\right)\\ - & =\left(a_{1}\times a_{2}\Rightarrow a_{1}\times a_{1}\right)\neq\text{id}=\left(a_{1}\times a_{2}\Rightarrow a_{1}\times a_{2}\right)\quad. +f_{1}\bef f_{2} & =\left(a_{1}\times a_{2}\rightarrow a_{1}\right)\bef\left(a\rightarrow a\times a\right)\\ + & =\left(a_{1}\times a_{2}\rightarrow a_{1}\times a_{1}\right)\neq\text{id}=\left(a_{1}\times a_{2}\rightarrow a_{1}\times a_{2}\right)\quad. \end{align*} We have implemented all four type signatures as fully parametric functions, @@ -3228,7 +3227,7 @@ \subsubsection{Example \label{subsec:ch-solvedExample-3}\ref{subsec:ch-solvedExa \subsubsection{Example \label{subsec:ch-solvedExample-4}\ref{subsec:ch-solvedExample-4}} -Show that $\left(\left(A\wedge B\right)\Longrightarrow C\right)\neq(A\Longrightarrow C)\vee(B\Longrightarrow C)$ +Show that $\left(\left(A\wedge B\right)RightarrowC\right)\neq(ARightarrowC)\vee(BRightarrowC)$ in the constructive logic, although the equality holds in Boolean logic. This is another example of the failure of Boolean logic to provide correct reasoning for types. @@ -3237,8 +3236,8 @@ \subsubsection{Example \label{subsec:ch-solvedExample-4}\ref{subsec:ch-solvedExa Begin by rewriting the logical equality as two implications, \begin{align*} - & (A\wedge B\Longrightarrow C)\Longrightarrow(A\Longrightarrow C)\vee(B\Longrightarrow C)\quad,\\ - & \left((A\Longrightarrow C)\vee(B\Longrightarrow C)\right)\Longrightarrow\left(\left(A\wedge B\right)\Longrightarrow C\right)\quad. + & (A\wedge BRightarrowC)Rightarrow(ARightarrowC)\vee(BRightarrowC)\quad,\\ + & \left((ARightarrowC)\vee(BRightarrowC)\right)Rightarrow\left(\left(A\wedge B\right)RightarrowC\right)\quad. \end{align*} It is sufficient to show that one of these implications is incorrect. Rather than looking for a proof tree in the constructive logic (which @@ -3246,8 +3245,8 @@ \subsubsection{Example \label{subsec:ch-solvedExample-4}\ref{subsec:ch-solvedExa proof tree exists), let us use the CH correspondence. So the task is to implement fully parametric functions with the type signatures \begin{align*} - & (A\times B\Rightarrow C)\Rightarrow(A\Rightarrow C)+(B\Rightarrow C)\quad,\\ - & (A\Rightarrow C)+(B\Rightarrow C)\Rightarrow A\times B\Rightarrow C\quad. + & (A\times B\rightarrow C)\rightarrow(A\rightarrow C)+(B\rightarrow C)\quad,\\ + & (A\rightarrow C)+(B\rightarrow C)\rightarrow A\times B\rightarrow C\quad. \end{align*} For the first type signature, the Scala code is \begin{lstlisting} @@ -3255,7 +3254,7 @@ \subsubsection{Example \label{subsec:ch-solvedExample-4}\ref{subsec:ch-solvedExa \end{lstlisting} We are required to return either a \lstinline!Left(g)! with \lstinline!g: A => C!, or a \lstinline!Right(h)! with \lstinline!h: B => C!. The only given -data is a function \lstinline!k! of type $A\times B\Rightarrow C$, +data is a function \lstinline!k! of type $A\times B\rightarrow C$, so the decision of whether to return a \lstinline!Left! or a \lstinline!Right! must be hard-coded in the function \lstinline!f1! independently of \lstinline!k!. Can we produce a function \lstinline!g! of type \lstinline!A => C!? @@ -3267,13 +3266,13 @@ \subsubsection{Example \label{subsec:ch-solvedExample-4}\ref{subsec:ch-solvedExa a function \lstinline!h! of type \lstinline!B => C!. To repeat the same argument in the type notation: Obtaining a value -of type $(A\Rightarrow C)+(B\Rightarrow C)$ means to compute either -$g^{:A\Rightarrow C}+\bbnum 0$ or $\bbnum 0+h^{:B\Rightarrow C}$. +of type $(A\rightarrow C)+(B\rightarrow C)$ means to compute either +$g^{:A\rightarrow C}+\bbnum 0$ or $\bbnum 0+h^{:B\rightarrow C}$. This decision must be hard-coded since the only data is a function -$k^{:A\times B\Rightarrow C}$. We can compute a $g^{:A\Rightarrow C}$ -only by partially applying $k^{:A\times B\Rightarrow C}$ to a value +$k^{:A\times B\rightarrow C}$. We can compute a $g^{:A\rightarrow C}$ +only by partially applying $k^{:A\times B\rightarrow C}$ to a value of type $B$. However, we cannot obtain any values of type $B$. Similarly, -we cannot get an $h^{:B\Rightarrow C}$. +we cannot get an $h^{:B\rightarrow C}$. The inverse type signature is implementable: @@ -3293,26 +3292,26 @@ \subsubsection{Example \label{subsec:ch-solvedExample-4}\ref{subsec:ch-solvedExa \noindent \[ f_{2}\triangleq\begin{array}{|c||c|} - & A\times B\Rightarrow C\\ -\hline A\Rightarrow C & g^{:A\Rightarrow C}\Rightarrow a\times b\Rightarrow g(a)\\ -B\Rightarrow C & h^{:B\Rightarrow C}\Rightarrow a\times b\Rightarrow h(b) + & A\times B\rightarrow C\\ +\hline A\rightarrow C & g^{:A\rightarrow C}\rightarrow a\times b\rightarrow g(a)\\ +B\rightarrow C & h^{:B\rightarrow C}\rightarrow a\times b\rightarrow h(b) \end{array}\quad. \] \vspace{-0.9\baselineskip} Let us now show that the logical identity \begin{equation} -((\alpha\wedge\beta)\Longrightarrow\gamma)=((\alpha\Longrightarrow\gamma)\vee(\beta\Longrightarrow\gamma))\label{eq:ch-example-identity-boolean-not-constructive} +((\alpha\wedge\beta)Rightarrow\gamma)=((\alphaRightarrow\gamma)\vee(\betaRightarrow\gamma))\label{eq:ch-example-identity-boolean-not-constructive} \end{equation} holds in Boolean logic. A straightforward calculation is to simplify the Boolean expression using Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic}), which only holds in Boolean logic (but not in the constructive logic). We find \begin{align*} -{\color{greenunder}\text{left-hand side of Eq.~(\ref{eq:ch-example-identity-boolean-not-constructive})}:}\quad & \left(\alpha\wedge\beta\right)\gunderline{\Longrightarrow}\,\gamma\\ +{\color{greenunder}\text{left-hand side of Eq.~(\ref{eq:ch-example-identity-boolean-not-constructive})}:}\quad & \left(\alpha\wedge\beta\right)\gunderline{Rightarrow}\,\gamma\\ {\color{greenunder}\text{use Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:}\quad & =\gunderline{\neg(\alpha\wedge\beta)}\vee\gamma\\ {\color{greenunder}\text{use de Morgan's law}:}\quad & =\neg\alpha\vee\neg\beta\vee\gamma\quad.\\ -{\color{greenunder}\text{right-hand side of Eq.~(\ref{eq:ch-example-identity-boolean-not-constructive})}:}\quad & (\gunderline{\alpha\Longrightarrow\gamma})\vee(\gunderline{\beta\Longrightarrow\gamma})\\ +{\color{greenunder}\text{right-hand side of Eq.~(\ref{eq:ch-example-identity-boolean-not-constructive})}:}\quad & (\gunderline{\alphaRightarrow\gamma})\vee(\gunderline{\betaRightarrow\gamma})\\ {\color{greenunder}\text{use Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:}\quad & =\neg\alpha\vee\gunderline{\gamma}\vee\neg\beta\vee\gunderline{\gamma}\\ {\color{greenunder}\text{use identity }\gamma\vee\gamma=\gamma:}\quad & =\neg\alpha\vee\neg\beta\vee\gamma\quad. \end{align*} @@ -3330,11 +3329,11 @@ \subsubsection{Example \label{subsec:ch-solvedExample-4}\ref{subsec:ch-solvedExa Another way of proving the Boolean identity~(\ref{eq:ch-example-identity-boolean-not-constructive}) is to enumerate all possible truth values for the variables $\alpha$, -$\beta$, and $\gamma$. The left-hand side, $\left(\alpha\wedge\beta\right)\Longrightarrow\gamma$, +$\beta$, and $\gamma$. The left-hand side, $\left(\alpha\wedge\beta\right)Rightarrow\gamma$, can be $False$ only if $\alpha\wedge\beta=True$ (that is, both $\alpha$ and $\beta$ are $True$) and $\gamma=False$; for all other truth -values of $\alpha$, $\beta$, and $\gamma$, the formula $\left(\alpha\wedge\beta\right)\Longrightarrow\gamma$ -is $True$. Let us determine when the right-hand side, $(\alpha\Longrightarrow\gamma)\vee(\beta\Longrightarrow\gamma)$, +values of $\alpha$, $\beta$, and $\gamma$, the formula $\left(\alpha\wedge\beta\right)Rightarrow\gamma$ +is $True$. Let us determine when the right-hand side, $(\alphaRightarrow\gamma)\vee(\betaRightarrow\gamma)$, can be $False$. This can happen only if both parts of the disjunction are $False$; that means $\alpha=True$, $\beta=True$, and $\gamma=False$. So, the two sides of the identity~(\ref{eq:ch-example-identity-boolean-not-constructive}) @@ -3360,7 +3359,7 @@ \subsubsection{Example \label{subsec:ch-solvedExample-5-2}\ref{subsec:ch-solvedE \textbf{(a)} $A\times\left(A+\bbnum 1\right)\times\left(A+\bbnum 1+\bbnum 1\right)\cong A\times\left(\bbnum 1+\bbnum 1+A\times\left(\bbnum 1+\bbnum 1+\bbnum 1+A\right)\right)$. -\textbf{(b)} $\left(\bbnum 1+A+B\right)\Rightarrow\bbnum 1\times B\cong\left(B\Rightarrow B\right)\times\left(A\Rightarrow B\right)\times B$. +\textbf{(b)} $\left(\bbnum 1+A+B\right)\rightarrow\bbnum 1\times B\cong\left(B\rightarrow B\right)\times\left(A\rightarrow B\right)\times B$. \subparagraph{Solution} @@ -3378,32 +3377,32 @@ \subsubsection{Example \label{subsec:ch-solvedExample-5-2}\ref{subsec:ch-solvedE \] \textbf{(b)} Keep in mind that the conventions of the type notation -make the function arrow $\left(\Rightarrow\right)$ group weaker than -other type operations. So, the type expression $\left(\bbnum 1+A+B\right)\Rightarrow\bbnum 1\times B$ +make the function arrow $\left(\rightarrow\right)$ group weaker than +other type operations. So, the type expression $\left(\bbnum 1+A+B\right)\rightarrow\bbnum 1\times B$ means a function from $\bbnum 1+A+B$ to $\bbnum 1\times B$. -Begin by using the rule $\bbnum 1\times B\cong B$ to obtain $\left(\bbnum 1+A+B\right)\Rightarrow B$. +Begin by using the rule $\bbnum 1\times B\cong B$ to obtain $\left(\bbnum 1+A+B\right)\rightarrow B$. Now we use the rule \[ -A+B\Rightarrow C\cong\left(A\Rightarrow C\right)\times\left(B\Rightarrow C\right) +A+B\rightarrow C\cong\left(A\rightarrow C\right)\times\left(B\rightarrow C\right) \] and derive the equivalence \[ -\left(\bbnum 1+A+B\right)\Rightarrow B\cong\left(\bbnum 1\Rightarrow B\right)\times\left(A\Rightarrow B\right)\times\left(B\Rightarrow B\right)\quad. +\left(\bbnum 1+A+B\right)\rightarrow B\cong\left(\bbnum 1\rightarrow B\right)\times\left(A\rightarrow B\right)\times\left(B\rightarrow B\right)\quad. \] -Finally, we note that $\bbnum 1\Rightarrow B\cong B$ and that the +Finally, we note that $\bbnum 1\rightarrow B\cong B$ and that the type product is commutative, so we can rearrange the last type expression into the required form: \[ -B\times\left(A\Rightarrow B\right)\times\left(B\Rightarrow B\right)\cong\left(B\Rightarrow B\right)\times\left(A\Rightarrow B\right)\times B\quad. +B\times\left(A\rightarrow B\right)\times\left(B\rightarrow B\right)\cong\left(B\rightarrow B\right)\times\left(A\rightarrow B\right)\times B\quad. \] \subsubsection{Example \label{subsec:ch-solvedExample-5}\ref{subsec:ch-solvedExample-5}} -Denote $\text{Read}^{E,T}\triangleq E\Rightarrow T$ and implement -fully parametric functions with types $A\Rightarrow\text{Read}^{E,A}$ -and $\text{Read}^{E,A}\Rightarrow(A\Rightarrow B)\Rightarrow\text{Read}^{E,B}$. +Denote $\text{Read}^{E,T}\triangleq E\rightarrow T$ and implement +fully parametric functions with types $A\rightarrow\text{Read}^{E,A}$ +and $\text{Read}^{E,A}\rightarrow(A\rightarrow B)\rightarrow\text{Read}^{E,B}$. \subparagraph{Solution} @@ -3424,8 +3423,8 @@ \subsubsection{Example \label{subsec:ch-solvedExample-5}\ref{subsec:ch-solvedExa def map[E, A, B]: Read[E, A] => (A => B) => Read[E, B] = ??? \end{lstlisting} Expanding the type alias, we see that the two curried arguments are -functions of types $E\Rightarrow A$ and $A\Rightarrow B$. The forward -composition of these functions is a function of type $E\Rightarrow B$, +functions of types $E\rightarrow A$ and $A\rightarrow B$. The forward +composition of these functions is a function of type $E\rightarrow B$, or $\text{Read}^{E,B}$, which is exactly what we are required to return. So the code can be written as @@ -3434,10 +3433,10 @@ \subsubsection{Example \label{subsec:ch-solvedExample-5}\ref{subsec:ch-solvedExa \end{lstlisting} If we did not notice this shortcut, we would reason differently: We are required to compute a value of type $B$ given \emph{three} curried -arguments $r^{:E\Rightarrow A}$, $f^{:A\Rightarrow B}$, and $e^{:E}$. +arguments $r^{:E\rightarrow A}$, $f^{:A\rightarrow B}$, and $e^{:E}$. Write this requirement as \[ -\text{map}\triangleq r^{:E\Rightarrow A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow e^{:E}\Rightarrow???^{:B}\quad, +\text{map}\triangleq r^{:E\rightarrow A}\rightarrow f^{:A\rightarrow B}\rightarrow e^{:E}\rightarrow???^{:B}\quad, \] The symbol $\text{???}^{:B}$ is called a \index{typed hole}\textbf{typed hole}; it stands for a value that we are still figuring out how to @@ -3447,26 +3446,26 @@ \subsubsection{Example \label{subsec:ch-solvedExample-5}\ref{subsec:ch-solvedExa To fill the typed hole $\text{???}^{:B}$, we need a value of type $B$. Since no arguments have type $B$, the only way of getting a -value of type $B$ is to apply $f^{:A\Rightarrow B}$ to some value +value of type $B$ is to apply $f^{:A\rightarrow B}$ to some value of type $A$. So we write \[ -\text{map}\triangleq r^{:E\Rightarrow A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow e^{:E}\Rightarrow f(???^{:A})\quad. +\text{map}\triangleq r^{:E\rightarrow A}\rightarrow f^{:A\rightarrow B}\rightarrow e^{:E}\rightarrow f(???^{:A})\quad. \] The only way of getting an $A$ is to apply $r$ to a value of type $E$, \[ -\text{map}\triangleq r^{:E\Rightarrow A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow e^{:E}\Rightarrow f(r(???^{:E}))\quad. +\text{map}\triangleq r^{:E\rightarrow A}\rightarrow f^{:A\rightarrow B}\rightarrow e^{:E}\rightarrow f(r(???^{:E}))\quad. \] We have exactly one value of type $E$, namely $e^{:E}$. So the code must be \[ -\text{map}^{E,A,B}\triangleq r^{:E\Rightarrow A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow e^{:E}\Rightarrow f(r(e))\quad. +\text{map}^{E,A,B}\triangleq r^{:E\rightarrow A}\rightarrow f^{:A\rightarrow B}\rightarrow e^{:E}\rightarrow f(r(e))\quad. \] Translate this to the Scala syntax: \begin{lstlisting} def map[E, A, B]: (E => A) => (A => B) => E => B = { r => f => e => f(r(e)) } \end{lstlisting} -We may now notice that the expression $e\Rightarrow f(r(e))$ is a +We may now notice that the expression $e\rightarrow f(r(e))$ is a function composition $r\bef f$ applied to $e$, and simplify the code accordingly. @@ -3481,18 +3480,18 @@ \subsubsection{Example \label{subsec:ch-solvedExample-6}\ref{subsec:ch-solvedExa \begin{lstlisting} def m[A, B, T] : (A => T) => (A => B) => B => T = { r => f => b => ??? } \end{lstlisting} -Given values $r^{:A\Rightarrow T}$, $f^{:A\Rightarrow B}$, and $b^{:B}$, +Given values $r^{:A\rightarrow T}$, $f^{:A\rightarrow B}$, and $b^{:B}$, we need to compute a value of type $T$: \[ -m=r^{:A\Rightarrow T}\Rightarrow f^{:A\Rightarrow B}\Rightarrow b^{:B}\Rightarrow???^{:T}\quad. +m=r^{:A\rightarrow T}\rightarrow f^{:A\rightarrow B}\rightarrow b^{:B}\rightarrow???^{:T}\quad. \] The only way of getting a $T$ is to apply $r$ to some value of type $A$, \[ -m=r^{:A\Rightarrow T}\Rightarrow f^{:A\Rightarrow B}\Rightarrow b^{:B}\Rightarrow r(???^{:A})\quad. +m=r^{:A\rightarrow T}\rightarrow f^{:A\rightarrow B}\rightarrow b^{:B}\rightarrow r(???^{:A})\quad. \] However, we do not have any values of type $A$. We have a function -$f^{:A\Rightarrow B}$ that \emph{consumes} values of type $A$, and +$f^{:A\rightarrow B}$ that \emph{consumes} values of type $A$, and we cannot use $f$ to produce any values of type $A$. So we seem to be unable to fill the typed hole $\text{???}^{:A}$ and implement the function \lstinline!m!. @@ -3500,7 +3499,7 @@ \subsubsection{Example \label{subsec:ch-solvedExample-6}\ref{subsec:ch-solvedExa In order to verify that \lstinline!m! is unimplementable, we need to prove that the logical formula \begin{equation} -\forall(\alpha,\beta,\tau).\,(\alpha\Longrightarrow\tau)\Longrightarrow(\alpha\Longrightarrow\beta)\Longrightarrow(\beta\Longrightarrow\tau)\label{eq:ch-example-boolean-formula-3} +\forall(\alpha,\beta,\tau).\,(\alphaRightarrow\tau)Rightarrow(\alphaRightarrow\beta)Rightarrow(\betaRightarrow\tau)\label{eq:ch-example-boolean-formula-3} \end{equation} is not true in the constructive logic. We could use the \texttt{curryhoward} library for that: @@ -3522,8 +3521,8 @@ \subsubsection{Example \label{subsec:ch-solvedExample-6}\ref{subsec:ch-solvedExa always equal to $True$. Simplifying Eq.~(\ref{eq:ch-example-boolean-formula-3}) with the rules of Boolean logic, we find \begin{align*} - & (\alpha\Longrightarrow\tau)\,\gunderline{\Longrightarrow}\,(\alpha\Longrightarrow\beta)\,\gunderline{\Longrightarrow}\,(\beta\Longrightarrow\tau)\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:}\quad & =\neg(\gunderline{\alpha\Longrightarrow\tau})\vee\neg(\gunderline{\alpha\Longrightarrow\beta})\vee(\gunderline{\beta\Longrightarrow\tau})\\ + & (\alphaRightarrow\tau)\,\gunderline{Rightarrow}\,(\alphaRightarrow\beta)\,\gunderline{Rightarrow}\,(\betaRightarrow\tau)\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:}\quad & =\neg(\gunderline{\alphaRightarrow\tau})\vee\neg(\gunderline{\alphaRightarrow\beta})\vee(\gunderline{\betaRightarrow\tau})\\ {\color{greenunder}\text{use Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:}\quad & =\gunderline{\neg(\neg\alpha\vee\tau)}\vee\gunderline{\neg(\neg\alpha\vee\beta)}\vee(\neg\beta\vee\tau)\\ {\color{greenunder}\text{use de Morgan's law}:}\quad & =\left(\alpha\wedge\neg\tau\right)\vee\gunderline{\left(\alpha\wedge\neg\beta\right)\vee\neg\beta}\vee\tau\\ {\color{greenunder}\text{use identity }(p\wedge q)\vee q=q:}\quad & =\gunderline{\left(\alpha\wedge\neg\tau\right)}\vee\neg\beta\vee\gunderline{\tau}\\ @@ -3540,7 +3539,7 @@ \subsubsection{Example \label{subsec:ch-solvedExample-7}\ref{subsec:ch-solvedExa Define the type constructor $P^{A}\triangleq\bbnum 1+A+A$ and implement \lstinline!map! for it, \[ -\text{map}^{A,B}:P^{A}\Rightarrow(A\Rightarrow B)\Rightarrow P^{B}\quad. +\text{map}^{A,B}:P^{A}\rightarrow(A\rightarrow B)\rightarrow P^{B}\quad. \] To check that \lstinline!map! preserves information, verify the law \lstinline!map(p)(x => x) == p! for all \lstinline!p: P[A]!. @@ -3567,7 +3566,7 @@ \subsubsection{Example \label{subsec:ch-solvedExample-7}\ref{subsec:ch-solvedExa } \end{lstlisting} In the case \lstinline!P2(x)!, we are required to produce a value -of type $P^{B}$ from a value $x^{:A}$ and a function $f^{:A\Rightarrow B}$. +of type $P^{B}$ from a value $x^{:A}$ and a function $f^{:A\rightarrow B}$. Since $P^{B}$ is a disjunctive type with three parts, we can produce a value of type $P^{B}$ in three different ways: \lstinline!P1()!, \lstinline!P2(...)!, and \lstinline!P3(...)!. If we return \lstinline!P1()!, @@ -3594,7 +3593,7 @@ \subsubsection{Example \label{subsec:ch-solvedExample-7}\ref{subsec:ch-solvedExa To verify the given law, we first write a matrix notation for \lstinline!map!: \[ -\text{map}^{A,B}\triangleq p^{:\bbnum 1+A+A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow p\triangleright\begin{array}{|c||ccc|} +\text{map}^{A,B}\triangleq p^{:\bbnum 1+A+A}\rightarrow f^{:A\rightarrow B}\rightarrow p\triangleright\begin{array}{|c||ccc|} & \bbnum 1 & B & B\\ \hline \bbnum 1 & \text{id} & \bbnum 0 & \bbnum 0\\ A & \bbnum 0 & f & \bbnum 0\\ @@ -3629,16 +3628,16 @@ \subsubsection{Example \label{subsec:ch-solvedExample-8}\ref{subsec:ch-solvedExa For a type constructor, say, $P^{A}$, the standard type signatures for \lstinline!map! and \lstinline!flatMap! are \begin{align*} -\text{map} & :P^{A}\Rightarrow(A\Rightarrow B)\Rightarrow P^{B}\quad,\\ -\text{flatMap} & :P^{A}\Rightarrow(A\Rightarrow P^{B})\Rightarrow P^{B}\quad. +\text{map} & :P^{A}\rightarrow(A\rightarrow B)\rightarrow P^{B}\quad,\\ +\text{flatMap} & :P^{A}\rightarrow(A\rightarrow P^{B})\rightarrow P^{B}\quad. \end{align*} If a type constructor has more than one type parameter, e.g.~$P^{A,S,T}$, one can define the functions \lstinline!map! and \lstinline!flatMap! applied to a chosen parameter. For example, when applied to the type parameter $A$, the type signatures are \begin{align*} -\text{map} & :P^{A,S,T}\Rightarrow(A\Rightarrow B)\Rightarrow P^{B,S,T}\quad,\\ -\text{flatMap} & :P^{A,S,T}\Rightarrow(A\Rightarrow P^{B,S,T})\Rightarrow P^{B,S,T}\quad. +\text{map} & :P^{A,S,T}\rightarrow(A\rightarrow B)\rightarrow P^{B,S,T}\quad,\\ +\text{flatMap} & :P^{A,S,T}\rightarrow(A\rightarrow P^{B,S,T})\rightarrow P^{B,S,T}\quad. \end{align*} Being ``applied to the type parameter $A$'' means that the other type parameters $S,T$ in $P^{A,S,T}$ remain fixed while the type @@ -3649,8 +3648,8 @@ \subsubsection{Example \label{subsec:ch-solvedExample-8}\ref{subsec:ch-solvedExa type parameter $R$ fixed while $L$ is replaced by $M$. So we obtain the type signatures \begin{align*} -\text{map} & :L+R\Rightarrow(L\Rightarrow M)\Rightarrow M+R\quad,\\ -\text{flatMap} & :L+R\Rightarrow(L\Rightarrow M+R)\Rightarrow M+R\quad. +\text{map} & :L+R\rightarrow(L\rightarrow M)\rightarrow M+R\quad,\\ +\text{flatMap} & :L+R\rightarrow(L\rightarrow M+R)\rightarrow M+R\quad. \end{align*} Implementing these functions is straightforward: \begin{lstlisting} @@ -3665,15 +3664,15 @@ \subsubsection{Example \label{subsec:ch-solvedExample-8}\ref{subsec:ch-solvedExa \end{lstlisting} The code notation for these functions is \begin{align*} -\text{map} & \triangleq e^{:L+R}\Rightarrow f^{:L\Rightarrow M}\Rightarrow e\triangleright\begin{array}{|c||cc|} +\text{map} & \triangleq e^{:L+R}\rightarrow f^{:L\rightarrow M}\rightarrow e\triangleright\begin{array}{|c||cc|} & M & R\\ \hline L & f & \bbnum 0\\ R & \bbnum 0 & \text{id} \end{array}\quad,\\ -\text{flatMap} & \triangleq e^{:L+R}\Rightarrow f^{:L\Rightarrow M+R}\Rightarrow e\triangleright\begin{array}{|c||c|} +\text{flatMap} & \triangleq e^{:L+R}\rightarrow f^{:L\rightarrow M+R}\rightarrow e\triangleright\begin{array}{|c||c|} & M+R\\ \hline L & f\\ -R & y^{:R}\Rightarrow\bbnum 0^{:M}+y +R & y^{:R}\rightarrow\bbnum 0^{:M}+y \end{array}\quad. \end{align*} Note that we cannot split $f$ into the $M$ and $R$ columns since @@ -3681,14 +3680,14 @@ \subsubsection{Example \label{subsec:ch-solvedExample-8}\ref{subsec:ch-solvedExa \subsubsection{Example \label{subsec:ch-solvedExample-9}\ref{subsec:ch-solvedExample-9}{*}} -Define a type $\text{State}^{S,A}\equiv S\Rightarrow A\times S$ and +Define a type $\text{State}^{S,A}\equiv S\rightarrow A\times S$ and implement the functions: -\textbf{(a)} $\text{pure}^{S,A}:A\Rightarrow\text{State}^{S,A}\quad.$ +\textbf{(a)} $\text{pure}^{S,A}:A\rightarrow\text{State}^{S,A}\quad.$ -\textbf{(b)} $\text{map}^{S,A,B}:\text{State}^{S,A}\Rightarrow(A\Rightarrow B)\Rightarrow\text{State}^{S,B}\quad.$ +\textbf{(b)} $\text{map}^{S,A,B}:\text{State}^{S,A}\rightarrow(A\rightarrow B)\rightarrow\text{State}^{S,B}\quad.$ -\textbf{(c)} $\text{flatMap}^{S,A,B}:\text{State}^{S,A}\Rightarrow(A\Rightarrow\text{State}^{S,B})\Rightarrow\text{State}^{S,B}\quad.$ +\textbf{(c)} $\text{flatMap}^{S,A,B}:\text{State}^{S,A}\rightarrow(A\rightarrow\text{State}^{S,B})\rightarrow\text{State}^{S,B}\quad.$ \subparagraph{Solution} @@ -3698,34 +3697,34 @@ \subsubsection{Example \label{subsec:ch-solvedExample-9}\ref{subsec:ch-solvedExa type State[S, A] = S => (A, S) \end{lstlisting} -\textbf{(a)} The type signature is $A\Rightarrow S\Rightarrow A\times S$, +\textbf{(a)} The type signature is $A\rightarrow S\rightarrow A\times S$, and there is only one implementation, \begin{lstlisting} def pure[S, A]: A => State[S, A] = a => s => (a, s) \end{lstlisting} In the code notation, this is written as \[ -\text{pu}^{S,A}\triangleq a^{:A}\Rightarrow s^{:A}\Rightarrow a\times s\quad. +\text{pu}^{S,A}\triangleq a^{:A}\rightarrow s^{:A}\rightarrow a\times s\quad. \] \textbf{(b)} The explicit type signature is \[ -\text{map}^{S,A,B}:(S\Rightarrow A\times S)\Rightarrow(A\Rightarrow B)\Rightarrow S\Rightarrow B\times S\quad. +\text{map}^{S,A,B}:(S\rightarrow A\times S)\rightarrow(A\rightarrow B)\rightarrow S\rightarrow B\times S\quad. \] Begin writing a Scala implementation: \begin{lstlisting} def map[S, A, B]: State[S, A] => (A => B) => State[S, B] = { t => f => s => ??? } \end{lstlisting} We need to compute a value of $B\times S$ from the curried arguments -$t^{:S\Rightarrow A\times S}$, $f^{:A\Rightarrow B}$, and $s^{:S}$. +$t^{:S\rightarrow A\times S}$, $f^{:A\rightarrow B}$, and $s^{:S}$. We begin writing the code of \lstinline!map! as a typed hole, \[ -\text{map}\triangleq t^{:S\Rightarrow A\times S}\Rightarrow f^{:A\Rightarrow B}\Rightarrow s^{:S}\Rightarrow\text{???}^{:B}\times\text{???}^{:S}\quad. +\text{map}\triangleq t^{:S\rightarrow A\times S}\rightarrow f^{:A\rightarrow B}\rightarrow s^{:S}\rightarrow\text{???}^{:B}\times\text{???}^{:S}\quad. \] The only way of getting a value of type $B$ is by applying $f$ to a value of type $A$: \[ -\text{map}\triangleq t^{:S\Rightarrow A\times S}\Rightarrow f^{:A\Rightarrow B}\Rightarrow s^{:S}\Rightarrow f(\text{???}^{:A})\times\text{???}^{:S}\quad. +\text{map}\triangleq t^{:S\rightarrow A\times S}\rightarrow f^{:A\rightarrow B}\rightarrow s^{:S}\rightarrow f(\text{???}^{:A})\times\text{???}^{:S}\quad. \] To fill the typed hole, we need a value of type $A$. The only possibility of obtaining a value of type $A$ is by applying $t$ to a value of @@ -3758,41 +3757,41 @@ \subsubsection{Example \label{subsec:ch-solvedExample-9}\ref{subsec:ch-solvedExa the pair that $t(s)$ returns. We can write explicit destructuring code like this: \[ -\text{map}\triangleq t^{:S\Rightarrow A\times S}\Rightarrow f^{:A\Rightarrow B}\Rightarrow s^{:S}\Rightarrow(a^{:A}\times s_{2}^{:S}\Rightarrow f(a)\times s_{2})(t(s))\quad. +\text{map}\triangleq t^{:S\rightarrow A\times S}\rightarrow f^{:A\rightarrow B}\rightarrow s^{:S}\rightarrow(a^{:A}\times s_{2}^{:S}\rightarrow f(a)\times s_{2})(t(s))\quad. \] If we temporarily denote by $q$ the destructuring function \[ -q\triangleq(a^{:A}\times s_{2}^{:S}\Rightarrow f(a)\times s_{2})\quad, +q\triangleq(a^{:A}\times s_{2}^{:S}\rightarrow f(a)\times s_{2})\quad, \] -we will notice that the expression $s\Rightarrow q(t(s))$ is a function -composition applied to $s$. So, we rewrite $s\Rightarrow q(t(s))$ +we will notice that the expression $s\rightarrow q(t(s))$ is a function +composition applied to $s$. So, we rewrite $s\rightarrow q(t(s))$ as the composition $t\bef q$ and obtain shorter code, \[ -\text{map}\triangleq t^{:S\Rightarrow A\times S}\Rightarrow f^{:A\Rightarrow B}\Rightarrow t\bef(a^{:A}\times s^{:S}\Rightarrow f(a)\times s)\quad. +\text{map}\triangleq t^{:S\rightarrow A\times S}\rightarrow f^{:A\rightarrow B}\rightarrow t\bef(a^{:A}\times s^{:S}\rightarrow f(a)\times s)\quad. \] Shorter formulas are often easier to reason about in derivations (although not necessarily easier to read when converted to program code). \textbf{(c)} The required type signature is \[ -\text{flatMap}^{S,A,B}:(S\Rightarrow A\times S)\Rightarrow(A\Rightarrow S\Rightarrow B\times S)\Rightarrow S\Rightarrow B\times S\quad. +\text{flatMap}^{S,A,B}:(S\rightarrow A\times S)\rightarrow(A\rightarrow S\rightarrow B\times S)\rightarrow S\rightarrow B\times S\quad. \] We perform t reasoning with typed holes: \[ -\text{flatMap}\triangleq t^{:S\Rightarrow A\times S}\Rightarrow f^{:A\Rightarrow S\Rightarrow B\times S}\Rightarrow s^{:S}\Rightarrow\text{???}^{:B}\times???^{:S}\quad. +\text{flatMap}\triangleq t^{:S\rightarrow A\times S}\rightarrow f^{:A\rightarrow S\rightarrow B\times S}\rightarrow s^{:S}\rightarrow\text{???}^{:B}\times???^{:S}\quad. \] To fill $\text{???}^{:B}$, we need to apply $f$ to some arguments, since $f$ is the only function that returns any values of type $B$. A saturated application of $f$ will yield a value of type $B\times S$, which we can return without change: \[ -\text{flatMap}\triangleq t^{:S\Rightarrow A\times S}\Rightarrow f^{:A\Rightarrow S\Rightarrow B\times S}\Rightarrow s^{:S}\Rightarrow f(\text{???}^{:A})(\text{???}^{:S})\quad. +\text{flatMap}\triangleq t^{:S\rightarrow A\times S}\rightarrow f^{:A\rightarrow S\rightarrow B\times S}\rightarrow s^{:S}\rightarrow f(\text{???}^{:A})(\text{???}^{:S})\quad. \] To fill the new typed holes, we need to apply $t$ to an argument of type $S$. We have only one given value $s^{:S}$ of type $S$, so we must compute $t(s)$ and destructure it: \[ -\text{flatMap}\triangleq t^{:S\Rightarrow A\times S}\Rightarrow f^{:A\Rightarrow S\Rightarrow B\times S}\Rightarrow s^{:S}\Rightarrow\left(a\times s_{2}\Rightarrow f(a)(s_{2})\right)(t(s))\quad. +\text{flatMap}\triangleq t^{:S\rightarrow A\times S}\rightarrow f^{:A\rightarrow S\rightarrow B\times S}\rightarrow s^{:S}\rightarrow\left(a\times s_{2}\rightarrow f(a)(s_{2})\right)(t(s))\quad. \] Translating this notation into Scala code, we obtain \begin{lstlisting} @@ -3807,7 +3806,7 @@ \subsubsection{Example \label{subsec:ch-solvedExample-9}\ref{subsec:ch-solvedExa The code notation for \lstinline!flatMap! can be simplified to \[ -\text{flatMap}\triangleq t^{:S\Rightarrow A\times S}\Rightarrow f^{:A\Rightarrow S\Rightarrow B\times S}\Rightarrow t\bef\left(a\times s\Rightarrow f(a)(s)\right)\quad. +\text{flatMap}\triangleq t^{:S\rightarrow A\times S}\rightarrow f^{:A\rightarrow S\rightarrow B\times S}\rightarrow t\bef\left(a\times s\rightarrow f(a)(s)\right)\quad. \] @@ -3822,23 +3821,23 @@ \subsubsection{Exercise \label{subsec:ch-Exercise-0}\ref{subsec:ch-Exercise-0}} \subsubsection{Exercise \label{subsec:ch-Exercise-1-a}\ref{subsec:ch-Exercise-1-a}} -Verify the type equivalences $A+A\cong\bbnum 2\times A$ and $A\times A\cong\bbnum 2\Rightarrow A$, +Verify the type equivalences $A+A\cong\bbnum 2\times A$ and $A\times A\cong\bbnum 2\rightarrow A$, where $\bbnum 2$ denotes the \lstinline!Boolean! type. \subsubsection{Exercise \label{subsec:ch-Exercise-1}\ref{subsec:ch-Exercise-1}} -Show that $A\Longrightarrow(B\vee C)\neq(A\Longrightarrow B)\wedge(A\Longrightarrow C)$ +Show that $ARightarrow(B\vee C)\neq(ARightarrowB)\wedge(ARightarrowC)$ in logic. \subsubsection{Exercise \label{subsec:ch-Exercise-type-identity-4}\ref{subsec:ch-Exercise-type-identity-4}} Use known rules to verify the type equivalences: -\textbf{(a)} $\left(A+B\right)\times\left(A\Rightarrow B\right)\cong A\times\left(A\Rightarrow B\right)+\left(\bbnum 1+A\Rightarrow B\right)\quad.$ +\textbf{(a)} $\left(A+B\right)\times\left(A\rightarrow B\right)\cong A\times\left(A\rightarrow B\right)+\left(\bbnum 1+A\rightarrow B\right)\quad.$ -\textbf{(b)} $\left(A\times(\bbnum 1+A)\Rightarrow B\right)\cong\left(A\Rightarrow B\right)\times\left(A\Rightarrow A\Rightarrow B\right)\quad.$ +\textbf{(b)} $\left(A\times(\bbnum 1+A)\rightarrow B\right)\cong\left(A\rightarrow B\right)\times\left(A\rightarrow A\rightarrow B\right)\quad.$ -\textbf{(c)} $A\Rightarrow\left(\bbnum 1+B\right)\Rightarrow C\times D\cong\left(A\Rightarrow C\right)\times\left(A\Rightarrow D\right)\times\left(A\times B\Rightarrow C\right)\times\left(A\times B\Rightarrow D\right)\quad.$ +\textbf{(c)} $A\rightarrow\left(\bbnum 1+B\right)\rightarrow C\times D\cong\left(A\rightarrow C\right)\times\left(A\rightarrow D\right)\times\left(A\times B\rightarrow C\right)\times\left(A\times B\rightarrow D\right)\quad.$ \subsubsection{Exercise \label{subsec:ch-Exercise-2}\ref{subsec:ch-Exercise-2}} @@ -3853,8 +3852,8 @@ \subsubsection{Exercise \label{subsec:ch-Exercise-3}\ref{subsec:ch-Exercise-3}} the equivalent type $(\bbnum 1+A)+T$, i.e. \lstinline!Either[Option[A], T]!. The required type signatures are \begin{align*} -\text{map}^{A,B,T} & :\text{OptE}^{T,A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow\text{OptE}^{T,B}\quad,\\ -\text{flatMap}^{A,B,T} & :\text{OptE}^{T,A}\Rightarrow(A\Rightarrow\text{OptE}^{T,B})\Rightarrow\text{OptE}^{T,B}\quad. +\text{map}^{A,B,T} & :\text{OptE}^{T,A}\rightarrow\left(A\rightarrow B\right)\rightarrow\text{OptE}^{T,B}\quad,\\ +\text{flatMap}^{A,B,T} & :\text{OptE}^{T,A}\rightarrow(A\rightarrow\text{OptE}^{T,B})\rightarrow\text{OptE}^{T,B}\quad. \end{align*} @@ -3862,14 +3861,14 @@ \subsubsection{Exercise \label{subsec:ch-Exercise-4}\ref{subsec:ch-Exercise-4}} Implement the \lstinline!map! function for \lstinline!P[A]! (see Example~\ref{subsec:ch-solvedExample-2}). The required type signature -is $P^{A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow P^{B}$. +is $P^{A}\rightarrow\left(A\rightarrow B\right)\rightarrow P^{B}$. \subsubsection{Exercise \label{subsec:ch-Exercise-4-1}\ref{subsec:ch-Exercise-4-1}} For the type constructor $Q^{T,A}$ defined in Exercise~\ref{subsec:Exercise-type-notation-1}, define the \lstinline!map! function with the type signature \[ -\text{map}^{T,A,B}:Q^{T,A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow Q^{T,B}\quad. +\text{map}^{T,A,B}:Q^{T,A}\rightarrow\left(A\rightarrow B\right)\rightarrow Q^{T,B}\quad. \] The implementation should preserve information as much as possible. @@ -3879,7 +3878,7 @@ \subsubsection{Exercise \label{subsec:Exercise-disjunctive-6}\ref{subsec:Exercis and implement the \lstinline!map! function for it, with the standard type signature \[ -\text{map}^{A,B}:\text{Tr}_{3}{}^{A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow\text{Tr}_{3}{}^{B}\quad. +\text{map}^{A,B}:\text{Tr}_{3}{}^{A}\rightarrow\left(A\rightarrow B\right)\rightarrow\text{Tr}_{3}{}^{B}\quad. \] @@ -3887,31 +3886,31 @@ \subsubsection{Exercise \label{subsec:ch-Exercise-5}\ref{subsec:ch-Exercise-5}} Implement fully parametric functions with the following types: -\textbf{(a)} $A+Z\Rightarrow(A\Rightarrow B)\Rightarrow B+Z\quad.$ +\textbf{(a)} $A+Z\rightarrow(A\rightarrow B)\rightarrow B+Z\quad.$ -\textbf{(b)} $A+Z\Rightarrow B+Z\Rightarrow(A\Rightarrow B\Rightarrow C)\Rightarrow C+Z\quad.$ +\textbf{(b)} $A+Z\rightarrow B+Z\rightarrow(A\rightarrow B\rightarrow C)\rightarrow C+Z\quad.$ -\textbf{(c)} $\text{flatMap}^{E,A,B}:\text{Read}^{E,A}\Rightarrow(A\Rightarrow\text{Read}^{E,B})\Rightarrow\text{Read}^{E,B}\quad.$ +\textbf{(c)} $\text{flatMap}^{E,A,B}:\text{Read}^{E,A}\rightarrow(A\rightarrow\text{Read}^{E,B})\rightarrow\text{Read}^{E,B}\quad.$ -\textbf{(d)} $\text{State}^{S,A}\Rightarrow\left(S\times A\Rightarrow S\times B\right)\Rightarrow\text{State}^{S,B}\quad.$ +\textbf{(d)} $\text{State}^{S,A}\rightarrow\left(S\times A\rightarrow S\times B\right)\rightarrow\text{State}^{S,B}\quad.$ \subsubsection{Exercise \label{subsec:ch-Exercise-7}\ref{subsec:ch-Exercise-7}{*}} -Denote $\text{Cont}^{R,T}\triangleq\left(T\Rightarrow R\right)\Rightarrow R$ +Denote $\text{Cont}^{R,T}\triangleq\left(T\rightarrow R\right)\rightarrow R$ and implement the functions: -\textbf{(a)} $\text{map}^{R,T,U}:\text{Cont}^{R,T}\Rightarrow(T\Rightarrow U)\Rightarrow\text{Cont}^{R,U}\quad.$ +\textbf{(a)} $\text{map}^{R,T,U}:\text{Cont}^{R,T}\rightarrow(T\rightarrow U)\rightarrow\text{Cont}^{R,U}\quad.$ -\textbf{(b)} $\text{flatMap}^{R,T,U}:\text{Cont}^{R,T}\Rightarrow(T\Rightarrow\text{Cont}^{R,U})\Rightarrow\text{Cont}^{R,U}\quad.$ +\textbf{(b)} $\text{flatMap}^{R,T,U}:\text{Cont}^{R,T}\rightarrow(T\rightarrow\text{Cont}^{R,U})\rightarrow\text{Cont}^{R,U}\quad.$ \subsubsection{Exercise \label{subsec:ch-Exercise-8}\ref{subsec:ch-Exercise-8}{*}} -Denote $\text{Select}^{Z,T}\triangleq\left(T\Rightarrow Z\right)\Rightarrow T$ +Denote $\text{Select}^{Z,T}\triangleq\left(T\rightarrow Z\right)\rightarrow T$ and implement the functions: -\textbf{(a)} $\text{map}^{Z,A,B}:\text{Select}^{Z,A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow\text{Select}^{Z,B}\quad.$ +\textbf{(a)} $\text{map}^{Z,A,B}:\text{Select}^{Z,A}\rightarrow\left(A\rightarrow B\right)\rightarrow\text{Select}^{Z,B}\quad.$ -\textbf{(b)} $\text{flatMap}^{Z,A,B}:\text{Select}^{Z,A}\Rightarrow(A\Rightarrow\text{Select}^{Z,B})\Rightarrow\text{Select}^{Z,B}\quad.$ +\textbf{(b)} $\text{flatMap}^{Z,A,B}:\text{Select}^{Z,A}\rightarrow(A\rightarrow\text{Select}^{Z,B})\rightarrow\text{Select}^{Z,B}\quad.$ \section{Discussion} @@ -3961,7 +3960,7 @@ \subsection{Using the Curry-Howard correspondence for writing code} type signature, such as \lstinline!x => x - 1!, \lstinline!x => x * 2!, etc. So, deriving code from the type signature \lstinline!Int => Int! is not a meaningful task. Only a fully parametric type signature, -such as $A\Rightarrow\left(A\Rightarrow B\right)\Rightarrow B$, gives +such as $A\rightarrow\left(A\rightarrow B\right)\rightarrow B$, gives enough information for possibly deriving the function's code. If we permit functions that are not fully parametric, we will not be able to reason about implementability of type signatures or about code @@ -4146,7 +4145,7 @@ \subsection{Uses of the void type} So far, none of our examples involved the logical \textbf{negation}\index{negation} operation. It is defined as \[ -\neg\alpha\triangleq\alpha\Longrightarrow False\quad, +\neg\alpha\triangleq\alphaRightarrow False\quad, \] and its practical use is as limited as that of $False$ and the void type. However, logical negation plays an important role in Boolean @@ -4156,8 +4155,8 @@ \subsection{Relationship between Boolean logic and constructive logic\label{subs We have seen that some true theorems of Boolean logic are not true in constructive logic. For example, the Boolean identities $\neg\left(\neg\alpha\right)=\alpha$ -and $\left(\alpha\Longrightarrow\beta\right)=(\neg\alpha\vee\beta)$ -do not hold in the constructive logic. However, any theorem of constructive +and $\left(\alphaRightarrow\beta\right)=(\neg\alpha\vee\beta)$ do +not hold in the constructive logic. However, any theorem of constructive logic is also a theorem of Boolean logic. The reason is that all eight rules of constructive logic (Section~\ref{subsec:The-rules-of-proof}) are also true in Boolean logic. @@ -4169,7 +4168,7 @@ \subsection{Relationship between Boolean logic and constructive logic\label{subs that $\alpha=\beta=True$. So, the sequent $\alpha,\beta\vdash\gamma$ is translated into the Boolean formula \[ -\alpha,\beta\vdash\gamma=\left(\left(\alpha\wedge\beta\right)\Longrightarrow\gamma\right)=\left(\neg\alpha\vee\neg\beta\vee\gamma\right)\quad. +\alpha,\beta\vdash\gamma=\left(\left(\alpha\wedge\beta\right)Rightarrow\gamma\right)=\left(\neg\alpha\vee\neg\beta\vee\gamma\right)\quad. \] Table~\ref{tab:Proof-rules-of-constructive-and-boolean} translates all proof rules of Section~\ref{subsec:The-rules-of-proof} into @@ -4187,17 +4186,17 @@ \subsection{Relationship between Boolean logic and constructive logic\label{subs \hline {\small{}$\frac{~}{\Gamma,\alpha\vdash\alpha}\quad(\text{use arg})$} & {\small{}$\neg\Gamma\vee\neg\alpha\vee\alpha=True$}\tabularnewline \hline -{\small{}$\frac{\Gamma,\alpha\vdash\beta}{\Gamma\vdash\alpha\Longrightarrow\beta}\quad(\text{create function})$} & {\small{}$\left(\neg\Gamma\vee\neg\alpha\vee\beta\right)=\left(\neg\Gamma\vee\left(\alpha\Longrightarrow\beta\right)\right)$}\tabularnewline +{\small{}$\frac{\Gamma,\alpha\vdash\beta}{\Gamma\vdash\alphaRightarrow\beta}\quad(\text{create function})$} & {\small{}$\left(\neg\Gamma\vee\neg\alpha\vee\beta\right)=\left(\neg\Gamma\vee\left(\alphaRightarrow\beta\right)\right)$}\tabularnewline \hline -{\small{}$\frac{\Gamma\vdash\alpha\quad\quad\Gamma\vdash\alpha\Longrightarrow\beta}{\Gamma\vdash\beta}\quad(\text{use function})$} & {\small{}$\left(\left(\neg\Gamma\vee\alpha\right)\wedge\left(\neg\Gamma\vee\left(\alpha\Longrightarrow\beta\right)\right)\right)\Longrightarrow\left(\neg\Gamma\vee\beta\right)$}\tabularnewline +{\small{}$\frac{\Gamma\vdash\alpha\quad\quad\Gamma\vdash\alphaRightarrow\beta}{\Gamma\vdash\beta}\quad(\text{use function})$} & {\small{}$\left(\left(\neg\Gamma\vee\alpha\right)\wedge\left(\neg\Gamma\vee\left(\alphaRightarrow\beta\right)\right)\right)Rightarrow\left(\neg\Gamma\vee\beta\right)$}\tabularnewline \hline {\small{}$\frac{\Gamma\vdash\alpha\quad\quad\Gamma\vdash\beta}{\Gamma\vdash\alpha\wedge\beta}\quad(\text{create tuple})$} & {\small{}$\left(\neg\Gamma\vee\alpha\right)\wedge\left(\neg\Gamma\vee\beta\right)=\left(\neg\Gamma\vee\left(\alpha\wedge\beta\right)\right)$}\tabularnewline \hline -{\small{}$\frac{\Gamma\vdash\alpha\wedge\beta}{\Gamma\vdash\alpha}\quad(\text{use tuple-}1)$} & {\small{}$\left(\neg\Gamma\vee\left(\alpha\wedge\beta\right)\right)\Longrightarrow\left(\neg\Gamma\vee\alpha\right)$}\tabularnewline +{\small{}$\frac{\Gamma\vdash\alpha\wedge\beta}{\Gamma\vdash\alpha}\quad(\text{use tuple-}1)$} & {\small{}$\left(\neg\Gamma\vee\left(\alpha\wedge\beta\right)\right)Rightarrow\left(\neg\Gamma\vee\alpha\right)$}\tabularnewline \hline -{\small{}$\frac{\Gamma\vdash\alpha}{\Gamma\vdash\alpha\vee\beta}\quad(\text{create Left})$} & {\small{}$\left(\neg\Gamma\vee\alpha\right)\Longrightarrow\left(\neg\Gamma\vee\left(\alpha\vee\beta\right)\right)$}\tabularnewline +{\small{}$\frac{\Gamma\vdash\alpha}{\Gamma\vdash\alpha\vee\beta}\quad(\text{create Left})$} & {\small{}$\left(\neg\Gamma\vee\alpha\right)Rightarrow\left(\neg\Gamma\vee\left(\alpha\vee\beta\right)\right)$}\tabularnewline \hline -{\small{}$\frac{\Gamma\vdash\alpha\vee\beta\quad\quad\Gamma,\alpha\vdash\gamma\quad\quad\Gamma,\beta\vdash\gamma}{\Gamma\vdash\gamma}\quad(\text{use Either})$} & {\small{}$\left(\left(\neg\Gamma\vee\alpha\vee\beta\right)\wedge\left(\neg\Gamma\vee\neg\alpha\vee\gamma\right)\wedge\left(\neg\Gamma\vee\neg\beta\vee\gamma\right)\right)\Longrightarrow\left(\neg\Gamma\vee\gamma\right)$}\tabularnewline +{\small{}$\frac{\Gamma\vdash\alpha\vee\beta\quad\quad\Gamma,\alpha\vdash\gamma\quad\quad\Gamma,\beta\vdash\gamma}{\Gamma\vdash\gamma}\quad(\text{use Either})$} & {\small{}$\left(\left(\neg\Gamma\vee\alpha\vee\beta\right)\wedge\left(\neg\Gamma\vee\neg\alpha\vee\gamma\right)\wedge\left(\neg\Gamma\vee\neg\beta\vee\gamma\right)\right)Rightarrow\left(\neg\Gamma\vee\gamma\right)$}\tabularnewline \hline \end{tabular} \par\end{centering} @@ -4214,14 +4213,14 @@ \subsection{Relationship between Boolean logic and constructive logic\label{subs and ``$\text{use Either}$''; other formulas are checked in a similar way. \begin{align*} -{\color{greenunder}\text{formula ``use function''}:}\quad & \left(\alpha\wedge\left(\alpha\Longrightarrow\beta\right)\right)\Longrightarrow\beta\\ +{\color{greenunder}\text{formula ``use function''}:}\quad & \left(\alpha\wedge\left(\alphaRightarrow\beta\right)\right)Rightarrow\beta\\ {\color{greenunder}\text{use Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:}\quad & =\gunderline{\neg}(\alpha\,\gunderline{\wedge}\,(\neg\alpha\,\gunderline{\vee}\,\beta))\vee\beta\\ {\color{greenunder}\text{de Morgan's laws}:}\quad & =\gunderline{\neg\alpha\vee(\alpha\wedge\neg\beta)}\vee\beta\\ {\color{greenunder}\text{identity }p\vee(\neg p\wedge q)=p\vee q\text{ with }p=\neg\alpha\text{ and }q=\beta:}\quad & =\neg\alpha\vee\gunderline{\neg\beta\vee\beta}\\ {\color{greenunder}\text{axiom ``use arg''}:}\quad & =True\quad. \end{align*} \begin{align*} -{\color{greenunder}\text{formula ``use Either''}:}\quad & \left(\left(\alpha\vee\beta\right)\wedge\left(\alpha\Longrightarrow\gamma\right)\wedge\left(\beta\Longrightarrow\gamma\right)\right)\Longrightarrow\gamma\\ +{\color{greenunder}\text{formula ``use Either''}:}\quad & \left(\left(\alpha\vee\beta\right)\wedge\left(\alphaRightarrow\gamma\right)\wedge\left(\betaRightarrow\gamma\right)\right)Rightarrow\gamma\\ {\color{greenunder}\text{use Eq.~(\ref{eq:ch-definition-of-implication-in-Boolean-logic})}:}\quad & =\neg\left(\left(\alpha\vee\beta\right)\wedge\left(\neg\alpha\vee\gamma\right)\wedge\left(\neg\beta\vee\gamma\right)\right)\vee\gamma\\ {\color{greenunder}\text{de Morgan's laws}:}\quad & =\left(\neg\alpha\wedge\neg\beta\right)\vee\gunderline{\left(\alpha\wedge\neg\gamma\right)}\vee\gunderline{\left(\beta\wedge\neg\gamma\right)}\vee\gamma\\ {\color{greenunder}\text{identity }p\vee(\neg p\wedge q)=p\vee q:}\quad & =\gunderline{\left(\neg\alpha\wedge\neg\beta\right)\vee\alpha}\vee\beta\vee\gamma\\ @@ -4236,19 +4235,19 @@ \subsection{Relationship between Boolean logic and constructive logic\label{subs is translated into a chain of Boolean implications that look like this, \[ -True=(...)\Longrightarrow(...)\Longrightarrow...\Longrightarrow f(\alpha,\beta,\gamma)\quad. +True=(...)Rightarrow(...)Rightarrow...Rightarrowf(\alpha,\beta,\gamma)\quad. \] -Since $\left(True\Longrightarrow\alpha\right)=\alpha$, this chain -proves the Boolean formula $f(\alpha,\beta,\gamma)$. +Since $\left(TrueRightarrow\alpha\right)=\alpha$, this chain proves +the Boolean formula $f(\alpha,\beta,\gamma)$. For example, the proof tree shown in Figure~\ref{fig:Proof-of-the-sequent-example-2} is translated into \begin{align*} -{\color{greenunder}\text{axiom ``use arg''}:}\quad & True=\left(\neg\left(\left(\alpha\Longrightarrow\alpha\right)\Longrightarrow\beta\right)\vee\neg\alpha\vee\alpha\right)\\ -{\color{greenunder}\text{rule ``create function''}:}\quad & \quad\Rightarrow\neg\left(\left(\alpha\Longrightarrow\alpha\right)\Longrightarrow\beta\right)\vee\left(\alpha\Longrightarrow\alpha\right)\quad.\\ -{\color{greenunder}\text{axiom ``use arg''}:}\quad & True=\neg\left(\left(\alpha\Longrightarrow\alpha\right)\Longrightarrow\beta\right)\vee\left(\left(\alpha\Longrightarrow\alpha\right)\Longrightarrow\beta\right)\quad.\\ -{\color{greenunder}\text{rule ``use function''}:}\quad & True\Rightarrow\left(\neg\left(\left(\alpha\Longrightarrow\alpha\right)\Longrightarrow\beta\right)\vee\beta\right)\\ -{\color{greenunder}\text{rule ``create function''}:}\quad & \quad\Rightarrow\left(\left(\left(\alpha\Longrightarrow\alpha\right)\Longrightarrow\beta\right)\Longrightarrow\beta\right)\quad. +{\color{greenunder}\text{axiom ``use arg''}:}\quad & True=\left(\neg\left(\left(\alphaRightarrow\alpha\right)Rightarrow\beta\right)\vee\neg\alpha\vee\alpha\right)\\ +{\color{greenunder}\text{rule ``create function''}:}\quad & \quad\rightarrow\neg\left(\left(\alphaRightarrow\alpha\right)Rightarrow\beta\right)\vee\left(\alphaRightarrow\alpha\right)\quad.\\ +{\color{greenunder}\text{axiom ``use arg''}:}\quad & True=\neg\left(\left(\alphaRightarrow\alpha\right)Rightarrow\beta\right)\vee\left(\left(\alphaRightarrow\alpha\right)Rightarrow\beta\right)\quad.\\ +{\color{greenunder}\text{rule ``use function''}:}\quad & True\rightarrow\left(\neg\left(\left(\alphaRightarrow\alpha\right)Rightarrow\beta\right)\vee\beta\right)\\ +{\color{greenunder}\text{rule ``create function''}:}\quad & \quad\rightarrow\left(\left(\left(\alphaRightarrow\alpha\right)Rightarrow\beta\right)Rightarrow\beta\right)\quad. \end{align*} It is easier to check Boolean truth than to find a proof tree in constructive @@ -4261,12 +4260,12 @@ \subsection{Relationship between Boolean logic and constructive logic\label{subs examples of formulas that are not true in Boolean logic are \begin{align*} & \forall\alpha.\,\alpha\quad,\\ - & \forall(\alpha,\beta).\,\alpha\Longrightarrow\beta\quad,\\ - & \forall(\alpha,\beta).\,(\alpha\Longrightarrow\beta)\Longrightarrow\beta\quad. + & \forall(\alpha,\beta).\,\alphaRightarrow\beta\quad,\\ + & \forall(\alpha,\beta).\,(\alphaRightarrow\beta)Rightarrow\beta\quad. \end{align*} Table~\ref{tab:Proof-rules-of-constructive-and-boolean} uses the -Boolean identity $\left(\alpha\Longrightarrow\beta\right)=(\neg\alpha\vee\beta)$, +Boolean identity $\left(\alphaRightarrow\beta\right)=(\neg\alpha\vee\beta)$, which does not hold in the constructive logic, to translate the constructive axiom ``$\text{use arg}$'' into the Boolean axiom $\neg\alpha\vee\alpha=True$. The formula $\neg\alpha\vee\alpha=True$ is known as the \textbf{law @@ -4278,37 +4277,37 @@ \subsection{Relationship between Boolean logic and constructive logic\label{subs To see why, consider what it would mean for $\neg\alpha\vee\alpha=True$ to hold in the constructive logic. The negation operation, $\neg\alpha$, -is defined as the implication $\alpha\Longrightarrow False$. So, -the logical formula $\forall\alpha.\,\neg\alpha\vee\alpha$ corresponds -to the type $\forall A.\,\left(A\Rightarrow\bbnum 0\right)+A$. Can -we compute a value of this type in a fully parametric function? We -would need to compute either a value of type $A\Rightarrow\bbnum 0$ -or a value of type $A$; this decision needs to be made in advance -independently of $A$, because the code of a fully parametric function -must operate in the same way for all types. Should we decide to return -$A$ or $A\Rightarrow\bbnum 0$? We certainly cannot compute a value -of type $A$ from scratch, since $A$ is a type parameter. As we have -seen in Example~\ref{subsec:ch-Example-type-identity-A-0}, a value -of type $A\Rightarrow\bbnum 0$ exists if the type $A$ is itself -$\bbnum 0$; but we do not know that, and a fully parametric function -needs to have the same code for all types $A$. Since there are no -values of type $\bbnum 0$, and the type parameter $A$ could be, -say, \lstinline!Int!, we cannot compute a value of type $A\Rightarrow\bbnum 0$. +is defined as the implication $\alphaRightarrow False$. So, the logical +formula $\forall\alpha.\,\neg\alpha\vee\alpha$ corresponds to the +type $\forall A.\,\left(A\rightarrow\bbnum 0\right)+A$. Can we compute +a value of this type in a fully parametric function? We would need +to compute either a value of type $A\rightarrow\bbnum 0$ or a value +of type $A$; this decision needs to be made in advance independently +of $A$, because the code of a fully parametric function must operate +in the same way for all types. Should we decide to return $A$ or +$A\rightarrow\bbnum 0$? We certainly cannot compute a value of type +$A$ from scratch, since $A$ is a type parameter. As we have seen +in Example~\ref{subsec:ch-Example-type-identity-A-0}, a value of +type $A\rightarrow\bbnum 0$ exists if the type $A$ is itself $\bbnum 0$; +but we do not know that, and a fully parametric function needs to +have the same code for all types $A$. Since there are no values of +type $\bbnum 0$, and the type parameter $A$ could be, say, \lstinline!Int!, +we cannot compute a value of type $A\rightarrow\bbnum 0$. Example~\ref{subsec:ch-Example-type-identity-A-0} showed that the -type $A\Rightarrow\bbnum 0$ is equivalent to $\bbnum 0$ if $A$ +type $A\rightarrow\bbnum 0$ is equivalent to $\bbnum 0$ if $A$ is not itself void ($A\not\cong\bbnum 0$), and to $\bbnum 1$ otherwise. Surely, any type $A$ is either void or not void. So, why exactly -is it impossible to implement a value of the type $\left(A\Rightarrow\bbnum 0\right)+A$? -We could say that if $A$ is void then $\left(A\Rightarrow\bbnum 0\right)\cong\bbnum 1$ -is not void, and so one of the types in the disjunction $\left(A\Rightarrow\bbnum 0\right)+A$ +is it impossible to implement a value of the type $\left(A\rightarrow\bbnum 0\right)+A$? +We could say that if $A$ is void then $\left(A\rightarrow\bbnum 0\right)\cong\bbnum 1$ +is not void, and so one of the types in the disjunction $\left(A\rightarrow\bbnum 0\right)+A$ should be non-void (i.e.~have values). However, this reasoning is incorrect. A fully parametric functions' code must work in the same general way for all types; the code cannot decide what to do depending on a specific type. So, it is insufficient to show that a value ``should exist''; the real requirement is to -compute a value of type $\left(A\Rightarrow\bbnum 0\right)+A$ in +compute a value of type $\left(A\rightarrow\bbnum 0\right)+A$ in fully parametric code that works the same way for all types $A$. But, as we have seen, this is impossible. diff --git a/sofp-src/sofp-disjunctions.lyx b/sofp-src/sofp-disjunctions.lyx index efec92f07..1beaa43bf 100644 --- a/sofp-src/sofp-disjunctions.lyx +++ b/sofp-src/sofp-disjunctions.lyx @@ -109,15 +109,13 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} \def\mathunderline#1#2{\color{#1}\underline{{\color{black}#2}}\color{black}} % The LyX document will define a macro \gunderline{#1} that will use \mathunderline with the color `greenunder`. %\def\gunderline#1{\mathunderline{greenunder}{#1}} % This is now defined by LyX itself with GUI support. + \end_preamble \options open=any,numbers=noenddot,index=totoc,bibliography=totoc,listof=totoc,fontsize=10pt \use_default_options true @@ -20571,7 +20569,7 @@ noprefix "false" \end_inset ) or, equivalently, a logical implication -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset ( @@ -20592,7 +20590,7 @@ if ). It turns out that the logical implication -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset is related to the function type diff --git a/sofp-src/sofp-disjunctions.tex b/sofp-src/sofp-disjunctions.tex index e59361127..37fb4dcc0 100644 --- a/sofp-src/sofp-disjunctions.tex +++ b/sofp-src/sofp-disjunctions.tex @@ -2862,7 +2862,7 @@ \subsection{Disjunctions and conjunctions in formal logic\label{subsec:Disjuncti are not sufficient to produce all possible logical expressions. To obtain a complete logic, it is also necessary to have a logical negation $\neg A$ (``$A$ is not true'') or, equivalently, a logical implication -$A\Rightarrow B$ (``if $A$ is true than $B$ is true''). It turns -out that the logical implication $A\Rightarrow B$ is related to the +$A\rightarrow B$ (``if $A$ is true than $B$ is true''). It turns +out that the logical implication $A\rightarrow B$ is related to the function type \lstinline!A => B!. In Chapter~\ref{chap:Higher-order-functions}, we will study function types in depth. diff --git a/sofp-src/sofp-draft.pdf b/sofp-src/sofp-draft.pdf index 9e4edcc70139a9a6d116fdeaef229ed12a336574..291f0639dc10bf2dbacf2a64164083350be04cdd 100644 GIT binary patch delta 304634 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

~?t0xcpYK4r671*&?)iJNb{y@9)0O{(Pv? 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 delta 302170 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

!S~C?7S?WT&JMcy$QT+m0inE0dfR@D5 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 diff --git a/sofp-src/sofp-essays.lyx b/sofp-src/sofp-essays.lyx index 8503f4c82..dbc40eb39 100644 --- a/sofp-src/sofp-essays.lyx +++ b/sofp-src/sofp-essays.lyx @@ -109,9 +109,6 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} @@ -3393,7 +3390,7 @@ Either[A,B] , and the function type, \family typewriter A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset B diff --git a/sofp-src/sofp-essays.tex b/sofp-src/sofp-essays.tex index d342ac9a9..4998a4634 100644 --- a/sofp-src/sofp-essays.tex +++ b/sofp-src/sofp-essays.tex @@ -681,7 +681,7 @@ \section{Functional programming is math} composite types corresponding to the logical formulas ``$A$ \textbf{\emph{or}} $B$'', ``$A$ \textbf{\emph{and}} $B$'', ``$A$ \textbf{\emph{implies}} $B$''. In Scala, these composite types are \texttt{Either{[}A,B{]}}, -the tuple \texttt{(A,B)}, and the function type, \texttt{A$\Rightarrow$B}. +the tuple \texttt{(A,B)}, and the function type, \texttt{A$\rightarrow$B}. All modern functional languages such as OCaml, Haskell, Scala, F\#, Swift, Elm, and PureScript support these three type constructions and thus are faithful to the CH correspondence. Having a \emph{complete} diff --git a/sofp-src/sofp-filterable.lyx b/sofp-src/sofp-filterable.lyx index 40de8d575..d814f84f5 100644 --- a/sofp-src/sofp-filterable.lyx +++ b/sofp-src/sofp-filterable.lyx @@ -109,15 +109,13 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} \def\mathunderline#1#2{\color{#1}\underline{{\color{black}#2}}\color{black}} % The LyX document will define a macro \gunderline{#1} that will use \mathunderline with the color `greenunder`. %\def\gunderline#1{\mathunderline{greenunder}{#1}} % This is now defined by LyX itself with GUI support. + \end_preamble \options open=any,numbers=noenddot,index=totoc,bibliography=totoc,listof=totoc,fontsize=10pt \use_default_options true @@ -2230,15 +2228,15 @@ factory \end_inset takes a predicate -\begin_inset Formula $p^{:A\Rightarrow\bbnum 2}$ +\begin_inset Formula $p^{:A\rightarrow\bbnum 2}$ \end_inset and a function -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset , and returns a partial function with the same signature, -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset , but defined only for values @@ -2278,7 +2276,7 @@ Boolean as \begin_inset Formula \[ -f_{|p}\triangleq x\Rightarrow p(x)\triangleright\,\begin{array}{|c||c|} +f_{|p}\triangleq x\rightarrow p(x)\triangleright\,\begin{array}{|c||c|} & B\\ \hline \text{true} & f(x)\\ \text{false} & \bbnum 0 @@ -2495,7 +2493,7 @@ filter ) with type signature \begin_inset Formula \[ -\text{filt}_{F}:(A\Rightarrow\bbnum 2)\Rightarrow F^{A}\Rightarrow F^{A}\quad. +\text{filt}_{F}:(A\rightarrow\bbnum 2)\rightarrow F^{A}\rightarrow F^{A}\quad. \] \end_inset @@ -2540,10 +2538,10 @@ filter \begin_inset Formula \begin{align*} -\text{naturality law of }\text{filt}_{F}:\quad & f^{\uparrow F}\bef\text{filt}_{F}(p)=\text{filt}_{F}(f\bef p)\bef f^{\uparrow F}\quad\text{for any }f^{:A\Rightarrow B},~p^{:B\Rightarrow\bbnum 2}\quad.\\ -\text{identity law of }\text{filt}_{F}:\quad & \text{filt}_{F}(\_\Rightarrow\text{true})=\text{id}^{:F^{A}\Rightarrow F^{A}}\quad.\\ -\text{composition law of }\text{filt}_{F}:\quad & \text{filt}_{F}(p_{1})\bef\text{filt}_{F}(p_{2})=\text{filt}_{F}(x\Rightarrow p_{1}(x)\wedge p_{2}(x))\quad\text{for any }p_{1}^{:A\Rightarrow\bbnum 2},~p_{2}^{:A\Rightarrow\bbnum 2}\quad.\\ -\text{partial function law of }\text{filt}_{F}:\quad & \text{filt}_{F}(p)\bef f^{\uparrow F}=\text{filt}_{F}(p)\bef f_{|p}^{\uparrow F}\quad\text{for any }f^{:A\Rightarrow B},~p^{:A\Rightarrow\bbnum 2}\quad. +\text{naturality law of }\text{filt}_{F}:\quad & f^{\uparrow F}\bef\text{filt}_{F}(p)=\text{filt}_{F}(f\bef p)\bef f^{\uparrow F}\quad\text{for any }f^{:A\rightarrow B},~p^{:B\rightarrow\bbnum 2}\quad.\\ +\text{identity law of }\text{filt}_{F}:\quad & \text{filt}_{F}(\_\rightarrow\text{true})=\text{id}^{:F^{A}\rightarrow F^{A}}\quad.\\ +\text{composition law of }\text{filt}_{F}:\quad & \text{filt}_{F}(p_{1})\bef\text{filt}_{F}(p_{2})=\text{filt}_{F}(x\rightarrow p_{1}(x)\wedge p_{2}(x))\quad\text{for any }p_{1}^{:A\rightarrow\bbnum 2},~p_{2}^{:A\rightarrow\bbnum 2}\quad.\\ +\text{partial function law of }\text{filt}_{F}:\quad & \text{filt}_{F}(p)\bef f^{\uparrow F}=\text{filt}_{F}(p)\bef f_{|p}^{\uparrow F}\quad\text{for any }f^{:A\rightarrow B},~p^{:A\rightarrow\bbnum 2}\quad. \end{align*} \end_inset @@ -2589,8 +2587,8 @@ filter : \begin_inset Formula \[ -\xymatrix{\xyScaleY{2.0pc}\xyScaleX{8.0pc}F^{A}\ar[r]\sp(0.5){\text{filt}_{F}(f^{:A\Rightarrow B}\bef p^{:B\Rightarrow\bbnum 2})}\ar[d]\sb(0.45){(f^{:A\Rightarrow B})^{\uparrow F}} & F^{A}\ar[d]\sp(0.45){(f^{:A\Rightarrow B})^{\uparrow F}}\\ -F^{B}\ar[r]\sp(0.5){\text{filt}_{F}(p^{:B\Rightarrow\bbnum 2})} & F^{B} +\xymatrix{\xyScaleY{2.0pc}\xyScaleX{8.0pc}F^{A}\ar[r]\sp(0.5){\text{filt}_{F}(f^{:A\rightarrow B}\bef p^{:B\rightarrow\bbnum 2})}\ar[d]\sb(0.45){(f^{:A\rightarrow B})^{\uparrow F}} & F^{A}\ar[d]\sp(0.45){(f^{:A\rightarrow B})^{\uparrow F}}\\ +F^{B}\ar[r]\sp(0.5){\text{filt}_{F}(p^{:B\rightarrow\bbnum 2})} & F^{B} } \] @@ -3320,7 +3318,7 @@ the identity functor \end_inset or the exponential functor -\begin_inset Formula $F^{A}\triangleq E\Rightarrow A$ +\begin_inset Formula $F^{A}\triangleq E\rightarrow A$ \end_inset . @@ -3335,7 +3333,7 @@ the identity functor that should not pass the filter. So, functors of the form -\begin_inset Formula $F^{A}\triangleq E\Rightarrow A$ +\begin_inset Formula $F^{A}\triangleq E\rightarrow A$ \end_inset (where @@ -3916,11 +3914,11 @@ It remains to check that the filtering laws hold. \end_inset , -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset , and -\begin_inset Formula $p^{:B\Rightarrow\bbnum 2}$ +\begin_inset Formula $p^{:B\rightarrow\bbnum 2}$ \end_inset . @@ -4382,7 +4380,7 @@ filter \end_inset is the identity function when -\begin_inset Formula $p\triangleq(\_\Rightarrow\text{true})$ +\begin_inset Formula $p\triangleq(\_\rightarrow\text{true})$ \end_inset , @@ -6756,7 +6754,7 @@ noprefix "false" \begin_layout Standard Show that -\begin_inset Formula $C^{Z,A}\triangleq A\Rightarrow\bbnum 1+Z$ +\begin_inset Formula $C^{Z,A}\triangleq A\rightarrow\bbnum 1+Z$ \end_inset is a filterable contrafunctor with respect to the type parameter @@ -7072,7 +7070,7 @@ status open (c) \series default -\begin_inset Formula $F^{P,Q,A}\triangleq(P\Rightarrow P)+(Q\Rightarrow Q)\times A\times A\times A\quad.$ +\begin_inset Formula $F^{P,Q,A}\triangleq(P\rightarrow P)+(Q\rightarrow Q)\times A\times A\times A\quad.$ \end_inset @@ -7219,7 +7217,7 @@ noprefix "false" \begin_layout Standard Show that -\begin_inset Formula $C^{A}\triangleq A+A\times A\Rightarrow\bbnum 1+Z$ +\begin_inset Formula $C^{A}\triangleq A+A\times A\rightarrow\bbnum 1+Z$ \end_inset is a filterable contrafunctor (no law checking). @@ -8654,7 +8652,7 @@ Get \end_inset using -\begin_inset Formula $\text{inflate}:F^{A}\Rightarrow F^{1+A}=\text{fmap}\,(\text{Some}^{A\Rightarrow1+A})$ +\begin_inset Formula $\text{inflate}:F^{A}\rightarrow F^{1+A}=\text{fmap}\,(\text{Some}^{A\rightarrow1+A})$ \end_inset @@ -8662,11 +8660,11 @@ Get \begin_layout Standard Filter -\begin_inset Formula $F^{1+A}\Rightarrow F^{1+A}$ +\begin_inset Formula $F^{1+A}\rightarrow F^{1+A}$ \end_inset using -\begin_inset Formula $\text{fmap}\left(x^{1+A}\Rightarrow\text{filter}_{\text{Opt}}(p^{A\Rightarrow\text{Boolean}})(x)\right)$ +\begin_inset Formula $\text{fmap}\left(x^{1+A}\rightarrow\text{filter}_{\text{Opt}}(p^{A\rightarrow\text{Boolean}})(x)\right)$ \end_inset @@ -8697,7 +8695,7 @@ deflate: \end_inset F[Option[A]] -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset F[A] @@ -8717,7 +8715,7 @@ flatten[T]: \end_inset Seq[Option[T]] -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Seq[T] @@ -8731,7 +8729,7 @@ Seq[Option[T]] Simplify \size footnotesize -\begin_inset Formula $\text{fmap}(\text{Some}^{A\Rightarrow1+A})\bef\text{fmap}\left(\text{filter}_{\text{Opt}}p\right)=\text{fmap}\left(\text{bop}\left(p\right)\right)$ +\begin_inset Formula $\text{fmap}(\text{Some}^{A\rightarrow1+A})\bef\text{fmap}\left(\text{filter}_{\text{Opt}}p\right)=\text{fmap}\left(\text{bop}\left(p\right)\right)$ \end_inset @@ -8739,7 +8737,7 @@ Simplify where we defined \size footnotesize -\begin_inset Formula $\text{{\color{blue}bop}}\left(p\right):\left(A\Rightarrow1+A\right)\equiv$ +\begin_inset Formula $\text{{\color{blue}bop}}\left(p\right):\left(A\rightarrow1+A\right)\equiv$ \end_inset @@ -8749,7 +8747,7 @@ Simplify \size footnotesize \color blue x -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Some(x).filter(p) @@ -8897,7 +8895,7 @@ def deflate[F[_],A](foa: F[Option[A]]): F[A] = _.get \family roman is -\begin_inset Formula $0+x^{A}\Rightarrow x^{A}$ +\begin_inset Formula $0+x^{A}\rightarrow x^{A}$ \end_inset @@ -8915,7 +8913,7 @@ F = Seq , this would be \family default foa.collect { case Some(x) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset x } @@ -9007,7 +9005,7 @@ deflate \begin_layout Standard cannot map -\begin_inset Formula $F^{1+A}\Rightarrow F^{A}$ +\begin_inset Formula $F^{1+A}\rightarrow F^{A}$ \end_inset because we do not have @@ -9018,12 +9016,12 @@ cannot map \end_layout \begin_layout Standard -\begin_inset Formula $F^{A}=\text{Int}\Rightarrow A$ +\begin_inset Formula $F^{A}=\text{Int}\rightarrow A$ \end_inset . Write -\begin_inset Formula $F^{1+A}=\text{Int}\Rightarrow1+A$ +\begin_inset Formula $F^{1+A}=\text{Int}\rightarrow1+A$ \end_inset @@ -9039,7 +9037,7 @@ deflate \size default \color inherit would be -\begin_inset Formula $\left(\text{Int}\Rightarrow1+A\right)\Rightarrow\text{Int}\Rightarrow A$ +\begin_inset Formula $\left(\text{Int}\rightarrow1+A\right)\rightarrow\text{Int}\rightarrow A$ \end_inset @@ -9047,7 +9045,7 @@ deflate \begin_layout Standard cannot map -\begin_inset Formula $F^{1+A}\Rightarrow F^{A}$ +\begin_inset Formula $F^{1+A}\rightarrow F^{A}$ \end_inset because we do not have @@ -9120,7 +9118,7 @@ deflate Denote \size footnotesize -\begin_inset Formula $\psi_{p}^{F^{A}\Rightarrow F^{1+A}}\equiv\text{fmap}\left(\text{bop}\:p\right)$ +\begin_inset Formula $\psi_{p}^{F^{A}\rightarrow F^{1+A}}\equiv\text{fmap}\left(\text{bop}\:p\right)$ \end_inset for brevity, then @@ -9134,15 +9132,15 @@ Denote Law 4 then becomes: \size footnotesize -\begin_inset Formula $\psi_{p}\bef\text{deflate}\bef\text{fmap}\:f^{A\Rightarrow B}=\psi_{p}\bef\text{deflate}\bef\text{fmap}\:f_{|p}$ +\begin_inset Formula $\psi_{p}\bef\text{deflate}\bef\text{fmap}\:f^{A\rightarrow B}=\psi_{p}\bef\text{deflate}\bef\text{fmap}\:f_{|p}$ \end_inset \begin_inset Formula \[ -\xymatrix{\xyScaleY{0.1pc}\xyScaleX{3pc} & F^{1+A}\ar[r]\sp(0.5){\text{deflate}} & F^{A}\ar[rd]\sp(0.5){\text{ fmap}\:f^{A\Rightarrow B}}\\ +\xymatrix{\xyScaleY{0.1pc}\xyScaleX{3pc} & F^{1+A}\ar[r]\sp(0.5){\text{deflate}} & F^{A}\ar[rd]\sp(0.5){\text{ fmap}\:f^{A\rightarrow B}}\\ F^{A}\ar[ru]\sp(0.5){\psi_{p}}\ar[rd]\sb(0.5){\psi_{p}} & & & F^{B}\\ - & F^{1+A}\ar[r]\sb(0.5){\text{deflate}} & F^{A}\ar[ru]\sb(0.5){\text{fmap}\:f_{|p}^{A\Rightarrow B}} + & F^{1+A}\ar[r]\sb(0.5){\text{deflate}} & F^{A}\ar[ru]\sb(0.5){\text{fmap}\:f_{|p}^{A\rightarrow B}} } \] @@ -9192,7 +9190,7 @@ deflate \size footnotesize \begin_inset Formula \[ -\text{fmap}\:f^{A\Rightarrow B}\bef\psi_{p}\bef\text{deflate}^{F,B}=\psi_{f\bef p}\bef\text{deflate}^{F,A}\bef\text{fmap}\:f^{A\Rightarrow B} +\text{fmap}\:f^{A\rightarrow B}\bef\psi_{p}\bef\text{deflate}^{F,B}=\psi_{f\bef p}\bef\text{deflate}^{F,A}\bef\text{fmap}\:f^{A\rightarrow B} \] \end_inset @@ -9201,8 +9199,8 @@ deflate \begin_inset Formula \[ \xymatrix{\xyScaleY{0.1pc}\xyScaleX{3pc} & F^{B}\ar[r]\sp(0.5){\psi_{p}} & F^{1+B}\ar[rd]\sp(0.5){\text{ deflate}^{F,B}}\\ -F^{A}\ar[ru]\sp(0.5){\text{fmap}\:f^{A\Rightarrow B}}\ar[rd]\sb(0.5){\psi_{f\bef p}} & & & F^{B}\\ - & F^{1+A}\ar[r]\sb(0.5){\text{deflate}^{F,A}} & F^{A}\ar[ru]\sb(0.5){\text{fmap}\:f^{A\Rightarrow B}} +F^{A}\ar[ru]\sp(0.5){\text{fmap}\:f^{A\rightarrow B}}\ar[rd]\sb(0.5){\psi_{f\bef p}} & & & F^{B}\\ + & F^{1+A}\ar[r]\sb(0.5){\text{deflate}^{F,A}} & F^{A}\ar[ru]\sb(0.5){\text{fmap}\:f^{A\rightarrow B}} } \] @@ -9230,14 +9228,14 @@ Can we simplify \size footnotesize Have property: -\begin_inset Formula $f^{A\Rightarrow B}\bef\text{bop}\left(p^{B\Rightarrow\text{Boolean}}\right)=\text{bop}\left(f\bef p\right)\bef\text{fmap}^{\text{Opt}}\,f$ +\begin_inset Formula $f^{A\rightarrow B}\bef\text{bop}\left(p^{B\rightarrow\text{Boolean}}\right)=\text{bop}\left(f\bef p\right)\bef\text{fmap}^{\text{Opt}}\,f$ \end_inset (see code) \begin_inset Formula \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & B\ar[rd]\sp(0.5){\text{bop}\,p}\\ -A\ar[ru]\sp(0.5){f^{A\Rightarrow B}}\ar[rd]\sb(0.4){\text{bop}\left(f\bef p\right)\,} & & 1+B\\ +A\ar[ru]\sp(0.5){f^{A\rightarrow B}}\ar[rd]\sb(0.4){\text{bop}\left(f\bef p\right)\,} & & 1+B\\ & 1+A\ar[ru]\sb(0.6){\text{fmap}^{\text{Opt}}f} } \] @@ -9259,7 +9257,7 @@ Remove common prefix from both sides: \begin_inset Formula \[ -\text{fmap}\,(\text{fmap}^{\text{Opt}}f^{A\Rightarrow B})\bef\text{deflate}^{F,B}=\text{deflate}^{F,A}\bef\text{fmap}\,f^{A\Rightarrow B}\ \ -\text{ \textbf{law 1 for deflate}} +\text{fmap}\,(\text{fmap}^{\text{Opt}}f^{A\rightarrow B})\bef\text{deflate}^{F,B}=\text{deflate}^{F,A}\bef\text{fmap}\,f^{A\rightarrow B}\ \ -\text{ \textbf{law 1 for deflate}} \] \end_inset @@ -9269,7 +9267,7 @@ Remove common prefix \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{1+B}\ar[rd]\sp(0.5){\ \text{deflate}^{F,B}}\\ F^{1+A}\ar[ru]\sp(0.5){\text{fmap}\,(\text{fmap}\,f)\ }\ar[rd]\sb(0.5){\text{deflate}^{F,A}\,} & & F^{B}\\ - & F^{A}\ar[ru]\sb(0.5){\text{fmap\,}f^{A\Rightarrow B}} + & F^{A}\ar[ru]\sb(0.5){\text{fmap\,}f^{A\rightarrow B}} } \] @@ -9287,7 +9285,7 @@ deflate \family default \color inherit -\begin_inset Formula $:F^{1+A}\Rightarrow F^{A}$ +\begin_inset Formula $:F^{1+A}\rightarrow F^{A}$ \end_inset @@ -9322,7 +9320,7 @@ Example: \size footnotesize natural transformations map containers -\begin_inset Formula $G^{A}\Rightarrow H^{A}$ +\begin_inset Formula $G^{A}\rightarrow H^{A}$ \end_inset by rearranging data in them @@ -9353,7 +9351,7 @@ deflate \begin_inset Formula \[ -\text{fmap}\,(\text{fmap}^{\text{Opt}}f^{A\Rightarrow B})\bef\text{deflate}^{F,B}=\text{deflate}^{F,A}\bef\text{fmap}\,f^{A\Rightarrow B} +\text{fmap}\,(\text{fmap}^{\text{Opt}}f^{A\rightarrow B})\bef\text{deflate}^{F,B}=\text{deflate}^{F,A}\bef\text{fmap}\,f^{A\rightarrow B} \] \end_inset @@ -9373,9 +9371,9 @@ deflate \begin_inset Formula \[ -\xymatrix{\xyScaleY{0.1pc}\xyScaleX{3pc} & F^{1+A}\ar[r]\sp(0.5){\text{deflate}} & F^{A}\ar[rd]\sp(0.5){\text{ fmap}\:f^{A\Rightarrow B}}\\ +\xymatrix{\xyScaleY{0.1pc}\xyScaleX{3pc} & F^{1+A}\ar[r]\sp(0.5){\text{deflate}} & F^{A}\ar[rd]\sp(0.5){\text{ fmap}\:f^{A\rightarrow B}}\\ F^{A}\ar[ru]\sp(0.5){\psi_{p}}\ar[rd]\sb(0.5){\psi_{p}} & & & F^{B}\\ - & F^{1+A}\ar[r]\sb(0.5){\text{deflate}} & F^{A}\ar[ru]\sb(0.5){\text{fmap}\:f_{|p}^{A\Rightarrow B}} + & F^{1+A}\ar[r]\sb(0.5){\text{deflate}} & F^{A}\ar[ru]\sb(0.5){\text{fmap}\:f_{|p}^{A\rightarrow B}} } \] @@ -9384,7 +9382,7 @@ F^{A}\ar[ru]\sp(0.5){\psi_{p}}\ar[rd]\sb(0.5){\psi_{p}} & & & F^{B}\\ \begin_inset Formula \[ -\psi_{p}\bef\text{deflate}^{F,A}\bef\text{fmap}\:f^{A\Rightarrow B}=\psi_{p}\bef\text{deflate}^{F,A}\bef\text{fmap}\:f_{|p} +\psi_{p}\bef\text{deflate}^{F,A}\bef\text{fmap}\:f^{A\rightarrow B}=\psi_{p}\bef\text{deflate}^{F,A}\bef\text{fmap}\:f_{|p} \] \end_inset @@ -9430,7 +9428,7 @@ fmap \size footnotesize \color blue x -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Some(x).filter(p).map(f) @@ -9442,11 +9440,11 @@ x \size footnotesize \color blue x -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Some(x).filter(p).map { case x if p(x) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset f(x) } @@ -9489,7 +9487,7 @@ deflate \begin_inset Formula \[ -\text{{\color{blue}fmapOpt}}^{F,A,B}(f^{A\Rightarrow1+B}):F^{A}\Rightarrow F^{B}=\text{fmap}\:f\bef\text{deflate}^{F,B} +\text{{\color{blue}fmapOpt}}^{F,A,B}(f^{A\rightarrow1+B}):F^{A}\rightarrow F^{B}=\text{fmap}\:f\bef\text{deflate}^{F,B} \] \end_inset @@ -9498,7 +9496,7 @@ deflate \begin_inset Formula \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{1+B}\ar[rd]\sp(0.5){\ \text{deflate}^{F,B}}\\ -F^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\Rightarrow1+B}\ }\ar[rr]\sb(0.5){\text{fmapOpt}\:f^{A\Rightarrow1+B}\,} & & F^{B} +F^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\rightarrow1+B}\ }\ar[rr]\sb(0.5){\text{fmapOpt}\:f^{A\rightarrow1+B}\,} & & F^{B} } \] @@ -9531,7 +9529,7 @@ equivalent : \size footnotesize -\begin_inset Formula $\text{deflate}^{F,A}=\text{fmapOpt}^{F,1+A,A}(\text{id}^{1+A\Rightarrow1+A})$ +\begin_inset Formula $\text{deflate}^{F,A}=\text{fmapOpt}^{F,1+A,A}(\text{id}^{1+A\rightarrow1+A})$ \end_inset @@ -9577,7 +9575,7 @@ fmapOpt \begin_layout Standard Consider the expression needed for law 2: -\begin_inset Formula $x\Rightarrow p_{1}(x)\wedge p_{2}(x)$ +\begin_inset Formula $x\rightarrow p_{1}(x)\wedge p_{2}(x)$ \end_inset @@ -9586,7 +9584,7 @@ Consider the expression needed for law 2: \begin_layout Standard \size footnotesize -\begin_inset Formula $\text{bop}\left(x\Rightarrow p_{1}(x)\wedge p_{2}(x)\right)=x^{A}\Rightarrow\left(\text{bop}\,p_{1}\right)(x)\text{.flatMap}\left(\text{bop}\,p_{2}\right)$ +\begin_inset Formula $\text{bop}\left(x\rightarrow p_{1}(x)\wedge p_{2}(x)\right)=x^{A}\rightarrow\left(\text{bop}\,p_{1}\right)(x)\text{.flatMap}\left(\text{bop}\,p_{2}\right)$ \end_inset @@ -9604,7 +9602,7 @@ Denote this computation by \begin_inset Formula \[ -q_{1}^{A\Rightarrow1+B}\diamond_{\text{Opt}}q_{2}^{B\Rightarrow1+C}\equiv x^{A}\Rightarrow q_{1}(x).\text{flatMap}\left(q_{2}\right) +q_{1}^{A\rightarrow1+B}\diamond_{\text{Opt}}q_{2}^{B\rightarrow1+C}\equiv x^{A}\rightarrow q_{1}(x).\text{flatMap}\left(q_{2}\right) \] \end_inset @@ -9614,7 +9612,7 @@ q_{1}^{A\Rightarrow1+B}\diamond_{\text{Opt}}q_{2}^{B\Rightarrow1+C}\equiv x^{A}\ \begin_layout Standard Similar to composition of functions, except the types are -\begin_inset Formula $A\Rightarrow1+B$ +\begin_inset Formula $A\rightarrow1+B$ \end_inset @@ -9628,7 +9626,7 @@ Kleisli composition ; the general case: \size footnotesize -\begin_inset Formula $\diamond_{M}:(A\Rightarrow M^{B})\Rightarrow(B\Rightarrow M^{C})\Rightarrow(A\Rightarrow M^{C})$ +\begin_inset Formula $\diamond_{M}:(A\rightarrow M^{B})\rightarrow(B\rightarrow M^{C})\rightarrow(A\rightarrow M^{C})$ \end_inset @@ -9646,7 +9644,7 @@ The Kleisli identity \series default function: -\begin_inset Formula $\text{id}_{\diamond_{\text{Opt}}}^{A\Rightarrow1+A}\equiv x^{A}\Rightarrow\text{Some}\left(x\right)$ +\begin_inset Formula $\text{id}_{\diamond_{\text{Opt}}}^{A\rightarrow1+A}\equiv x^{A}\rightarrow\text{Some}\left(x\right)$ \end_inset @@ -9674,7 +9672,7 @@ fmapOpt \end_inset function -\begin_inset Formula $f^{A\Rightarrow1+B}$ +\begin_inset Formula $f^{A\rightarrow1+B}$ \end_inset into the functor @@ -9725,7 +9723,7 @@ Identity law \begin_inset Formula \[ -\text{fmapOpt}\,(\text{id}_{\diamond_{\text{Opt}}}^{A\Rightarrow1+A})=\text{id}^{F^{A}\Rightarrow F^{A}} +\text{fmapOpt}\,(\text{id}_{\diamond_{\text{Opt}}}^{A\rightarrow1+A})=\text{id}^{F^{A}\rightarrow F^{A}} \] \end_inset @@ -9743,7 +9741,7 @@ Composition law \begin_inset Formula \[ -\text{fmapOpt}\,(f^{A\Rightarrow1+B})\bef\text{fmapOpt}\,(g^{B\Rightarrow1+C})=\text{fmapOpt}\left(f\diamond_{\text{\textbf{Opt}}}g\right) +\text{fmapOpt}\,(f^{A\rightarrow1+B})\bef\text{fmapOpt}\,(g^{B\rightarrow1+C})=\text{fmapOpt}\left(f\diamond_{\text{\textbf{Opt}}}g\right) \] \end_inset @@ -9751,8 +9749,8 @@ Composition law \begin_inset Formula \[ -\xymatrix{\xyScaleY{2pc}\xyScaleX{3pc} & F^{B}\ar[rd]\sp(0.55){\ \text{fmapOpt}\,(g^{B\Rightarrow1+C})}\\ -F^{A}\ar[ru]\sp(0.45){\text{fmapOpt}\,(f^{A\Rightarrow1+B})\ }\ar[rr]\sb(0.5){\text{fmapOpt}\left(f\diamond_{\text{Opt}}g\right)} & & F^{C} +\xymatrix{\xyScaleY{2pc}\xyScaleX{3pc} & F^{B}\ar[rd]\sp(0.55){\ \text{fmapOpt}\,(g^{B\rightarrow1+C})}\\ +F^{A}\ar[ru]\sp(0.45){\text{fmapOpt}\,(f^{A\rightarrow1+B})\ }\ar[rr]\sb(0.5){\text{fmapOpt}\left(f\diamond_{\text{Opt}}g\right)} & & F^{C} } \] @@ -9779,11 +9777,11 @@ Both of them use more complicated types than the old laws \begin_layout Standard Conceptually, the new laws are simpler (lift -\begin_inset Formula $f^{A\Rightarrow1+B}$ +\begin_inset Formula $f^{A\rightarrow1+B}$ \end_inset into -\begin_inset Formula $F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $F^{A}\rightarrow F^{B}$ \end_inset ) @@ -9827,7 +9825,7 @@ fmapOpt \begin_inset Formula \[ -\text{filter}\,(x^{A}\Rightarrow\text{true})=\text{fmap}\,(x^{A}\Rightarrow0+x)\bef\text{deflate}=\text{fmapOpt}\,(\text{id}_{\diamond_{\text{Opt}}})=\text{id}^{F^{A}\Rightarrow F^{A}} +\text{filter}\,(x^{A}\rightarrow\text{true})=\text{fmap}\,(x^{A}\rightarrow0+x)\bef\text{deflate}=\text{fmapOpt}\,(\text{id}_{\diamond_{\text{Opt}}})=\text{id}^{F^{A}\rightarrow F^{A}} \] \end_inset @@ -9839,7 +9837,7 @@ fmapOpt Derive old law 2: need to work with \size footnotesize -\begin_inset Formula $q_{1,2}\equiv\text{bop}\left(p_{1,2}\right):A\Rightarrow1+A$ +\begin_inset Formula $q_{1,2}\equiv\text{bop}\left(p_{1,2}\right):A\rightarrow1+A$ \end_inset @@ -9849,7 +9847,7 @@ Derive old law 2: need to work with The Boolean conjunction \size footnotesize -\begin_inset Formula $x\Rightarrow p_{1}(x)\wedge p_{2}(x)$ +\begin_inset Formula $x\rightarrow p_{1}(x)\wedge p_{2}(x)$ \end_inset @@ -9867,7 +9865,7 @@ corresponds to Apply the composition law to Kleisli functions of types \size footnotesize -\begin_inset Formula $A\Rightarrow1+A$ +\begin_inset Formula $A\rightarrow1+A$ \end_inset @@ -9878,7 +9876,7 @@ Apply the composition law to Kleisli functions of types \begin_inset Formula \begin{align*} \text{filter}\,p_{1}\bef\text{filter}\,p_{2} & =\text{fmapOpt}\,q_{1}\bef\text{fmapOpt}\,q_{2}\\ -=\text{fmapOpt}\left(q_{1}\diamond_{\text{\textbf{Opt}}}q_{2}\right) & =\text{fmapOpt}\left(\text{bop}\left(x\Rightarrow p_{1}(x)\wedge p_{2}(x)\right)\right) +=\text{fmapOpt}\left(q_{1}\diamond_{\text{\textbf{Opt}}}q_{2}\right) & =\text{fmapOpt}\left(\text{bop}\left(x\rightarrow p_{1}(x)\wedge p_{2}(x)\right)\right) \end{align*} \end_inset @@ -9922,7 +9920,7 @@ fmapOpt \begin_layout Standard lift -\begin_inset Formula $f^{A\Rightarrow B}$ +\begin_inset Formula $f^{A\rightarrow B}$ \end_inset to Kleisli @@ -9932,7 +9930,7 @@ lift by defining \size footnotesize -\begin_inset Formula $k_{f}^{A\Rightarrow1+B}=f\bef\text{id}_{\diamond_{\text{\textbf{Opt}}}}$ +\begin_inset Formula $k_{f}^{A\rightarrow1+B}=f\bef\text{id}_{\diamond_{\text{\textbf{Opt}}}}$ \end_inset ; @@ -10112,7 +10110,7 @@ twisted \end_layout \begin_layout Standard -\begin_inset Formula $\text{fmap}:\left(A\Rightarrow B\right)\Rightarrow F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $\text{fmap}:\left(A\rightarrow B\right)\rightarrow F^{A}\rightarrow F^{B}$ \end_inset – ordinary container ( @@ -10127,14 +10125,14 @@ endofunctor \end_layout \begin_layout Standard -\begin_inset Formula $\text{contrafmap}:\left(B\Rightarrow A\right)\Rightarrow F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $\text{contrafmap}:\left(B\rightarrow A\right)\rightarrow F^{A}\rightarrow F^{B}$ \end_inset – lifting from reversed functions \end_layout \begin_layout Standard -\begin_inset Formula $\text{fmapOpt}:\left(A\Rightarrow1+B\right)\Rightarrow F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $\text{fmapOpt}:\left(A\rightarrow1+B\right)\rightarrow F^{A}\rightarrow F^{B}$ \end_inset – lifting from Kleisli @@ -10387,7 +10385,7 @@ pointed \begin_layout Standard Example of non-trivial pointed type: -\begin_inset Formula $A\Rightarrow A$ +\begin_inset Formula $A\rightarrow A$ \end_inset @@ -10395,7 +10393,7 @@ Example of non-trivial pointed type: \begin_layout Standard Example of non-pointed type: -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset when @@ -10445,7 +10443,7 @@ Also have \end_layout \begin_layout Standard -\begin_inset Formula $F^{A}\equiv G^{A}\Rightarrow H^{A}$ +\begin_inset Formula $F^{A}\equiv G^{A}\rightarrow H^{A}$ \end_inset if @@ -10471,7 +10469,7 @@ filterable \begin_layout Standard Note: the functor -\begin_inset Formula $F^{A}\equiv G^{A}\Rightarrow A$ +\begin_inset Formula $F^{A}\equiv G^{A}\rightarrow A$ \end_inset is not filterable @@ -10514,13 +10512,13 @@ fmapOpt \begin_layout Standard For -\begin_inset Formula $f^{A\Rightarrow1+B}$ +\begin_inset Formula $f^{A\rightarrow1+B}$ \end_inset , get \size footnotesize -\begin_inset Formula $\text{fmapOpt}_{F}(f):F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $\text{fmapOpt}_{F}(f):F^{A}\rightarrow F^{B}$ \end_inset @@ -10528,7 +10526,7 @@ For and \size footnotesize -\begin_inset Formula $\text{fmapOpt}_{G}(f):G^{A}\Rightarrow G^{B}$ +\begin_inset Formula $\text{fmapOpt}_{G}(f):G^{A}\rightarrow G^{B}$ \end_inset @@ -10538,7 +10536,7 @@ and Define \size footnotesize -\begin_inset Formula $\text{fmapOpt}_{F\times G}f\equiv p^{F^{A}}\times q^{G^{A}}\Rightarrow\text{fmapOpt}_{F}(f)(p)\times\text{fmapOpt}_{G}(f)(q)$ +\begin_inset Formula $\text{fmapOpt}_{F\times G}f\equiv p^{F^{A}}\times q^{G^{A}}\rightarrow\text{fmapOpt}_{F}(f)(p)\times\text{fmapOpt}_{G}(f)(q)$ \end_inset @@ -10653,13 +10651,13 @@ fmapOpt \begin_layout Standard For -\begin_inset Formula $f^{A\Rightarrow1+B}$ +\begin_inset Formula $f^{A\rightarrow1+B}$ \end_inset , get \size footnotesize -\begin_inset Formula $\text{fmapOpt}_{G}(f):G^{A}\Rightarrow G^{B}$ +\begin_inset Formula $\text{fmapOpt}_{G}(f):G^{A}\rightarrow G^{B}$ \end_inset @@ -10809,15 +10807,15 @@ fmapOpt \size footnotesize For -\begin_inset Formula $f^{A\Rightarrow1+B}$ +\begin_inset Formula $f^{A\rightarrow1+B}$ \end_inset , we have -\begin_inset Formula $\text{fmapOpt}_{G}(f):G^{A}\Rightarrow G^{B}$ +\begin_inset Formula $\text{fmapOpt}_{G}(f):G^{A}\rightarrow G^{B}$ \end_inset and -\begin_inset Formula $\text{fmapOpt}_{F}^{\prime}(f):F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $\text{fmapOpt}_{F}^{\prime}(f):F^{A}\rightarrow F^{B}$ \end_inset (for use in recursive arguments as the inductive assumption) @@ -11020,7 +11018,7 @@ Worked examples II: Constructions of filterable functors IV Use known filterable constructions to show that \size footnotesize -\begin_inset Formula $F^{A}\equiv(\text{Int}\times\text{String})\Rightarrow\left(1+\text{Int}\times A+A\times\left(1+A\right)+\left(\text{Int}\Rightarrow1+A+A\times A\times\text{String}\right)\right)$ +\begin_inset Formula $F^{A}\equiv(\text{Int}\times\text{String})\rightarrow\left(1+\text{Int}\times A+A\times\left(1+A\right)+\left(\text{Int}\rightarrow1+A+A\times A\times\text{String}\right)\right)$ \end_inset @@ -11050,11 +11048,11 @@ Define some auxiliary functors that are parts of the structure of \end_layout \begin_layout Standard -\begin_inset Formula $R_{1}^{A}=\left(\text{Int}\times\text{String}\right)\Rightarrow A$ +\begin_inset Formula $R_{1}^{A}=\left(\text{Int}\times\text{String}\right)\rightarrow A$ \end_inset and -\begin_inset Formula $R_{2}^{A}=\text{Int}\Rightarrow A$ +\begin_inset Formula $R_{2}^{A}=\text{Int}\rightarrow A$ \end_inset @@ -11216,7 +11214,7 @@ For \size footnotesize \color blue type F[T] = Option[Int -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Option[(T, T)]] @@ -11299,7 +11297,7 @@ Show that \begin_layout Standard Show that the functor -\begin_inset Formula $F^{A}=A+\left(\text{Int}\Rightarrow A\right)$ +\begin_inset Formula $F^{A}=A+\left(\text{Int}\rightarrow A\right)$ \end_inset is not filterable. @@ -11315,7 +11313,7 @@ deflate \size default \color inherit -\begin_inset Formula $:C^{1+A}\Rightarrow C^{A}$ +\begin_inset Formula $:C^{1+A}\rightarrow C^{A}$ \end_inset for any contrafunctor @@ -11331,7 +11329,7 @@ inflate \size default \color inherit -\begin_inset Formula $:F^{A}\Rightarrow F^{1+A}$ +\begin_inset Formula $:F^{A}\rightarrow F^{1+A}$ \end_inset for any functor @@ -11369,7 +11367,7 @@ When a contrafunctor with \size footnotesize -\begin_inset Formula $\text{contrafmap}:\left(B\Rightarrow A\right)\Rightarrow C^{A}\Rightarrow C^{B}$ +\begin_inset Formula $\text{contrafmap}:\left(B\rightarrow A\right)\rightarrow C^{A}\rightarrow C^{B}$ \end_inset @@ -11394,7 +11392,7 @@ withFilter \family default \color inherit -\begin_inset Formula $:\left(A\Rightarrow\text{Boolean}\right)\Rightarrow C^{A}\Rightarrow C^{A}$ +\begin_inset Formula $:\left(A\rightarrow\text{Boolean}\right)\rightarrow C^{A}\rightarrow C^{A}$ \end_inset @@ -11411,7 +11409,7 @@ inflate \family default \color inherit -\begin_inset Formula $:C^{A}\Rightarrow C^{1+A}$ +\begin_inset Formula $:C^{A}\rightarrow C^{1+A}$ \end_inset @@ -11424,7 +11422,7 @@ contrafmapOpt \family default \color inherit -\begin_inset Formula $:\left(B\Rightarrow1+A\right)\Rightarrow C^{A}\Rightarrow C^{B}$ +\begin_inset Formula $:\left(B\rightarrow1+A\right)\rightarrow C^{A}\rightarrow C^{B}$ \end_inset @@ -11437,7 +11435,7 @@ All three functions are computationally equivalent... \begin_layout Standard \size footnotesize -\begin_inset Formula $\text{filter}(p^{A\Rightarrow\text{Boolean}})=\text{inflate}^{C^{A}\Rightarrow C^{1+A}}\bef\text{contrafmap}(\text{bop}\,p)$ +\begin_inset Formula $\text{filter}(p^{A\rightarrow\text{Boolean}})=\text{inflate}^{C^{A}\rightarrow C^{1+A}}\bef\text{contrafmap}(\text{bop}\,p)$ \end_inset @@ -11446,7 +11444,7 @@ All three functions are computationally equivalent... \begin_layout Standard \size footnotesize -\begin_inset Formula $\text{inflate}^{C^{A}\Rightarrow C^{1+A}}=\text{contrafmap}\left(0+x^{A}\Rightarrow x\right)\bef\text{filter}\left(\_\Rightarrow\text{true}\right)$ +\begin_inset Formula $\text{inflate}^{C^{A}\rightarrow C^{1+A}}=\text{contrafmap}\left(0+x^{A}\rightarrow x\right)\bef\text{filter}\left(\_\rightarrow\text{true}\right)$ \end_inset @@ -11455,7 +11453,7 @@ All three functions are computationally equivalent... \begin_layout Standard \size footnotesize -\begin_inset Formula $\text{contrafmapOpt}\:f^{B\Rightarrow1+A}=\text{inflate}\bef\text{contrafmap}\,f$ +\begin_inset Formula $\text{contrafmapOpt}\:f^{B\rightarrow1+A}=\text{inflate}\bef\text{contrafmap}\,f$ \end_inset @@ -11464,7 +11462,7 @@ All three functions are computationally equivalent... \begin_layout Standard \size footnotesize -\begin_inset Formula $\text{inflate}=\text{contrafmapOpt}\,(\text{id}^{1+A\Rightarrow1+A})$ +\begin_inset Formula $\text{inflate}=\text{contrafmapOpt}\,(\text{id}^{1+A\rightarrow1+A})$ \end_inset @@ -11543,7 +11541,7 @@ Examples of filterable contrafunctors \end_layout \begin_layout Standard -\begin_inset Formula $C^{A}\equiv A\Rightarrow1+Z$ +\begin_inset Formula $C^{A}\equiv A\rightarrow1+Z$ \end_inset where @@ -11554,7 +11552,7 @@ Examples of filterable contrafunctors \end_layout \begin_layout Standard -\begin_inset Formula $C^{A}\equiv1+A\Rightarrow Z$ +\begin_inset Formula $C^{A}\equiv1+A\rightarrow Z$ \end_inset @@ -11565,7 +11563,7 @@ Examples of non-filterable contrafunctors \end_layout \begin_layout Standard -\begin_inset Formula $C^{A}\equiv A\times F^{A}\Rightarrow Z$ +\begin_inset Formula $C^{A}\equiv A\times F^{A}\rightarrow Z$ \end_inset – cannot implement @@ -11679,7 +11677,7 @@ Functor constructions (no need to check laws for these): \end_layout \begin_layout Standard -\begin_inset Formula $F^{A}\equiv G^{A}\Rightarrow H^{A}$ +\begin_inset Formula $F^{A}\equiv G^{A}\rightarrow H^{A}$ \end_inset if @@ -11708,7 +11706,7 @@ Special constructions: \end_layout \begin_layout Standard -\begin_inset Formula $F^{A}\equiv1+A\times G^{A}\Rightarrow H^{A}$ +\begin_inset Formula $F^{A}\equiv1+A\times G^{A}\rightarrow H^{A}$ \end_inset where @@ -11723,7 +11721,7 @@ Special constructions: \end_layout \begin_layout Standard -\begin_inset Formula $F^{A}\equiv A\times G^{A}\Rightarrow1+H^{A}$ +\begin_inset Formula $F^{A}\equiv A\times G^{A}\rightarrow1+H^{A}$ \end_inset if diff --git a/sofp-src/sofp-filterable.tex b/sofp-src/sofp-filterable.tex index 11a13dd00..5ce700bab 100644 --- a/sofp-src/sofp-filterable.tex +++ b/sofp-src/sofp-filterable.tex @@ -325,15 +325,15 @@ \subsection{Motivation for the laws of filtering} \begin{lstlisting} def if_p[A, B](p: A => Boolean)(f: A => B): A => B = x => p(x) match { case true => f(x) } \end{lstlisting} -This ``factory'' takes a predicate $p^{:A\Rightarrow\bbnum 2}$ -and a function $f^{:A\Rightarrow B}$, and returns a partial function -with the same signature, $A\Rightarrow B$, but defined only for values +This ``factory'' takes a predicate $p^{:A\rightarrow\bbnum 2}$ +and a function $f^{:A\rightarrow B}$, and returns a partial function +with the same signature, $A\rightarrow B$, but defined only for values $x$ for which $p(x)=\text{true}$. Let us denote that function for brevity by $f_{|p}$. Since the \lstinline!Boolean! type is equivalent to a disjunction of two named units, $\bbnum 2\cong\text{true}+\text{false}$, we can write the code notation for the function $f_{|p}$ as \[ -f_{|p}\triangleq x\Rightarrow p(x)\triangleright\,\begin{array}{|c||c|} +f_{|p}\triangleq x\rightarrow p(x)\triangleright\,\begin{array}{|c||c|} & B\\ \hline \text{true} & f(x)\\ \text{false} & \bbnum 0 @@ -381,23 +381,23 @@ \subsection{Motivation for the laws of filtering} function \lstinline!filter! (denoted $\text{filt}_{F}$) with type signature \[ -\text{filt}_{F}:(A\Rightarrow\bbnum 2)\Rightarrow F^{A}\Rightarrow F^{A}\quad. +\text{filt}_{F}:(A\rightarrow\bbnum 2)\rightarrow F^{A}\rightarrow F^{A}\quad. \] The laws are called the naturality, identity, composition, and partial function laws of filtering:\index{composition law!of filter@of \texttt{filter}}\index{naturality law!of filter@of \texttt{filter}}\index{identity law!of filter@of \texttt{filter}} \begin{align*} -{\color{greenunder}\text{naturality law of }\text{filt}_{F}:}\quad & f^{\uparrow F}\bef\text{filt}_{F}(p)=\text{filt}_{F}(f\bef p)\bef f^{\uparrow F}\quad\text{for any }f^{:A\Rightarrow B},~p^{:B\Rightarrow\bbnum 2}\quad.\\ -{\color{greenunder}\text{identity law of }\text{filt}_{F}:}\quad & \text{filt}_{F}(\_\Rightarrow\text{true})=\text{id}^{:F^{A}\Rightarrow F^{A}}\quad.\\ -{\color{greenunder}\text{composition law of }\text{filt}_{F}:}\quad & \text{filt}_{F}(p_{1})\bef\text{filt}_{F}(p_{2})=\text{filt}_{F}(x\Rightarrow p_{1}(x)\wedge p_{2}(x))\quad\text{for any }p_{1}^{:A\Rightarrow\bbnum 2},~p_{2}^{:A\Rightarrow\bbnum 2}\quad.\\ -{\color{greenunder}\text{partial function law of }\text{filt}_{F}:}\quad & \text{filt}_{F}(p)\bef f^{\uparrow F}=\text{filt}_{F}(p)\bef f_{|p}^{\uparrow F}\quad\text{for any }f^{:A\Rightarrow B},~p^{:A\Rightarrow\bbnum 2}\quad. +{\color{greenunder}\text{naturality law of }\text{filt}_{F}:}\quad & f^{\uparrow F}\bef\text{filt}_{F}(p)=\text{filt}_{F}(f\bef p)\bef f^{\uparrow F}\quad\text{for any }f^{:A\rightarrow B},~p^{:B\rightarrow\bbnum 2}\quad.\\ +{\color{greenunder}\text{identity law of }\text{filt}_{F}:}\quad & \text{filt}_{F}(\_\rightarrow\text{true})=\text{id}^{:F^{A}\rightarrow F^{A}}\quad.\\ +{\color{greenunder}\text{composition law of }\text{filt}_{F}:}\quad & \text{filt}_{F}(p_{1})\bef\text{filt}_{F}(p_{2})=\text{filt}_{F}(x\rightarrow p_{1}(x)\wedge p_{2}(x))\quad\text{for any }p_{1}^{:A\rightarrow\bbnum 2},~p_{2}^{:A\rightarrow\bbnum 2}\quad.\\ +{\color{greenunder}\text{partial function law of }\text{filt}_{F}:}\quad & \text{filt}_{F}(p)\bef f^{\uparrow F}=\text{filt}_{F}(p)\bef f_{|p}^{\uparrow F}\quad\text{for any }f^{:A\rightarrow B},~p^{:A\rightarrow\bbnum 2}\quad. \end{align*} A functor $F$ is \textbf{filterable} if there is a function $\text{filt}_{F}$ satisfying these four laws.\index{filterable functor} The following type diagram illustrates the naturality law of \lstinline!filter!: \[ -\xymatrix{\xyScaleY{2.0pc}\xyScaleX{8.0pc}F^{A}\ar[r]\sp(0.5){\text{filt}_{F}(f^{:A\Rightarrow B}\bef p^{:B\Rightarrow\bbnum 2})}\ar[d]\sb(0.45){(f^{:A\Rightarrow B})^{\uparrow F}} & F^{A}\ar[d]\sp(0.45){(f^{:A\Rightarrow B})^{\uparrow F}}\\ -F^{B}\ar[r]\sp(0.5){\text{filt}_{F}(p^{:B\Rightarrow\bbnum 2})} & F^{B} +\xymatrix{\xyScaleY{2.0pc}\xyScaleX{8.0pc}F^{A}\ar[r]\sp(0.5){\text{filt}_{F}(f^{:A\rightarrow B}\bef p^{:B\rightarrow\bbnum 2})}\ar[d]\sb(0.45){(f^{:A\rightarrow B})^{\uparrow F}} & F^{A}\ar[d]\sp(0.45){(f^{:A\rightarrow B})^{\uparrow F}}\\ +F^{B}\ar[r]\sp(0.5){\text{filt}_{F}(p^{:B\rightarrow\bbnum 2})} & F^{B} } \] @@ -525,10 +525,10 @@ \subsection{Examples of non-filterable functors} \end{lstlisting} This is the only possible implementation of \lstinline!filter! for certain functors $F$, e.g.~the identity functor $F^{A}\triangleq A$ -or the exponential functor $F^{A}\triangleq E\Rightarrow A$. However, +or the exponential functor $F^{A}\triangleq E\rightarrow A$. However, this implementation never removes any data and so will violate the partial function law if the functor $F^{A}$ wraps a value of type -$A$ that should not pass the filter. So, functors of the form $F^{A}\triangleq E\Rightarrow A$ +$A$ that should not pass the filter. So, functors of the form $F^{A}\triangleq E\rightarrow A$ (where $E$ is a fixed type) are not filterable. The functor $F^{A}\triangleq A\times(\bbnum 1+A)$ is not filterable @@ -616,8 +616,8 @@ \subsubsection{Example \label{subsec:filt-solved-example-1}\ref{subsec:filt-solv It remains to check that the filtering laws hold. The naturality law requires that the equation $f^{\uparrow F}\bef\text{filt}_{F}(p)=\text{filt}_{F}(f\bef p)\bef f^{\uparrow F}$ -must hold for any values $s^{:F^{A}}$, $f^{:A\Rightarrow B}$, and -$p^{:B\Rightarrow\bbnum 2}$. The code for \lstinline!fmap! is +must hold for any values $s^{:F^{A}}$, $f^{:A\rightarrow B}$, and +$p^{:B\rightarrow\bbnum 2}$. The code for \lstinline!fmap! is \begin{lstlisting} def fmap[A, B](f: A => B): F[A] => F[B] = { case None => None @@ -683,7 +683,7 @@ \subsubsection{Example \label{subsec:filt-solved-example-1}\ref{subsec:filt-solv can be interchanged with some modifications. The identity law holds because the code of \lstinline!filter! is -the identity function when $p\triangleq(\_\Rightarrow\text{true})$, +the identity function when $p\triangleq(\_\rightarrow\text{true})$, \begin{lstlisting} def filter[A](p: A => Boolean): F[A] => F[A] = { case None => None @@ -941,7 +941,7 @@ \subsubsection{Example \label{subsec:filt-solved-example-4}\ref{subsec:filt-solv \subsubsection{Example \label{subsec:filt-solved-example-5}\ref{subsec:filt-solved-example-5}} -Show that $C^{Z,A}\triangleq A\Rightarrow\bbnum 1+Z$ is a filterable +Show that $C^{Z,A}\triangleq A\rightarrow\bbnum 1+Z$ is a filterable contrafunctor with respect to the type parameter $A$ (no law checking). \subparagraph{Solution} @@ -983,7 +983,7 @@ \subsubsection{Exercise \label{subsec:filt-exercise-3}\ref{subsec:filt-exercise- where the functor \lstinline!List! already has the method \lstinline!.filter! defined in the standard library. -\textbf{(c)} $F^{P,Q,A}\triangleq(P\Rightarrow P)+(Q\Rightarrow Q)\times A\times A\times A\quad.$ +\textbf{(c)} $F^{P,Q,A}\triangleq(P\rightarrow P)+(Q\rightarrow Q)\times A\times A\times A\quad.$ \textbf{(d)} $F^{A}=\text{MyTree}^{A}$ defined recursively as $\text{MyTree}^{A}\triangleq\bbnum 1+A\times\text{MyTree}^{A}\times\text{MyTree}^{A}\quad.$ @@ -1011,7 +1011,7 @@ \subsubsection{Exercise \label{subsec:filt-exercise-4-2}\ref{subsec:filt-exercis \subsubsection{Exercise \label{subsec:filt-exercise-4}\ref{subsec:filt-exercise-4}} -Show that $C^{A}\triangleq A+A\times A\Rightarrow\bbnum 1+Z$ is a +Show that $C^{A}\triangleq A+A\times A\rightarrow\bbnum 1+Z$ is a filterable contrafunctor (no law checking). \begin{comment} @@ -2375,23 +2375,23 @@ \subsection{Filterable functors: The laws in depth I} Now use \texttt{\textcolor{blue}{\footnotesize{}filter}} to replace $A$ by $1$ in each item of type $1+A$ -Get $F^{1+A}$ from $F^{A}$ using $\text{inflate}:F^{A}\Rightarrow F^{1+A}=\text{fmap}\,(\text{Some}^{A\Rightarrow1+A})$ +Get $F^{1+A}$ from $F^{A}$ using $\text{inflate}:F^{A}\rightarrow F^{1+A}=\text{fmap}\,(\text{Some}^{A\rightarrow1+A})$ -Filter $F^{1+A}\Rightarrow F^{1+A}$ using $\text{fmap}\left(x^{1+A}\Rightarrow\text{filter}_{\text{Opt}}(p^{A\Rightarrow\text{Boolean}})(x)\right)$ +Filter $F^{1+A}\rightarrow F^{1+A}$ using $\text{fmap}\left(x^{1+A}\rightarrow\text{filter}_{\text{Opt}}(p^{A\rightarrow\text{Boolean}})(x)\right)$ \[ \text{filter}\,p:\xymatrix{\xyScaleX{5pc}F^{A}\ar[r]\sb(0.45){\text{inflate}} & F^{1+A}\ar[r]_{\text{fmap}\left(\text{filter}_{\text{Opt}}p\right)} & F^{1+A}\ar[r]\sb(0.55){\text{deflate}} & F^{A}} \] Doing (2) means \emph{defining} a function \texttt{\textcolor{blue}{\footnotesize{}deflate:\ F{[}Option{[}A{]}{]} -$\Rightarrow$ F{[}A{]}}} +$\rightarrow$ F{[}A{]}}} standard library already has \texttt{\textcolor{blue}{\footnotesize{}flatten{[}T{]}:\ Seq{[}Option{[}T{]}{]} -$\Rightarrow$ Seq{[}T{]}}} +$\rightarrow$ Seq{[}T{]}}} -Simplify{\footnotesize{} $\text{fmap}(\text{Some}^{A\Rightarrow1+A})\bef\text{fmap}\left(\text{filter}_{\text{Opt}}p\right)=\text{fmap}\left(\text{bop}\left(p\right)\right)$} -where we defined {\footnotesize{}$\text{{\color{blue}bop}}\left(p\right):\left(A\Rightarrow1+A\right)\equiv$} -\texttt{\textcolor{blue}{\footnotesize{}x $\Rightarrow$ Some(x).filter(p)}} +Simplify{\footnotesize{} $\text{fmap}(\text{Some}^{A\rightarrow1+A})\bef\text{fmap}\left(\text{filter}_{\text{Opt}}p\right)=\text{fmap}\left(\text{bop}\left(p\right)\right)$} +where we defined {\footnotesize{}$\text{{\color{blue}bop}}\left(p\right):\left(A\rightarrow1+A\right)\equiv$} +\texttt{\textcolor{blue}{\footnotesize{}x $\rightarrow$ Some(x).filter(p)}} In this way, express \texttt{\textcolor{blue}{\footnotesize{}filter}} through \texttt{\textcolor{blue}{\footnotesize{}deflate}} (see example @@ -2423,10 +2423,10 @@ \subsection{Filterable functors: Using \texttt{\textcolor{blue}{\footnotesize{}d =}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{} foa.filter(\_.nonEmpty).map(\_.get) -}}\textcolor{gray}{\footnotesize{}// \_.get is $0+x^{A}\Rightarrow x^{A}$}{\footnotesize\par} +}}\textcolor{gray}{\footnotesize{}// \_.get is $0+x^{A}\rightarrow x^{A}$}{\footnotesize\par} \textcolor{gray}{\footnotesize{}// for F = Seq, this would be foa.collect -\{ case Some(x) $\Rightarrow$ x \}}{\footnotesize\par} +\{ case Some(x) $\rightarrow$ x \}}{\footnotesize\par} \textcolor{gray}{\footnotesize{}// for arbitrary functor F we need to use the partial function, \_.get}{\footnotesize\par} @@ -2444,14 +2444,14 @@ \subsection{Filterable functors: Using \texttt{\textcolor{blue}{\footnotesize{}d $F^{A}=A+A\times A$. Write $F^{1+A}=1+A+(1+A)\times(1+A)$ -cannot map $F^{1+A}\Rightarrow F^{A}$ because we do not have $1\rightarrow A$ +cannot map $F^{1+A}\rightarrow F^{A}$ because we do not have $1\rightarrow A$ -$F^{A}=\text{Int}\Rightarrow A$. Write $F^{1+A}=\text{Int}\Rightarrow1+A$ +$F^{A}=\text{Int}\rightarrow A$. Write $F^{1+A}=\text{Int}\rightarrow1+A$ type signature of \texttt{\textcolor{blue}{\footnotesize{}deflate}} -would be $\left(\text{Int}\Rightarrow1+A\right)\Rightarrow\text{Int}\Rightarrow A$ +would be $\left(\text{Int}\rightarrow1+A\right)\rightarrow\text{Int}\rightarrow A$ -cannot map $F^{1+A}\Rightarrow F^{A}$ because we do not have $1+A\rightarrow A$ +cannot map $F^{1+A}\rightarrow F^{A}$ because we do not have $1+A\rightarrow A$ \texttt{\textcolor{blue}{\footnotesize{}deflate}} is easier to implement and to reason about @@ -2465,14 +2465,14 @@ \subsection{Filterable functors: Using \texttt{\textcolor{blue}{\footnotesize{}d Now, law 4 is satisfied \emph{automatically} if \texttt{\textcolor{blue}{\footnotesize{}filter}} is defined via \texttt{\textcolor{blue}{\footnotesize{}deflate}}! -Denote {\footnotesize{}$\psi_{p}^{F^{A}\Rightarrow F^{1+A}}\equiv\text{fmap}\left(\text{bop}\:p\right)$ +Denote {\footnotesize{}$\psi_{p}^{F^{A}\rightarrow F^{1+A}}\equiv\text{fmap}\left(\text{bop}\:p\right)$ for brevity, then $\text{filter}\,p=\psi_{p}\bef\text{deflate}$}{\footnotesize\par} -Law 4 then becomes: {\footnotesize{}$\psi_{p}\bef\text{deflate}\bef\text{fmap}\:f^{A\Rightarrow B}=\psi_{p}\bef\text{deflate}\bef\text{fmap}\:f_{|p}$ +Law 4 then becomes: {\footnotesize{}$\psi_{p}\bef\text{deflate}\bef\text{fmap}\:f^{A\rightarrow B}=\psi_{p}\bef\text{deflate}\bef\text{fmap}\:f_{|p}$ \[ -\xymatrix{\xyScaleY{0.1pc}\xyScaleX{3pc} & F^{1+A}\ar[r]\sp(0.5){\text{deflate}} & F^{A}\ar[rd]\sp(0.5){\text{ fmap}\:f^{A\Rightarrow B}}\\ +\xymatrix{\xyScaleY{0.1pc}\xyScaleX{3pc} & F^{1+A}\ar[r]\sp(0.5){\text{deflate}} & F^{A}\ar[rd]\sp(0.5){\text{ fmap}\:f^{A\rightarrow B}}\\ F^{A}\ar[ru]\sp(0.5){\psi_{p}}\ar[rd]\sb(0.5){\psi_{p}} & & & F^{B}\\ - & F^{1+A}\ar[r]\sb(0.5){\text{deflate}} & F^{A}\ar[ru]\sb(0.5){\text{fmap}\:f_{|p}^{A\Rightarrow B}} + & F^{1+A}\ar[r]\sb(0.5){\text{deflate}} & F^{A}\ar[ru]\sb(0.5){\text{fmap}\:f_{|p}^{A\rightarrow B}} } \] }{\footnotesize\par} @@ -2484,12 +2484,12 @@ \subsection{Filterable functors: Using \texttt{\textcolor{blue}{\footnotesize{}d {\footnotesize{} \[ -\text{fmap}\:f^{A\Rightarrow B}\bef\psi_{p}\bef\text{deflate}^{F,B}=\psi_{f\bef p}\bef\text{deflate}^{F,A}\bef\text{fmap}\:f^{A\Rightarrow B} +\text{fmap}\:f^{A\rightarrow B}\bef\psi_{p}\bef\text{deflate}^{F,B}=\psi_{f\bef p}\bef\text{deflate}^{F,A}\bef\text{fmap}\:f^{A\rightarrow B} \] \[ \xymatrix{\xyScaleY{0.1pc}\xyScaleX{3pc} & F^{B}\ar[r]\sp(0.5){\psi_{p}} & F^{1+B}\ar[rd]\sp(0.5){\text{ deflate}^{F,B}}\\ -F^{A}\ar[ru]\sp(0.5){\text{fmap}\:f^{A\Rightarrow B}}\ar[rd]\sb(0.5){\psi_{f\bef p}} & & & F^{B}\\ - & F^{1+A}\ar[r]\sb(0.5){\text{deflate}^{F,A}} & F^{A}\ar[ru]\sb(0.5){\text{fmap}\:f^{A\Rightarrow B}} +F^{A}\ar[ru]\sp(0.5){\text{fmap}\:f^{A\rightarrow B}}\ar[rd]\sb(0.5){\psi_{f\bef p}} & & & F^{B}\\ + & F^{1+A}\ar[r]\sb(0.5){\text{deflate}^{F,A}} & F^{A}\ar[ru]\sb(0.5){\text{fmap}\:f^{A\rightarrow B}} } \] Can we simplify $\text{fmap}\:f\bef\psi_{p}=\text{fmap}\:f\bef\text{fmap}\left(\text{bop}\,p\right)=\text{fmap}\left(f\bef\text{bop}\,p\right)$?}{\footnotesize\par} @@ -2497,11 +2497,11 @@ \subsection{Filterable functors: Using \texttt{\textcolor{blue}{\footnotesize{}d \paragraph{{*} Filterable functors: The laws in depth III} -{\footnotesize{}Have property: $f^{A\Rightarrow B}\bef\text{bop}\left(p^{B\Rightarrow\text{Boolean}}\right)=\text{bop}\left(f\bef p\right)\bef\text{fmap}^{\text{Opt}}\,f$ +{\footnotesize{}Have property: $f^{A\rightarrow B}\bef\text{bop}\left(p^{B\rightarrow\text{Boolean}}\right)=\text{bop}\left(f\bef p\right)\bef\text{fmap}^{\text{Opt}}\,f$ (see code) \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & B\ar[rd]\sp(0.5){\text{bop}\,p}\\ -A\ar[ru]\sp(0.5){f^{A\Rightarrow B}}\ar[rd]\sb(0.4){\text{bop}\left(f\bef p\right)\,} & & 1+B\\ +A\ar[ru]\sp(0.5){f^{A\rightarrow B}}\ar[rd]\sb(0.4){\text{bop}\left(f\bef p\right)\,} & & 1+B\\ & 1+A\ar[ru]\sb(0.6){\text{fmap}^{\text{Opt}}f} } \] @@ -2512,24 +2512,24 @@ \subsection{Filterable functors: Using \texttt{\textcolor{blue}{\footnotesize{}d Remove common prefix $\text{fmap}\left(\text{bop}\left(f\bef p\right)\right)\bef...$ from both sides: \[ -\text{fmap}\,(\text{fmap}^{\text{Opt}}f^{A\Rightarrow B})\bef\text{deflate}^{F,B}=\text{deflate}^{F,A}\bef\text{fmap}\,f^{A\Rightarrow B}\ \ -\text{ \textbf{law 1 for deflate}} +\text{fmap}\,(\text{fmap}^{\text{Opt}}f^{A\rightarrow B})\bef\text{deflate}^{F,B}=\text{deflate}^{F,A}\bef\text{fmap}\,f^{A\rightarrow B}\ \ -\text{ \textbf{law 1 for deflate}} \] \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{1+B}\ar[rd]\sp(0.5){\ \text{deflate}^{F,B}}\\ F^{1+A}\ar[ru]\sp(0.5){\text{fmap}\,(\text{fmap}\,f)\ }\ar[rd]\sb(0.5){\text{deflate}^{F,A}\,} & & F^{B}\\ - & F^{A}\ar[ru]\sb(0.5){\text{fmap\,}f^{A\Rightarrow B}} + & F^{A}\ar[ru]\sb(0.5){\text{fmap\,}f^{A\rightarrow B}} } \] }{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{}deflate}}{\footnotesize{}$:F^{1+A}\Rightarrow F^{A}$} +\texttt{\textcolor{blue}{\footnotesize{}deflate}}{\footnotesize{}$:F^{1+A}\rightarrow F^{A}$} is a \textbf{natural transformation} (has naturality law) Example:{\footnotesize{} $F^{A}=1+A\times A$}{\footnotesize\par} {\footnotesize{}$F^{1+A}=1+(1+A)\times(1+A)=1+1\times1+A\times1+1\times A+A\times A$}{\footnotesize\par} -{\footnotesize{}natural transformations map containers $G^{A}\Rightarrow H^{A}$ +{\footnotesize{}natural transformations map containers $G^{A}\rightarrow H^{A}$ by rearranging data in them}{\footnotesize\par} @@ -2537,17 +2537,17 @@ \subsection{Filterable functors: Using \texttt{\textcolor{blue}{\footnotesize{}d The naturality law for \texttt{\textcolor{blue}{\footnotesize{}deflate}}:{\footnotesize{} \[ -\text{fmap}\,(\text{fmap}^{\text{Opt}}f^{A\Rightarrow B})\bef\text{deflate}^{F,B}=\text{deflate}^{F,A}\bef\text{fmap}\,f^{A\Rightarrow B} +\text{fmap}\,(\text{fmap}^{\text{Opt}}f^{A\rightarrow B})\bef\text{deflate}^{F,B}=\text{deflate}^{F,A}\bef\text{fmap}\,f^{A\rightarrow B} \] }Law 4 expressed via \texttt{\textcolor{blue}{\footnotesize{}deflate}}:{\footnotesize{} \[ -\xymatrix{\xyScaleY{0.1pc}\xyScaleX{3pc} & F^{1+A}\ar[r]\sp(0.5){\text{deflate}} & F^{A}\ar[rd]\sp(0.5){\text{ fmap}\:f^{A\Rightarrow B}}\\ +\xymatrix{\xyScaleY{0.1pc}\xyScaleX{3pc} & F^{1+A}\ar[r]\sp(0.5){\text{deflate}} & F^{A}\ar[rd]\sp(0.5){\text{ fmap}\:f^{A\rightarrow B}}\\ F^{A}\ar[ru]\sp(0.5){\psi_{p}}\ar[rd]\sb(0.5){\psi_{p}} & & & F^{B}\\ - & F^{1+A}\ar[r]\sb(0.5){\text{deflate}} & F^{A}\ar[ru]\sb(0.5){\text{fmap}\:f_{|p}^{A\Rightarrow B}} + & F^{1+A}\ar[r]\sb(0.5){\text{deflate}} & F^{A}\ar[ru]\sb(0.5){\text{fmap}\:f_{|p}^{A\rightarrow B}} } \] \[ -\psi_{p}\bef\text{deflate}^{F,A}\bef\text{fmap}\:f^{A\Rightarrow B}=\psi_{p}\bef\text{deflate}^{F,A}\bef\text{fmap}\:f_{|p} +\psi_{p}\bef\text{deflate}^{F,A}\bef\text{fmap}\:f^{A\rightarrow B}=\psi_{p}\bef\text{deflate}^{F,A}\bef\text{fmap}\:f_{|p} \] }{\footnotesize\par} @@ -2561,10 +2561,10 @@ \subsection{Filterable functors: Using \texttt{\textcolor{blue}{\footnotesize{}d \end{align*} }{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{}x $\Rightarrow$ Some(x).filter(p).map(f)}}{\footnotesize\par} +\texttt{\textcolor{blue}{\footnotesize{}x $\rightarrow$ Some(x).filter(p).map(f)}}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{}x $\Rightarrow$ Some(x).filter(p).map -\{ case x if p(x) $\Rightarrow$ f(x) \}}}{\footnotesize\par} +\texttt{\textcolor{blue}{\footnotesize{}x $\rightarrow$ Some(x).filter(p).map +\{ case x if p(x) $\rightarrow$ f(x) \}}}{\footnotesize\par} These functions are equivalent because law 4 holds for \texttt{\textcolor{blue}{\footnotesize{}Option}}{\footnotesize\par} @@ -2574,17 +2574,17 @@ \subsection{Filterable functors: Using \texttt{\textcolor{blue}{\footnotesize{}d Maybe $\psi_{p}\bef\text{deflate}$ is easier to handle than \texttt{\textcolor{blue}{\footnotesize{}deflate}}? Let us define {\footnotesize{} \[ -\text{{\color{blue}fmapOpt}}^{F,A,B}(f^{A\Rightarrow1+B}):F^{A}\Rightarrow F^{B}=\text{fmap}\:f\bef\text{deflate}^{F,B} +\text{{\color{blue}fmapOpt}}^{F,A,B}(f^{A\rightarrow1+B}):F^{A}\rightarrow F^{B}=\text{fmap}\:f\bef\text{deflate}^{F,B} \] \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{1+B}\ar[rd]\sp(0.5){\ \text{deflate}^{F,B}}\\ -F^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\Rightarrow1+B}\ }\ar[rr]\sb(0.5){\text{fmapOpt}\:f^{A\Rightarrow1+B}\,} & & F^{B} +F^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\rightarrow1+B}\ }\ar[rr]\sb(0.5){\text{fmapOpt}\:f^{A\rightarrow1+B}\,} & & F^{B} } \] }{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}fmapOpt}} and \texttt{\textcolor{blue}{\footnotesize{}deflate}} -are \emph{equivalent}: {\footnotesize{}$\text{deflate}^{F,A}=\text{fmapOpt}^{F,1+A,A}(\text{id}^{1+A\Rightarrow1+A})$ }{\footnotesize\par} +are \emph{equivalent}: {\footnotesize{}$\text{deflate}^{F,A}=\text{fmapOpt}^{F,1+A,A}(\text{id}^{1+A\rightarrow1+A})$ }{\footnotesize\par} Express laws 1 \textendash{} 3 in terms of \texttt{\textcolor{blue}{\footnotesize{}fmapOpt}}: do they get simpler? @@ -2592,30 +2592,30 @@ \subsection{Filterable functors: Using \texttt{\textcolor{blue}{\footnotesize{}d Express \texttt{\textcolor{blue}{\footnotesize{}filter}} through \texttt{\textcolor{blue}{\footnotesize{}fmapOpt}}: {\footnotesize{}$\text{filter}\,p=\text{fmapOpt}^{F,A,A}\left(\text{bop}\,p\right)$}{\footnotesize\par} -Consider the expression needed for law 2: $x\Rightarrow p_{1}(x)\wedge p_{2}(x)$ +Consider the expression needed for law 2: $x\rightarrow p_{1}(x)\wedge p_{2}(x)$ -{\footnotesize{}$\text{bop}\left(x\Rightarrow p_{1}(x)\wedge p_{2}(x)\right)=x^{A}\Rightarrow\left(\text{bop}\,p_{1}\right)(x)\text{.flatMap}\left(\text{bop}\,p_{2}\right)$ +{\footnotesize{}$\text{bop}\left(x\rightarrow p_{1}(x)\wedge p_{2}(x)\right)=x^{A}\rightarrow\left(\text{bop}\,p_{1}\right)(x)\text{.flatMap}\left(\text{bop}\,p_{2}\right)$ }\textendash{} see code Denote this computation by $\diamond_{\text{Opt}}$ and write{\footnotesize{} \[ -q_{1}^{A\Rightarrow1+B}\diamond_{\text{Opt}}q_{2}^{B\Rightarrow1+C}\equiv x^{A}\Rightarrow q_{1}(x).\text{flatMap}\left(q_{2}\right) +q_{1}^{A\rightarrow1+B}\diamond_{\text{Opt}}q_{2}^{B\rightarrow1+C}\equiv x^{A}\rightarrow q_{1}(x).\text{flatMap}\left(q_{2}\right) \] }{\footnotesize\par} -Similar to composition of functions, except the types are $A\Rightarrow1+B$ +Similar to composition of functions, except the types are $A\rightarrow1+B$ This is a particular case of \textbf{Kleisli composition}; the general -case: {\footnotesize{}$\diamond_{M}:(A\Rightarrow M^{B})\Rightarrow(B\Rightarrow M^{C})\Rightarrow(A\Rightarrow M^{C})$}; +case: {\footnotesize{}$\diamond_{M}:(A\rightarrow M^{B})\rightarrow(B\rightarrow M^{C})\rightarrow(A\rightarrow M^{C})$}; we set $M^{A}\equiv1+A$ -The \textbf{Kleisli identity} function: $\text{id}_{\diamond_{\text{Opt}}}^{A\Rightarrow1+A}\equiv x^{A}\Rightarrow\text{Some}\left(x\right)$ +The \textbf{Kleisli identity} function: $\text{id}_{\diamond_{\text{Opt}}}^{A\rightarrow1+A}\equiv x^{A}\rightarrow\text{Some}\left(x\right)$ Kleisli composition $\diamond_{\text{Opt}}$ is associative and respects the Kleisli identity! \texttt{\textcolor{blue}{\footnotesize{}fmapOpt}} lifts a Kleisli$_{\text{Opt}}$ -function $f^{A\Rightarrow1+B}$ into the functor $F$ +function $f^{A\rightarrow1+B}$ into the functor $F$ \paragraph{Filterable functors: The laws in depth VI} @@ -2626,17 +2626,17 @@ \subsection{Filterable functors: Using \texttt{\textcolor{blue}{\footnotesize{}d \textbf{Identity law} (covers old law 3): {\footnotesize{} \[ -\text{fmapOpt}\,(\text{id}_{\diamond_{\text{Opt}}}^{A\Rightarrow1+A})=\text{id}^{F^{A}\Rightarrow F^{A}} +\text{fmapOpt}\,(\text{id}_{\diamond_{\text{Opt}}}^{A\rightarrow1+A})=\text{id}^{F^{A}\rightarrow F^{A}} \] }{\footnotesize\par} \textbf{Composition law} (covers old laws 1 and 2): {\footnotesize{} \[ -\text{fmapOpt}\,(f^{A\Rightarrow1+B})\bef\text{fmapOpt}\,(g^{B\Rightarrow1+C})=\text{fmapOpt}\left(f\diamond_{\text{\textbf{Opt}}}g\right) +\text{fmapOpt}\,(f^{A\rightarrow1+B})\bef\text{fmapOpt}\,(g^{B\rightarrow1+C})=\text{fmapOpt}\left(f\diamond_{\text{\textbf{Opt}}}g\right) \] \[ -\xymatrix{\xyScaleY{2pc}\xyScaleX{3pc} & F^{B}\ar[rd]\sp(0.55){\ \text{fmapOpt}\,(g^{B\Rightarrow1+C})}\\ -F^{A}\ar[ru]\sp(0.45){\text{fmapOpt}\,(f^{A\Rightarrow1+B})\ }\ar[rr]\sb(0.5){\text{fmapOpt}\left(f\diamond_{\text{Opt}}g\right)} & & F^{C} +\xymatrix{\xyScaleY{2pc}\xyScaleX{3pc} & F^{B}\ar[rd]\sp(0.55){\ \text{fmapOpt}\,(g^{B\rightarrow1+C})}\\ +F^{A}\ar[ru]\sp(0.45){\text{fmapOpt}\,(f^{A\rightarrow1+B})\ }\ar[rr]\sb(0.5){\text{fmapOpt}\left(f\diamond_{\text{Opt}}g\right)} & & F^{C} } \] }{\footnotesize\par} @@ -2646,8 +2646,8 @@ \subsection{Filterable functors: Using \texttt{\textcolor{blue}{\footnotesize{}d Both of them use more complicated types than the old laws -Conceptually, the new laws are simpler (lift $f^{A\Rightarrow1+B}$ -into $F^{A}\Rightarrow F^{B}$) +Conceptually, the new laws are simpler (lift $f^{A\rightarrow1+B}$ +into $F^{A}\rightarrow F^{B}$) \paragraph{{*} Filterable functors: The laws in depth VII} @@ -2657,20 +2657,20 @@ \subsection{Filterable functors: Using \texttt{\textcolor{blue}{\footnotesize{}d Old law 3 is \emph{equivalent} to the identity law for \texttt{\textcolor{blue}{\footnotesize{}fmapOpt}}:{\footnotesize{} \[ -\text{filter}\,(x^{A}\Rightarrow\text{true})=\text{fmap}\,(x^{A}\Rightarrow0+x)\bef\text{deflate}=\text{fmapOpt}\,(\text{id}_{\diamond_{\text{Opt}}})=\text{id}^{F^{A}\Rightarrow F^{A}} +\text{filter}\,(x^{A}\rightarrow\text{true})=\text{fmap}\,(x^{A}\rightarrow0+x)\bef\text{deflate}=\text{fmapOpt}\,(\text{id}_{\diamond_{\text{Opt}}})=\text{id}^{F^{A}\rightarrow F^{A}} \] }{\footnotesize\par} -Derive old law 2: need to work with{\footnotesize{} $q_{1,2}\equiv\text{bop}\left(p_{1,2}\right):A\Rightarrow1+A$ }{\footnotesize\par} +Derive old law 2: need to work with{\footnotesize{} $q_{1,2}\equiv\text{bop}\left(p_{1,2}\right):A\rightarrow1+A$ }{\footnotesize\par} -The Boolean conjunction {\footnotesize{}$x\Rightarrow p_{1}(x)\wedge p_{2}(x)$ +The Boolean conjunction {\footnotesize{}$x\rightarrow p_{1}(x)\wedge p_{2}(x)$ }corresponds to {\footnotesize{}$q_{1}\diamond_{\text{\textbf{Opt}}}q_{2}$}{\footnotesize\par} -Apply the composition law to Kleisli functions of types {\footnotesize{}$A\Rightarrow1+A$ +Apply the composition law to Kleisli functions of types {\footnotesize{}$A\rightarrow1+A$ }:{\footnotesize{} \begin{align*} \text{filter}\,p_{1}\bef\text{filter}\,p_{2} & =\text{fmapOpt}\,q_{1}\bef\text{fmapOpt}\,q_{2}\\ -=\text{fmapOpt}\left(q_{1}\diamond_{\text{\textbf{Opt}}}q_{2}\right) & =\text{fmapOpt}\left(\text{bop}\left(x\Rightarrow p_{1}(x)\wedge p_{2}(x)\right)\right) +=\text{fmapOpt}\left(q_{1}\diamond_{\text{\textbf{Opt}}}q_{2}\right) & =\text{fmapOpt}\left(\text{bop}\left(x\rightarrow p_{1}(x)\wedge p_{2}(x)\right)\right) \end{align*} }{\footnotesize\par} @@ -2683,8 +2683,8 @@ \subsection{Filterable functors: Using \texttt{\textcolor{blue}{\footnotesize{}d \] }{\footnotesize\par} -lift $f^{A\Rightarrow B}$ to Kleisli$_{\text{Opt}}$ by defining -{\footnotesize{}$k_{f}^{A\Rightarrow1+B}=f\bef\text{id}_{\diamond_{\text{\textbf{Opt}}}}$;} +lift $f^{A\rightarrow B}$ to Kleisli$_{\text{Opt}}$ by defining +{\footnotesize{}$k_{f}^{A\rightarrow1+B}=f\bef\text{id}_{\diamond_{\text{\textbf{Opt}}}}$;} then we have $\text{fmapOpt}\left(k_{f}\right)=\text{fmap}\,k_{f}\bef\text{deflate}=\text{fmap}\:f\bef\text{fmap}\,\text{id}_{\diamond_{\text{\textbf{Opt}}}}\bef\text{deflate}=\text{fmap}\,f$ rewrite eq.\ ({*}) as {\footnotesize{}$\text{fmapOpt}\left(k_{f}\diamond_{\text{\textbf{Opt}}}\text{bop}\,p\right)=\text{fmapOpt}\left(\text{bop}\left(f\bef p\right)\diamond_{\text{\textbf{Opt}}}k_{f}\right)$ }{\footnotesize\par} @@ -2717,13 +2717,13 @@ \subsection{Summary: The methods and the laws} {*} Category theory accommodates this via a generalized definition of functors as liftings between ``twisted'' types. Compare: -$\text{fmap}:\left(A\Rightarrow B\right)\Rightarrow F^{A}\Rightarrow F^{B}$ +$\text{fmap}:\left(A\rightarrow B\right)\rightarrow F^{A}\rightarrow F^{B}$ \textendash{} ordinary container (``endofunctor'') -$\text{contrafmap}:\left(B\Rightarrow A\right)\Rightarrow F^{A}\Rightarrow F^{B}$ +$\text{contrafmap}:\left(B\rightarrow A\right)\rightarrow F^{A}\rightarrow F^{B}$ \textendash{} lifting from reversed functions -$\text{fmapOpt}:\left(A\Rightarrow1+B\right)\Rightarrow F^{A}\Rightarrow F^{B}$ +$\text{fmapOpt}:\left(A\rightarrow1+B\right)\rightarrow F^{A}\rightarrow F^{B}$ \textendash{} lifting from Kleisli$_{\text{Opt}}$-functions CT gives us some \emph{intuitions} about how to derive better laws: @@ -2774,9 +2774,9 @@ \subsection{Structure of filterable functors} Note: \emph{pointed} types $P$ are isomorphic to $1+Z$ for some type $Z$ -Example of non-trivial pointed type: $A\Rightarrow A$ +Example of non-trivial pointed type: $A\rightarrow A$ -Example of non-pointed type: $A\Rightarrow B$ when $A$ is different +Example of non-pointed type: $A\rightarrow B$ when $A$ is different from $B$ So $F^{A}\equiv P+A\times G^{A}$ where $P$ is a pointed type and @@ -2788,10 +2788,10 @@ \subsection{Structure of filterable functors} $F^{A}\equiv G^{A}+A\times F^{A}$ (recursive) for a filterable functor $G^{A}$ -$F^{A}\equiv G^{A}\Rightarrow H^{A}$ if\emph{ }contrafunctor $G^{A}$ +$F^{A}\equiv G^{A}\rightarrow H^{A}$ if\emph{ }contrafunctor $G^{A}$ and functor $H^{A}$ \emph{both} \emph{filterable} -Note: the functor $F^{A}\equiv G^{A}\Rightarrow A$ is not filterable +Note: the functor $F^{A}\equiv G^{A}\rightarrow A$ is not filterable \subsection{{*} Worked examples II: Constructions of filterable functors I} @@ -2799,10 +2799,10 @@ \subsection{{*} Worked examples II: Constructions of filterable functors I} (2) The \texttt{\textcolor{blue}{\footnotesize{}fmapOpt}} laws hold for $F^{A}\times G^{A}$ if they hold for $F^{A}$ and $G^{A}$ -For $f^{A\Rightarrow1+B}$, get {\footnotesize{}$\text{fmapOpt}_{F}(f):F^{A}\Rightarrow F^{B}$ -}and {\footnotesize{}$\text{fmapOpt}_{G}(f):G^{A}\Rightarrow G^{B}$}{\footnotesize\par} +For $f^{A\rightarrow1+B}$, get {\footnotesize{}$\text{fmapOpt}_{F}(f):F^{A}\rightarrow F^{B}$ +}and {\footnotesize{}$\text{fmapOpt}_{G}(f):G^{A}\rightarrow G^{B}$}{\footnotesize\par} -Define {\footnotesize{}$\text{fmapOpt}_{F\times G}f\equiv p^{F^{A}}\times q^{G^{A}}\Rightarrow\text{fmapOpt}_{F}(f)(p)\times\text{fmapOpt}_{G}(f)(q)$}{\footnotesize\par} +Define {\footnotesize{}$\text{fmapOpt}_{F\times G}f\equiv p^{F^{A}}\times q^{G^{A}}\rightarrow\text{fmapOpt}_{F}(f)(p)\times\text{fmapOpt}_{G}(f)(q)$}{\footnotesize\par} Identity law: $f=\text{id}_{\diamond_{\text{Opt}}}$, so {\footnotesize{}$\text{fmapOpt}_{F}f=\text{id}$} and {\footnotesize{}$\text{fmapOpt}_{G}f=\text{id}$}{\footnotesize\par} @@ -2834,7 +2834,7 @@ \subsection{{*} Worked examples II: Constructions of filterable functors I} (5) The \texttt{\textcolor{blue}{\footnotesize{}fmapOpt}} laws hold for $F^{A}\equiv1+A\times G^{A}$ if they hold for $G^{A}$ -For $f^{A\Rightarrow1+B}$, get {\footnotesize{}$\text{fmapOpt}_{G}(f):G^{A}\Rightarrow G^{B}$}{\footnotesize\par} +For $f^{A\rightarrow1+B}$, get {\footnotesize{}$\text{fmapOpt}_{G}(f):G^{A}\rightarrow G^{B}$}{\footnotesize\par} {\footnotesize{}Define $\text{fmapOpt}_{F}(f)(1+a^{A}\times q^{G^{A}})$ by returning $0+b\times\text{fmapOpt}_{G}(f)(q)$ if the argument @@ -2867,8 +2867,8 @@ \subsection{{*} Worked examples II: Constructions of filterable functors I} (6) The \texttt{\textcolor{blue}{\footnotesize{}fmapOpt}} laws hold for $F^{A}\equiv G^{A}+A\times F^{A}$ if they hold for $G^{A}$ -{\footnotesize{}For $f^{A\Rightarrow1+B}$, we have $\text{fmapOpt}_{G}(f):G^{A}\Rightarrow G^{B}$ -and $\text{fmapOpt}_{F}^{\prime}(f):F^{A}\Rightarrow F^{B}$ (for +{\footnotesize{}For $f^{A\rightarrow1+B}$, we have $\text{fmapOpt}_{G}(f):G^{A}\rightarrow G^{B}$ +and $\text{fmapOpt}_{F}^{\prime}(f):F^{A}\rightarrow F^{B}$ (for use in recursive arguments as the inductive assumption)}{\footnotesize\par} {\footnotesize{}Define $\text{fmapOpt}_{F}(f)(q^{G^{A}}+a^{A}\times p^{F^{A}})$ @@ -2906,7 +2906,7 @@ \subsection{{*} Worked examples II: Constructions of filterable functors I} \subsection{Worked examples II: Constructions of filterable functors IV} -Use known filterable constructions to show that{\footnotesize{} $F^{A}\equiv(\text{Int}\times\text{String})\Rightarrow\left(1+\text{Int}\times A+A\times\left(1+A\right)+\left(\text{Int}\Rightarrow1+A+A\times A\times\text{String}\right)\right)$ +Use known filterable constructions to show that{\footnotesize{} $F^{A}\equiv(\text{Int}\times\text{String})\rightarrow\left(1+\text{Int}\times A+A\times\left(1+A\right)+\left(\text{Int}\rightarrow1+A+A\times A\times\text{String}\right)\right)$ }is a filterable functor Instead of implementing \texttt{\textcolor{blue}{\footnotesize{}Filterable}} @@ -2916,8 +2916,8 @@ \subsection{Worked examples II: Constructions of filterable functors IV} Define some auxiliary functors that are parts of the structure of $F^{A}$, -$R_{1}^{A}=\left(\text{Int}\times\text{String}\right)\Rightarrow A$ -and $R_{2}^{A}=\text{Int}\Rightarrow A$ +$R_{1}^{A}=\left(\text{Int}\times\text{String}\right)\rightarrow A$ +and $R_{2}^{A}=\text{Int}\rightarrow A$ $G^{A}=1+\text{Int}\times A+A\times\left(1+A\right)$ and $H^{A}=1+A+A\times A\times\text{String}$ @@ -2951,7 +2951,7 @@ \subsection{{*} Exercises II} not tests). For \texttt{\textcolor{blue}{\footnotesize{}type F{[}T{]} = Option{[}Int -$\Rightarrow$ Option{[}(T, T){]}{]}}}, implement a \texttt{\textcolor{blue}{\footnotesize{}Filterable}} +$\rightarrow$ Option{[}(T, T){]}{]}}}, implement a \texttt{\textcolor{blue}{\footnotesize{}Filterable}} instance. Show that the filterable laws hold by using known filterable constructions (avoiding explicit proofs or tests). @@ -2967,12 +2967,12 @@ \subsection{{*} Exercises II} are filterable (even when $G^{A}$ and $H^{A}$ are by themselves not filterable). -Show that the functor $F^{A}=A+\left(\text{Int}\Rightarrow A\right)$ +Show that the functor $F^{A}=A+\left(\text{Int}\rightarrow A\right)$ is not filterable. -Show that one can define \texttt{\textcolor{blue}{\footnotesize{}deflate}}$:C^{1+A}\Rightarrow C^{A}$ +Show that one can define \texttt{\textcolor{blue}{\footnotesize{}deflate}}$:C^{1+A}\rightarrow C^{A}$ for any contrafunctor $C^{A}$ (not necessarily filterable), similarly -to how one can define \texttt{\textcolor{blue}{\footnotesize{}inflate}}$:F^{A}\Rightarrow F^{1+A}$ +to how one can define \texttt{\textcolor{blue}{\footnotesize{}inflate}}$:F^{A}\rightarrow F^{1+A}$ for any functor $F^{A}$ (not necessarily filterable). @@ -2980,24 +2980,24 @@ \subsection{{*} Bonus slide I: Definition of filterable contrafunctors} When is a contrafunctor filterable? -When a contrafunctor {\footnotesize{}$C^{A}$} with {\footnotesize{}$\text{contrafmap}:\left(B\Rightarrow A\right)\Rightarrow C^{A}\Rightarrow C^{B}$} +When a contrafunctor {\footnotesize{}$C^{A}$} with {\footnotesize{}$\text{contrafmap}:\left(B\rightarrow A\right)\rightarrow C^{A}\rightarrow C^{B}$} has also -\texttt{\textcolor{blue}{\footnotesize{}filter}}/\texttt{\textcolor{blue}{\footnotesize{}withFilter}}{\footnotesize{}$:\left(A\Rightarrow\text{Boolean}\right)\Rightarrow C^{A}\Rightarrow C^{A}$} +\texttt{\textcolor{blue}{\footnotesize{}filter}}/\texttt{\textcolor{blue}{\footnotesize{}withFilter}}{\footnotesize{}$:\left(A\rightarrow\text{Boolean}\right)\rightarrow C^{A}\rightarrow C^{A}$} \textendash{} same as for functors -\texttt{\textcolor{blue}{\footnotesize{}inflate}}{\footnotesize{}$:C^{A}\Rightarrow C^{1+A}$} -and \texttt{\textcolor{blue}{\footnotesize{}contrafmapOpt}}{\footnotesize{}$:\left(B\Rightarrow1+A\right)\Rightarrow C^{A}\Rightarrow C^{B}$}{\footnotesize\par} +\texttt{\textcolor{blue}{\footnotesize{}inflate}}{\footnotesize{}$:C^{A}\rightarrow C^{1+A}$} +and \texttt{\textcolor{blue}{\footnotesize{}contrafmapOpt}}{\footnotesize{}$:\left(B\rightarrow1+A\right)\rightarrow C^{A}\rightarrow C^{B}$}{\footnotesize\par} All three functions are computationally equivalent... -{\footnotesize{}$\text{filter}(p^{A\Rightarrow\text{Boolean}})=\text{inflate}^{C^{A}\Rightarrow C^{1+A}}\bef\text{contrafmap}(\text{bop}\,p)$}{\footnotesize\par} +{\footnotesize{}$\text{filter}(p^{A\rightarrow\text{Boolean}})=\text{inflate}^{C^{A}\rightarrow C^{1+A}}\bef\text{contrafmap}(\text{bop}\,p)$}{\footnotesize\par} -{\footnotesize{}$\text{inflate}^{C^{A}\Rightarrow C^{1+A}}=\text{contrafmap}\left(0+x^{A}\Rightarrow x\right)\bef\text{filter}\left(\_\Rightarrow\text{true}\right)$}{\footnotesize\par} +{\footnotesize{}$\text{inflate}^{C^{A}\rightarrow C^{1+A}}=\text{contrafmap}\left(0+x^{A}\rightarrow x\right)\bef\text{filter}\left(\_\rightarrow\text{true}\right)$}{\footnotesize\par} -{\footnotesize{}$\text{contrafmapOpt}\:f^{B\Rightarrow1+A}=\text{inflate}\bef\text{contrafmap}\,f$}{\footnotesize\par} +{\footnotesize{}$\text{contrafmapOpt}\:f^{B\rightarrow1+A}=\text{inflate}\bef\text{contrafmap}\,f$}{\footnotesize\par} -{\footnotesize{}$\text{inflate}=\text{contrafmapOpt}\,(\text{id}^{1+A\Rightarrow1+A})$}{\footnotesize\par} +{\footnotesize{}$\text{inflate}=\text{contrafmapOpt}\,(\text{id}^{1+A\rightarrow1+A})$}{\footnotesize\par} but have different laws @@ -3012,13 +3012,13 @@ \subsection{{*} Bonus slide I: Definition of filterable contrafunctors} Examples of filterable contrafunctors -$C^{A}\equiv A\Rightarrow1+Z$ where $Z$ is a fixed type +$C^{A}\equiv A\rightarrow1+Z$ where $Z$ is a fixed type -$C^{A}\equiv1+A\Rightarrow Z$ +$C^{A}\equiv1+A\rightarrow Z$ Examples of non-filterable contrafunctors -$C^{A}\equiv A\times F^{A}\Rightarrow Z$ \textendash{} cannot implement +$C^{A}\equiv A\times F^{A}\rightarrow Z$ \textendash{} cannot implement \texttt{\textcolor{blue}{\footnotesize{}inflate}} @@ -3046,15 +3046,15 @@ \subsection{{*} Bonus slide II: Structure of filterable contrafunctors} and $G^{A}$ any (contra)functor \textendash{} various combinations possible here -$F^{A}\equiv G^{A}\Rightarrow H^{A}$ if\emph{ }functor $G^{A}$ and +$F^{A}\equiv G^{A}\rightarrow H^{A}$ if\emph{ }functor $G^{A}$ and contrafunctor $H^{A}$ \emph{both} \emph{filterable} Special constructions: -$F^{A}\equiv1+A\times G^{A}\Rightarrow H^{A}$ where $G^{A}$ and +$F^{A}\equiv1+A\times G^{A}\rightarrow H^{A}$ where $G^{A}$ and $H^{A}$ are filterable -$F^{A}\equiv A\times G^{A}\Rightarrow1+H^{A}$ if $G^{A}$ and $H^{A}$ +$F^{A}\equiv A\times G^{A}\rightarrow1+H^{A}$ if $G^{A}$ and $H^{A}$ are filterable diff --git a/sofp-src/sofp-free-type.lyx b/sofp-src/sofp-free-type.lyx index 2fbacfaad..3999e3b34 100644 --- a/sofp-src/sofp-free-type.lyx +++ b/sofp-src/sofp-free-type.lyx @@ -109,9 +109,6 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} @@ -596,7 +593,7 @@ Bind( \size footnotesize \color blue { str -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset @@ -659,7 +656,7 @@ sealed trait Prg \size footnotesize \color blue case class Bind(p: Prg, f: String -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Prg) extends Prg @@ -777,7 +774,7 @@ sealed trait Prg[A] \size footnotesize \color blue case class Bind(p: Prg[String], f: String -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Prg[String]) @@ -846,7 +843,7 @@ val prg: Prg[String] = Bind( \size footnotesize \color blue { str: String -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset @@ -910,7 +907,7 @@ sealed trait Prg[A] \size footnotesize \color blue case class Bind(p: Prg[String], f: String -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Prg[String]) @@ -1026,7 +1023,7 @@ sealed trait Prg[A] \size footnotesize \color blue case class Bind[A, B](p: Prg[A], f: A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Prg[B]) extends Prg[B] @@ -1150,7 +1147,7 @@ sealed trait Prg[A] { \size footnotesize \color blue def flatMap[B](f: A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Prg[B]): Prg[B] = Bind(this, f) @@ -1162,7 +1159,7 @@ sealed trait Prg[A] { \size footnotesize \color blue def map[B](f: A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset B): Prg[B] = flatMap(this, f andThen Prg.pure) @@ -1332,7 +1329,7 @@ sealed trait Prg[A] { def flatMap ... \size footnotesize \color blue case class Bind[A, B](p: Prg[A], f: A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Prg[B]) extends Prg[B] @@ -1414,7 +1411,7 @@ type Prg[A] = DSL[F, A] \size footnotesize \color blue case class Bind[A, B](p: Prg[A], f: A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Prg[B]) extends Prg[B] @@ -1451,7 +1448,7 @@ value extractor \size footnotesize -\begin_inset Formula $\text{Ex}^{F}\equiv\forall A.\left(F^{A}\Rightarrow A\right)$ +\begin_inset Formula $\text{Ex}^{F}\equiv\forall A.\left(F^{A}\rightarrow A\right)$ \end_inset @@ -1523,7 +1520,7 @@ Either[Err, A] \begin_layout Standard Suppose we have a value extractor of type -\begin_inset Formula $\text{Ex}^{F}\equiv\forall A.\left(F^{A}\Rightarrow\text{Err}+A\right)$ +\begin_inset Formula $\text{Ex}^{F}\equiv\forall A.\left(F^{A}\rightarrow\text{Err}+A\right)$ \end_inset @@ -1585,7 +1582,7 @@ prg match { \family default \color darkgray // pure: A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Err + A @@ -1687,7 +1684,7 @@ Use and interpreter \size footnotesize -\begin_inset Formula $\text{run}^{M,A}:\left(\forall X.F^{X}\Rightarrow M^{X}\right)\Rightarrow\text{DSL}^{F,A}\Rightarrow M^{A}$ +\begin_inset Formula $\text{run}^{M,A}:\left(\forall X.F^{X}\rightarrow M^{X}\right)\rightarrow\text{DSL}^{F,A}\rightarrow M^{A}$ \end_inset @@ -1699,7 +1696,7 @@ Create a DSL program \end_inset and an extractor -\begin_inset Formula $\text{ex}^{X}:F^{X}\Rightarrow M^{X}$ +\begin_inset Formula $\text{ex}^{X}:F^{X}\rightarrow M^{X}$ \end_inset @@ -1736,11 +1733,11 @@ The interpreter pattern VIII. \begin_layout Standard Begin with a number of operations, which are typically functions of fixed known types such as -\begin_inset Formula $A_{1}\Rightarrow B_{1}$ +\begin_inset Formula $A_{1}\rightarrow B_{1}$ \end_inset , -\begin_inset Formula $A_{2}\Rightarrow B_{2}$ +\begin_inset Formula $A_{2}\rightarrow B_{2}$ \end_inset etc. @@ -1821,7 +1818,7 @@ M[A] \size footnotesize \color blue ex:F[A] -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset M[A] @@ -1865,7 +1862,7 @@ N[A] \size footnotesize \color blue M[A] -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset N[A] @@ -1924,7 +1921,7 @@ Consider the law \end_inset ; both functions -\begin_inset Formula $\text{DSL}^{F,A}\Rightarrow\text{DSL}^{F,A}$ +\begin_inset Formula $\text{DSL}^{F,A}\rightarrow\text{DSL}^{F,A}$ \end_inset @@ -1944,7 +1941,7 @@ Apply both sides to some \size footnotesize \color blue prg.flatMap(pure) == Bind(prg, a -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Literal(a)) @@ -1984,7 +1981,7 @@ After interpreting this program into a target monad \size footnotesize \color blue run(ex)(prg).flatMap((a -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Literal(a)) andThen run(ex)) @@ -1996,7 +1993,7 @@ run(ex)(prg).flatMap((a \size footnotesize \color blue == run(ex)(prg).flatMap(a -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset run(ex)(Literal(a)) @@ -2008,7 +2005,7 @@ run(ex)(prg).flatMap((a \size footnotesize \color blue == run(ex)(prg).flatMap(a -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset pure(a)) @@ -2871,15 +2868,15 @@ For a semigroup \end_inset and given -\begin_inset Formula $\text{Int}\Rightarrow S$ +\begin_inset Formula $\text{Int}\rightarrow S$ \end_inset and -\begin_inset Formula $\text{String}\Rightarrow S$ +\begin_inset Formula $\text{String}\rightarrow S$ \end_inset , map -\begin_inset Formula $\text{FSIS}\Rightarrow S$ +\begin_inset Formula $\text{FSIS}\rightarrow S$ \end_inset @@ -2915,11 +2912,11 @@ def |+|(x: FS[Z], y: FS[Z]): FS[Z] = Comb(x, y) \size footnotesize \color blue def run[S: Semigroup, Z](extract: Z -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset S): FS[Z] -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset S = { @@ -2931,7 +2928,7 @@ def run[S: Semigroup, Z](extract: Z \size footnotesize \color blue case Wrap(z) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset extract(z) @@ -2943,7 +2940,7 @@ def run[S: Semigroup, Z](extract: Z \size footnotesize \color blue case Comb(x, y) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset run(extract)(x) |+| run(extract)(y) @@ -3128,11 +3125,11 @@ For a monoid \end_inset and given -\begin_inset Formula $Z\Rightarrow M$ +\begin_inset Formula $Z\rightarrow M$ \end_inset , map -\begin_inset Formula $\text{FM}^{Z}\Rightarrow M$ +\begin_inset Formula $\text{FM}^{Z}\rightarrow M$ \end_inset @@ -3152,11 +3149,11 @@ def |+|(x: FM[Z], y: FM[Z]): FM[Z] = Comb(x, y) \size footnotesize \color blue def run[M: Monoid, Z](extract: Z -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset M): FM[Z] -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset M = { @@ -3168,7 +3165,7 @@ def run[M: Monoid, Z](extract: Z \size footnotesize \color blue case Empty() -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Monoid[M].empty @@ -3180,7 +3177,7 @@ def run[M: Monoid, Z](extract: Z \size footnotesize \color blue case Wrap(z) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset extract(z) @@ -3192,7 +3189,7 @@ def run[M: Monoid, Z](extract: Z \size footnotesize \color blue case Comb(x, y) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset run(extract)(x) |+| run(extract)(y) @@ -3270,11 +3267,11 @@ another \begin_layout Standard Given -\begin_inset Formula $Y\Rightarrow Z$ +\begin_inset Formula $Y\rightarrow Z$ \end_inset , can we map -\begin_inset Formula $\text{FS}^{Y}\Rightarrow\text{FS}^{Z}$ +\begin_inset Formula $\text{FS}^{Y}\rightarrow\text{FS}^{Z}$ \end_inset ? @@ -3282,7 +3279,7 @@ Given \begin_layout Standard Need to map -\begin_inset Formula $\text{FS}^{Y}\equiv Y+\text{FS}^{Y}\times\text{FS}^{Y}\Rightarrow Z+\text{FS}^{Z}\times\text{FS}^{Z}$ +\begin_inset Formula $\text{FS}^{Y}\equiv Y+\text{FS}^{Y}\times\text{FS}^{Y}\rightarrow Z+\text{FS}^{Z}\times\text{FS}^{Z}$ \end_inset @@ -3306,11 +3303,11 @@ This is straightforward since \size footnotesize \color blue def fmap[Y, Z](f: Y -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Z): FS[Y] -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset FS[Z] = { @@ -3322,7 +3319,7 @@ def fmap[Y, Z](f: Y \size footnotesize \color blue case Wrap(y) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Wrap(f(y)) @@ -3334,7 +3331,7 @@ def fmap[Y, Z](f: Y \size footnotesize \color blue case Comb(a, b) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Comb(fmap(f)(a), fmap(f)(b)) @@ -3358,7 +3355,7 @@ run \size default \color inherit to interpret -\begin_inset Formula $\text{FS}^{X}\Rightarrow\text{FS}^{Y}\Rightarrow\text{FS}^{Z}\Rightarrow S$ +\begin_inset Formula $\text{FS}^{X}\rightarrow\text{FS}^{Y}\rightarrow\text{FS}^{Z}\rightarrow S$ \end_inset , etc. @@ -3402,8 +3399,8 @@ fmap \begin_inset Formula \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & \text{FS}^{Y}\ar[rd]\sp(0.6){\ \text{run}^{S}g^{:Y\Rightarrow S}}\\ -\text{FS}^{X}\ar[ru]\sp(0.45){\text{fmap}\,f^{:X\Rightarrow Y}}\ar[rr]\sb(0.5){\text{run}^{S}(f\bef g)^{:X\Rightarrow S}} & & S +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & \text{FS}^{Y}\ar[rd]\sp(0.6){\ \text{run}^{S}g^{:Y\rightarrow S}}\\ +\text{FS}^{X}\ar[ru]\sp(0.45){\text{fmap}\,f^{:X\rightarrow Y}}\ar[rr]\sb(0.5){\text{run}^{S}(f\bef g)^{:X\rightarrow S}} & & S } \] @@ -3418,7 +3415,7 @@ Combine two free semigroups: \end_inset ; inject parts: -\begin_inset Formula $\text{FS}^{X}\Rightarrow\text{FS}^{X+Y}$ +\begin_inset Formula $\text{FS}^{X}\rightarrow\text{FS}^{X+Y}$ \end_inset @@ -3449,7 +3446,7 @@ extractors \end_inset -\begin_inset Formula $\text{ex}_{i}:Z\Rightarrow S_{i}$ +\begin_inset Formula $\text{ex}_{i}:Z\rightarrow S_{i}$ \end_inset @@ -3472,7 +3469,7 @@ Refactor extractors \size footnotesize \color darkgray // Typeclass ExZ[S] has a single method, extract: Z -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset S. @@ -3484,7 +3481,7 @@ Refactor extractors \size footnotesize \color blue implicit val exZ: ExZ[MySemigroup] = { z -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset ... @@ -3505,7 +3502,7 @@ def run[S: ExZ : Semigroup](fs: FS[Z]): S = fs match { \size footnotesize \color blue case Wrap(z) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset implicitly[ExZ[S]].extract(z) @@ -3517,7 +3514,7 @@ def run[S: ExZ : Semigroup](fs: FS[Z]): S = fs match { \size footnotesize \color blue case Comb(x, y) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset run(x) |+| run(y) @@ -3591,7 +3588,7 @@ x is \size footnotesize -\begin_inset Formula $\forall S.\left(Z\Rightarrow S\right)\times\left(S\times S\Rightarrow S\right)\Rightarrow S$ +\begin_inset Formula $\forall S.\left(Z\rightarrow S\right)\times\left(S\times S\rightarrow S\right)\rightarrow S$ \end_inset @@ -3601,7 +3598,7 @@ x \begin_inset Formula \[ -\forall S.\left(\left(Z+S\times S\right)\Rightarrow S\right)\Rightarrow S +\forall S.\left(\left(Z+S\times S\right)\rightarrow S\right)\rightarrow S \] \end_inset @@ -3633,7 +3630,7 @@ Church encoding The Church encoding is based on the theorem \size footnotesize -\begin_inset Formula $A\cong\forall X.\left(A\Rightarrow X\right)\Rightarrow X$ +\begin_inset Formula $A\cong\forall X.\left(A\rightarrow X\right)\rightarrow X$ \end_inset @@ -3647,7 +3644,7 @@ this resembles \emph default the type of the continuation monad, -\begin_inset Formula $\left(A\Rightarrow R\right)\Rightarrow R$ +\begin_inset Formula $\left(A\rightarrow R\right)\rightarrow R$ \end_inset @@ -3684,7 +3681,7 @@ Consider the Church encoding for the disjunction type The encoding is \size footnotesize -\begin_inset Formula $\forall X.\left(P+Q\Rightarrow X\right)\Rightarrow X\cong\forall X.\left(P\Rightarrow X\right)\Rightarrow\left(Q\Rightarrow X\right)\Rightarrow X$ +\begin_inset Formula $\forall X.\left(P+Q\rightarrow X\right)\rightarrow X\cong\forall X.\left(P\rightarrow X\right)\rightarrow\left(Q\rightarrow X\right)\rightarrow X$ \end_inset @@ -3696,11 +3693,11 @@ The encoding is \size footnotesize \color blue trait Disj[P, Q] { def run[X](cp: P -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset X)(cq: Q -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset X): X } @@ -3724,11 +3721,11 @@ def left[P, Q](p: P) = new Disj[P, Q] { \size footnotesize \color blue def run[X](cp: P -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset X)(cq: Q -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset X): X = cp(p) @@ -3760,11 +3757,11 @@ case \size footnotesize \color blue val result = disj.run {p -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset ...} {q -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset ...} @@ -3785,7 +3782,7 @@ General recipe for implementing the Church encoding: \color blue trait Blah { def run[X](cont: ... -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset X): X } @@ -3809,11 +3806,11 @@ Ex \size footnotesize \color blue trait Ex[X] { def cp: P -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset X; def cq: Q -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset X } @@ -3856,7 +3853,7 @@ Church encoding III: How it works \begin_layout Standard Why is the type -\begin_inset Formula $\text{Ch}^{A}\equiv\forall X.\left(A\Rightarrow X\right)\Rightarrow X$ +\begin_inset Formula $\text{Ch}^{A}\equiv\forall X.\left(A\rightarrow X\right)\rightarrow X$ \end_inset equivalent to the type @@ -3872,7 +3869,7 @@ Why is the type \size footnotesize \color blue trait Ch[A] { def run[X](cont: A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset X): X } @@ -3927,7 +3924,7 @@ def a2c[A](a: A): Ch[A] = new Ch[A] { \size footnotesize \color blue def run[X](cont: A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset X): X = cont(a) @@ -3959,7 +3956,7 @@ If we have a \size footnotesize \color blue def c2a[A](ch: Ch[A]): A = ch.run[A](a -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset a) @@ -3995,8 +3992,8 @@ status open \size footnotesize \begin_inset Formula \[ -\xymatrix{\xyScaleY{1pc}\xyScaleX{3pc}\text{id}:\left(A\Rightarrow A\right)\ar[r]\sp(0.65){\text{ch}.\text{run}^{A}}\ar[d]\sp(0.5){\text{fmap}_{\text{Reader}_{A}}\left(f\right)} & A\ar[d]\sp(0.45){f}\\ -f:\left(A\Rightarrow X\right)\ar[r]\sb(0.65){\text{ch}.\text{run}^{X}} & X +\xymatrix{\xyScaleY{1pc}\xyScaleX{3pc}\text{id}:\left(A\rightarrow A\right)\ar[r]\sp(0.65){\text{ch}.\text{run}^{A}}\ar[d]\sp(0.5){\text{fmap}_{\text{Reader}_{A}}\left(f\right)} & A\ar[d]\sp(0.45){f}\\ +f:\left(A\rightarrow X\right)\ar[r]\sb(0.65){\text{ch}.\text{run}^{X}} & X } \] @@ -4044,7 +4041,7 @@ To implement a value \end_inset given -\begin_inset Formula $f^{:A\Rightarrow X}$ +\begin_inset Formula $f^{:A\rightarrow X}$ \end_inset , for @@ -4084,7 +4081,7 @@ f: \end_inset A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset X @@ -4096,7 +4093,7 @@ X \size footnotesize \color blue ch.run(f) = a2c(c2a(ch)).run(f) = f(c2a(ch)) = f(ch.run(a -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset a)) @@ -4199,7 +4196,7 @@ fmap \size default \color inherit : -\begin_inset Formula $\left(Z\Rightarrow A\right)\Rightarrow F^{Z}\Rightarrow F^{A}$ +\begin_inset Formula $\left(Z\rightarrow A\right)\rightarrow F^{Z}\rightarrow F^{A}$ \end_inset @@ -4351,7 +4348,7 @@ QZ \size default \color inherit has type -\begin_inset Formula $\exists Z.\left(A\times Z\Rightarrow Q^{A}\right)$ +\begin_inset Formula $\exists Z.\left(A\times Z\rightarrow Q^{A}\right)$ \end_inset @@ -4390,7 +4387,7 @@ Encoding with an existential type: How it works \begin_layout Standard Show that -\begin_inset Formula $P^{A}\equiv\exists Z.Z\times\left(Z\Rightarrow A\right)\cong A$ +\begin_inset Formula $P^{A}\equiv\exists Z.Z\times\left(Z\rightarrow A\right)\cong A$ \end_inset @@ -4402,7 +4399,7 @@ Show that \size footnotesize \color blue sealed trait P[A]; case class PZ[A, Z](z: Z, f: Z -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset A) extends P[A] @@ -4422,7 +4419,7 @@ How to construct a value of type \begin_layout Standard Have a function -\begin_inset Formula $Z\Rightarrow A$ +\begin_inset Formula $Z\rightarrow A$ \end_inset and a @@ -4430,7 +4427,7 @@ Have a function \end_inset , construct -\begin_inset Formula $Z\times\left(Z\Rightarrow A\right)$ +\begin_inset Formula $Z\times\left(Z\rightarrow A\right)$ \end_inset @@ -4446,7 +4443,7 @@ Particular case: \end_inset and build -\begin_inset Formula $a\times\text{id}^{:A\Rightarrow A}$ +\begin_inset Formula $a\times\text{id}^{:A\rightarrow A}$ \end_inset @@ -4502,11 +4499,11 @@ Can \size footnotesize \color blue def p2a[A]: P[A] -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset A = { case PZ(z, f) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset f(z) } @@ -4590,7 +4587,7 @@ If \end_inset is a functor then -\begin_inset Formula $Q^{A}\equiv\exists Z.F^{Z}\times\left(Z\Rightarrow A\right)\cong F^{A}$ +\begin_inset Formula $Q^{A}\equiv\exists Z.F^{Z}\times\left(Z\rightarrow A\right)\cong F^{A}$ \end_inset @@ -4649,7 +4646,7 @@ FF \size default \color inherit has type -\begin_inset Formula $\text{FF}^{F^{\bullet},A}\equiv F^{A}+\exists Z.\text{FF}^{F^{\bullet},Z}\times\left(Z\Rightarrow A\right)$ +\begin_inset Formula $\text{FF}^{F^{\bullet},A}\equiv F^{A}+\exists Z.\text{FF}^{F^{\bullet},Z}\times\left(Z\rightarrow A\right)$ \end_inset @@ -4669,7 +4666,7 @@ A value of type \begin_inset Formula \[ -\exists Z_{1}.\exists Z_{2}...\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\Rightarrow Z_{n-1}\right)\times...\times\left(Z_{2}\Rightarrow Z_{1}\right)\times\left(Z_{1}\Rightarrow A\right) +\exists Z_{1}.\exists Z_{2}...\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\rightarrow Z_{n-1}\right)\times...\times\left(Z_{2}\rightarrow Z_{1}\right)\times\left(Z_{1}\rightarrow A\right) \] \end_inset @@ -4679,11 +4676,11 @@ A value of type \begin_layout Standard The functions -\begin_inset Formula $Z_{1}\Rightarrow A$ +\begin_inset Formula $Z_{1}\rightarrow A$ \end_inset , -\begin_inset Formula $Z_{2}\Rightarrow Z_{1}$ +\begin_inset Formula $Z_{2}\rightarrow Z_{1}$ \end_inset , etc., must be composed associatively @@ -4691,7 +4688,7 @@ The functions \begin_layout Standard The equivalent type is -\begin_inset Formula $\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\Rightarrow A\right)$ +\begin_inset Formula $\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\rightarrow A\right)$ \end_inset @@ -4699,7 +4696,7 @@ The equivalent type is \begin_layout Standard Reduced encoding: -\begin_inset Formula $\text{FreeF}^{F^{\bullet},A}\equiv\exists Z.F^{Z}\times\left(Z\Rightarrow A\right)$ +\begin_inset Formula $\text{FreeF}^{F^{\bullet},A}\equiv\exists Z.F^{Z}\times\left(Z\rightarrow A\right)$ \end_inset @@ -4735,7 +4732,7 @@ If \end_inset is already a functor, can show -\begin_inset Formula $F^{A}\cong\exists Z.F^{Z}\times\left(Z\Rightarrow A\right)$ +\begin_inset Formula $F^{A}\cong\exists Z.F^{Z}\times\left(Z\rightarrow A\right)$ \end_inset @@ -4743,7 +4740,7 @@ If \begin_layout Standard Church encoding (starting from the tree encoding): -\begin_inset Formula $\text{FreeF}^{F^{\bullet},A}\equiv\forall P^{\bullet}.\left(\forall C.\big(F^{C}+\exists Z.P^{Z}\times\left(Z\Rightarrow C\right)\big)â†P^{C}\right)\Rightarrow P^{A}$ +\begin_inset Formula $\text{FreeF}^{F^{\bullet},A}\equiv\forall P^{\bullet}.\left(\forall C.\big(F^{C}+\exists Z.P^{Z}\times\left(Z\rightarrow C\right)\big)â†P^{C}\right)\rightarrow P^{A}$ \end_inset @@ -4751,7 +4748,7 @@ Church encoding (starting from the tree encoding): \begin_layout Standard The structure of the type expression: -\begin_inset Formula $\forall P^{\bullet}.\left(\forall C.(...)^{C}â†P^{C}\right)\Rightarrow P^{A}$ +\begin_inset Formula $\forall P^{\bullet}.\left(\forall C.(...)^{C}â†P^{C}\right)\rightarrow P^{A}$ \end_inset @@ -4800,7 +4797,7 @@ Consider the recursive type The Church encoding is \size footnotesize -\begin_inset Formula $\forall X.\left(\left(Z+X\times X\right)\Rightarrow X\right)\Rightarrow X$ +\begin_inset Formula $\forall X.\left(\left(Z+X\times X\right)\rightarrow X\right)\rightarrow X$ \end_inset @@ -4850,7 +4847,7 @@ The Church encoding of is \size footnotesize -\begin_inset Formula $\forall X.\left(S^{X}\Rightarrow X\right)\Rightarrow X$ +\begin_inset Formula $\forall X.\left(S^{X}\rightarrow X\right)\rightarrow X$ \end_inset @@ -4900,7 +4897,7 @@ P[_] The Church encoding is \size footnotesize -\begin_inset Formula $\text{Ch}^{P^{\bullet},A}=\forall F^{\bullet}.\left(\forall X.P^{X}\Rightarrow F^{X}\right)\Rightarrow F^{A}$ +\begin_inset Formula $\text{Ch}^{P^{\bullet},A}=\forall F^{\bullet}.\left(\forall X.P^{X}\rightarrow F^{X}\right)\rightarrow F^{A}$ \end_inset @@ -4908,7 +4905,7 @@ The Church encoding is \begin_layout Standard Note: -\begin_inset Formula $\forall X.P^{X}\Rightarrow F^{X}$ +\begin_inset Formula $\forall X.P^{X}\rightarrow F^{X}$ \end_inset or @@ -5014,7 +5011,7 @@ The Church encoding of is \size footnotesize -\begin_inset Formula $\text{Ch}^{P^{\bullet},A}=\forall F^{\bullet}.\big(S^{F^{\bullet}}â†F^{\bullet}\big)\Rightarrow F^{A}$ +\begin_inset Formula $\text{Ch}^{P^{\bullet},A}=\forall F^{\bullet}.\big(S^{F^{\bullet}}â†F^{\bullet}\big)\rightarrow F^{A}$ \end_inset @@ -5049,7 +5046,7 @@ Look at the Church encoding of the free semigroup: \begin_inset Formula \[ -\text{ChFS}^{Z}\equiv\forall X.\left(Z\Rightarrow X\right)\times\left(X\times X\Rightarrow X\right)\Rightarrow X +\text{ChFS}^{Z}\equiv\forall X.\left(Z\rightarrow X\right)\times\left(X\times X\rightarrow X\right)\rightarrow X \] \end_inset @@ -5073,7 +5070,7 @@ Semigroup typeclass, we will already have a value \size footnotesize -\begin_inset Formula $X\times X\Rightarrow X$ +\begin_inset Formula $X\times X\rightarrow X$ \end_inset @@ -5081,7 +5078,7 @@ Semigroup , so we can omit it: \size footnotesize -\begin_inset Formula $\text{ChFS}^{Z}=\forall X^{:\text{Semigroup}}.\left(Z\Rightarrow X\right)\Rightarrow X$ +\begin_inset Formula $\text{ChFS}^{Z}=\forall X^{:\text{Semigroup}}.\left(Z\rightarrow X\right)\rightarrow X$ \end_inset @@ -5119,7 +5116,7 @@ semigroup over \begin_layout Standard So the Church encoding is -\begin_inset Formula $\forall X.\big(\text{SemiG}^{X}\Rightarrow X\big)\Rightarrow X$ +\begin_inset Formula $\forall X.\big(\text{SemiG}^{X}\rightarrow X\big)\rightarrow X$ \end_inset @@ -5137,7 +5134,7 @@ Type class is defined by its operations \size footnotesize -\begin_inset Formula $C^{X}\Rightarrow X$ +\begin_inset Formula $C^{X}\rightarrow X$ \end_inset @@ -5191,7 +5188,7 @@ free \begin_layout Standard Church encoding is -\begin_inset Formula $\text{FreeC}^{Z}\equiv\forall X.\left(Z+C^{X}\Rightarrow X\right)\Rightarrow X$ +\begin_inset Formula $\text{FreeC}^{Z}\equiv\forall X.\left(Z+C^{X}\rightarrow X\right)\rightarrow X$ \end_inset @@ -5199,7 +5196,7 @@ Church encoding is \begin_layout Standard Equivalently, -\begin_inset Formula $\text{FreeC}^{Z}\equiv\forall X^{:C}.\left(Z\Rightarrow X\right)\Rightarrow X$ +\begin_inset Formula $\text{FreeC}^{Z}\equiv\forall X^{:C}.\left(Z\rightarrow X\right)\rightarrow X$ \end_inset @@ -5219,7 +5216,7 @@ running \begin_layout Standard Works similarly for type constructors: operations -\begin_inset Formula $C^{P^{\bullet},A}\Rightarrow P^{A}$ +\begin_inset Formula $C^{P^{\bullet},A}\rightarrow P^{A}$ \end_inset @@ -5235,7 +5232,7 @@ Free typeclass \end_inset is -\begin_inset Formula $\text{FreeC}^{F^{\bullet},A}\equiv\forall P^{\bullet:C}.\left(F^{\bullet}â†P^{\bullet}\right)\Rightarrow P^{A}$ +\begin_inset Formula $\text{FreeC}^{F^{\bullet},A}\equiv\forall P^{\bullet:C}.\left(F^{\bullet}â†P^{\bullet}\right)\rightarrow P^{A}$ \end_inset @@ -5436,7 +5433,7 @@ wrap[A] \size default \color inherit -\begin_inset Formula $:F^{A}\Rightarrow\text{FreeC}^{F,A}$ +\begin_inset Formula $:F^{A}\rightarrow\text{FreeC}^{F,A}$ \end_inset or @@ -5460,7 +5457,7 @@ run \size default \color inherit -\begin_inset Formula $:\left(F^{\bullet}\leadsto M^{\bullet}\right)\Rightarrow\text{FreeC}^{F,\bullet}â†M^{\bullet}$ +\begin_inset Formula $:\left(F^{\bullet}\leadsto M^{\bullet}\right)\rightarrow\text{FreeC}^{F,\bullet}â†M^{\bullet}$ \end_inset @@ -5557,7 +5554,7 @@ Assume that , ..., with type signatures \size footnotesize -\begin_inset Formula $m_{1}:Q_{1}^{P^{\bullet},A}\Rightarrow P^{A}$ +\begin_inset Formula $m_{1}:Q_{1}^{P^{\bullet},A}\rightarrow P^{A}$ \end_inset @@ -5565,7 +5562,7 @@ Assume that , \size footnotesize -\begin_inset Formula $m_{2}:Q_{2}^{P^{\bullet},A}\Rightarrow P^{A}$ +\begin_inset Formula $m_{2}:Q_{2}^{P^{\bullet},A}\rightarrow P^{A}$ \end_inset @@ -5704,7 +5701,7 @@ If a typeclass \end_inset is inductive with methods -\begin_inset Formula $C^{X}\Rightarrow X$ +\begin_inset Formula $C^{X}\rightarrow X$ \end_inset then: @@ -5752,7 +5749,7 @@ If \end_inset and -\begin_inset Formula $Z\Rightarrow P$ +\begin_inset Formula $Z\rightarrow P$ \end_inset also belong to typeclass @@ -5776,15 +5773,15 @@ but not necessarily \begin_layout Standard Proof: can implement -\begin_inset Formula $(C^{P}\Rightarrow P)\times(C^{Q}\Rightarrow Q)\Rightarrow C^{P\times Q}\Rightarrow P\times Q$ +\begin_inset Formula $(C^{P}\rightarrow P)\times(C^{Q}\rightarrow Q)\rightarrow C^{P\times Q}\rightarrow P\times Q$ \end_inset and -\begin_inset Formula $\left(C^{P}\Rightarrow P\right)\Rightarrow C^{Z\Rightarrow P}\Rightarrow Z\Rightarrow P$ +\begin_inset Formula $\left(C^{P}\rightarrow P\right)\rightarrow C^{Z\rightarrow P}\rightarrow Z\rightarrow P$ \end_inset , but cannot implement -\begin_inset Formula $\left(...\right)\Rightarrow P+Q$ +\begin_inset Formula $\left(...\right)\rightarrow P+Q$ \end_inset @@ -5796,7 +5793,7 @@ Analogous properties hold for type constructor typeclasses \begin_layout Standard Methods described as -\begin_inset Formula $C^{F^{\bullet},A}\Rightarrow F^{A}$ +\begin_inset Formula $C^{F^{\bullet},A}\rightarrow F^{A}$ \end_inset with type constructor parameter @@ -5836,11 +5833,11 @@ not ultimately returning \begin_layout Standard Example: a typeclass with methods -\begin_inset Formula $\text{pt}:A\Rightarrow P^{A}$ +\begin_inset Formula $\text{pt}:A\rightarrow P^{A}$ \end_inset and -\begin_inset Formula $\text{ex}:P^{A}\Rightarrow A$ +\begin_inset Formula $\text{ex}:P^{A}\rightarrow A$ \end_inset @@ -5852,7 +5849,7 @@ Such typeclasses are not inductive \begin_layout Standard Typeclasses with methods of the form -\begin_inset Formula $P^{A}\Rightarrow...$ +\begin_inset Formula $P^{A}\rightarrow...$ \end_inset are @@ -5873,7 +5870,7 @@ Worked example IV: Free contrafunctor \begin_layout Standard Method -\begin_inset Formula $\text{contramap}:C^{A}\times\left(B\Rightarrow A\right)\Rightarrow C^{B}$ +\begin_inset Formula $\text{contramap}:C^{A}\times\left(B\rightarrow A\right)\rightarrow C^{B}$ \end_inset @@ -5881,7 +5878,7 @@ Method \begin_layout Standard Tree encoding: -\begin_inset Formula $\text{FreeCF}^{F^{\bullet},B}\equiv F^{B}+\exists A.\text{FreeCF}^{F^{\bullet},A}\times\left(B\Rightarrow A\right)$ +\begin_inset Formula $\text{FreeCF}^{F^{\bullet},B}\equiv F^{B}+\exists A.\text{FreeCF}^{F^{\bullet},A}\times\left(B\rightarrow A\right)$ \end_inset @@ -5889,7 +5886,7 @@ Tree encoding: \begin_layout Standard Reduced encoding: -\begin_inset Formula $\text{FreeCF}^{F^{\bullet},B}\equiv\exists A.F^{A}\times\left(B\Rightarrow A\right)$ +\begin_inset Formula $\text{FreeCF}^{F^{\bullet},B}\equiv\exists A.F^{A}\times\left(B\rightarrow A\right)$ \end_inset @@ -5905,7 +5902,7 @@ A value of type \begin_inset Formula \[ -\exists Z_{1}.\exists Z_{2}...\exists Z_{n}.F^{Z_{1}}\times\left(B\Rightarrow Z_{n}\right)\times\left(Z_{n}\Rightarrow Z_{n-1}\right)\times...\times\left(Z_{2}\Rightarrow Z_{1}\right) +\exists Z_{1}.\exists Z_{2}...\exists Z_{n}.F^{Z_{1}}\times\left(B\rightarrow Z_{n}\right)\times\left(Z_{n}\rightarrow Z_{n-1}\right)\times...\times\left(Z_{2}\rightarrow Z_{1}\right) \] \end_inset @@ -5915,11 +5912,11 @@ A value of type \begin_layout Standard The functions -\begin_inset Formula $B\Rightarrow Z_{n}$ +\begin_inset Formula $B\rightarrow Z_{n}$ \end_inset , -\begin_inset Formula $Z_{n}\Rightarrow Z_{n-1}$ +\begin_inset Formula $Z_{n}\rightarrow Z_{n-1}$ \end_inset , etc., are composed associatively @@ -5927,7 +5924,7 @@ The functions \begin_layout Standard The equivalent type is -\begin_inset Formula $\exists Z_{1}.F^{Z_{1}}\times\left(B\Rightarrow Z_{1}\right)$ +\begin_inset Formula $\exists Z_{1}.F^{Z_{1}}\times\left(B\rightarrow Z_{1}\right)$ \end_inset @@ -5951,7 +5948,7 @@ interpret \end_inset into the contrafunctor -\begin_inset Formula $C^{A}\equiv A\Rightarrow\text{String}$ +\begin_inset Formula $C^{A}\equiv A\rightarrow\text{String}$ \end_inset @@ -5963,11 +5960,11 @@ interpret \size footnotesize \color blue def prefixLog[A](p: A): A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset String = a -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset p.toString + a.toString @@ -6008,7 +6005,7 @@ Over an arbitrary type constructor Pointed functor methods \size footnotesize -\begin_inset Formula $\text{pt}:A\Rightarrow P^{A}$ +\begin_inset Formula $\text{pt}:A\rightarrow P^{A}$ \end_inset @@ -6016,7 +6013,7 @@ Pointed functor methods and \size footnotesize -\begin_inset Formula $\text{map}:P^{A}\times\left(A\Rightarrow B\right)\Rightarrow P^{B}$ +\begin_inset Formula $\text{map}:P^{A}\times\left(A\rightarrow B\right)\rightarrow P^{B}$ \end_inset @@ -6026,7 +6023,7 @@ Pointed functor methods Tree encoding: \size footnotesize -\begin_inset Formula $\text{FreeP}^{F^{\bullet},A}\equiv A+F^{A}+\exists Z.\text{FreeP}^{F^{\bullet},Z}\times\left(Z\Rightarrow A\right)$ +\begin_inset Formula $\text{FreeP}^{F^{\bullet},A}\equiv A+F^{A}+\exists Z.\text{FreeP}^{F^{\bullet},Z}\times\left(Z\rightarrow A\right)$ \end_inset @@ -6046,7 +6043,7 @@ The tree encoding of a value \begin_inset Formula \[ -\exists Z_{1}.\exists Z_{2}...\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\Rightarrow Z_{n-1}\right)\times...\times\left(Z_{2}\Rightarrow Z_{1}\right)\times\left(Z_{1}\Rightarrow A\right) +\exists Z_{1}.\exists Z_{2}...\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\rightarrow Z_{n-1}\right)\times...\times\left(Z_{2}\rightarrow Z_{1}\right)\times\left(Z_{1}\rightarrow A\right) \] \end_inset @@ -6058,7 +6055,7 @@ or \begin_inset Formula \[ -\exists Z_{1}.\exists Z_{2}...\exists Z_{n}.Z_{n}\times\left(Z_{n}\Rightarrow Z_{n-1}\right)\times...\times\left(Z_{2}\Rightarrow Z_{1}\right)\times\left(Z_{1}\Rightarrow A\right) +\exists Z_{1}.\exists Z_{2}...\exists Z_{n}.Z_{n}\times\left(Z_{n}\rightarrow Z_{n-1}\right)\times...\times\left(Z_{2}\rightarrow Z_{1}\right)\times\left(Z_{1}\rightarrow A\right) \] \end_inset @@ -6068,7 +6065,7 @@ or \begin_layout Standard Compose all functions by associativity; one function -\begin_inset Formula $Z_{n}\Rightarrow A$ +\begin_inset Formula $Z_{n}\rightarrow A$ \end_inset remains @@ -6076,7 +6073,7 @@ Compose all functions by associativity; one function \begin_layout Standard The case -\begin_inset Formula $\exists Z_{n}.Z_{n}\times\left(Z_{n}\Rightarrow A\right)$ +\begin_inset Formula $\exists Z_{n}.Z_{n}\times\left(Z_{n}\rightarrow A\right)$ \end_inset is equivalent to just @@ -6090,7 +6087,7 @@ The case Reduced encoding: \size footnotesize -\begin_inset Formula $\text{FreeP}^{F^{\bullet},A}\equiv A+\exists Z.F^{Z}\times\left(Z\Rightarrow A\right)$ +\begin_inset Formula $\text{FreeP}^{F^{\bullet},A}\equiv A+\exists Z.F^{Z}\times\left(Z\rightarrow A\right)$ \end_inset , @@ -6177,8 +6174,8 @@ Worked example VI: Free filterable functor (See Chapter 6.) Methods: \begin_inset Formula \begin{align*} -\text{map} & :F^{A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow F^{B}\\ -\text{mapOpt} & :F^{A}\Rightarrow\left(A\Rightarrow1+B\right)\Rightarrow F^{B} +\text{map} & :F^{A}\rightarrow\left(A\rightarrow B\right)\rightarrow F^{B}\\ +\text{mapOpt} & :F^{A}\rightarrow\left(A\rightarrow1+B\right)\rightarrow F^{B} \end{align*} \end_inset @@ -6216,7 +6213,7 @@ mapOpt \begin_layout Standard Tree encoding: -\begin_inset Formula $\text{FreeFi}^{F^{\bullet},A}\equiv F^{A}+\exists Z.\text{FreeFi}^{F^{\bullet},Z}\times\left(Z\Rightarrow1+A\right)$ +\begin_inset Formula $\text{FreeFi}^{F^{\bullet},A}\equiv F^{A}+\exists Z.\text{FreeFi}^{F^{\bullet},Z}\times\left(Z\rightarrow1+A\right)$ \end_inset @@ -6229,7 +6226,7 @@ If is already a functor, can simplify the tree encoding using the identity -\begin_inset Formula $\exists Z.P^{Z}\times\left(Z\Rightarrow1+A\right)\cong P^{A}$ +\begin_inset Formula $\exists Z.P^{Z}\times\left(Z\rightarrow1+A\right)\cong P^{A}$ \end_inset and obtain @@ -6245,7 +6242,7 @@ If \begin_layout Standard Reduced encoding: -\begin_inset Formula $\text{FreeFi}^{F^{\bullet},A}\equiv\exists Z.F^{Z}\times\left(Z\Rightarrow1+A\right)$ +\begin_inset Formula $\text{FreeFi}^{F^{\bullet},A}\equiv\exists Z.F^{Z}\times\left(Z\rightarrow1+A\right)$ \end_inset , non-recursive @@ -6253,7 +6250,7 @@ Reduced encoding: \begin_layout Standard Derivation: -\begin_inset Formula $\exists Z_{1}...\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\Rightarrow1+Z_{n-1}\right)\times...\times\left(Z_{1}\Rightarrow1+A\right)$ +\begin_inset Formula $\exists Z_{1}...\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\rightarrow1+Z_{n-1}\right)\times...\times\left(Z_{1}\rightarrow1+A\right)$ \end_inset is simplified using the laws of @@ -6265,7 +6262,7 @@ mapOpt \size default \color inherit and Kleisli composition, and yields -\begin_inset Formula $\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\Rightarrow1+A\right)$ +\begin_inset Formula $\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\rightarrow1+A\right)$ \end_inset . @@ -6274,7 +6271,7 @@ mapOpt \end_inset as -\begin_inset Formula $\exists Z.F^{Z}\times\left(Z\Rightarrow0+Z\right)$ +\begin_inset Formula $\exists Z.F^{Z}\times\left(Z\rightarrow0+Z\right)$ \end_inset . @@ -6323,8 +6320,8 @@ Worked example VII: Free monad Methods: \begin_inset Formula \begin{align*} -\text{pure} & :A\Rightarrow F^{A}\\ -\text{flatMap} & :F^{A}\Rightarrow(A\Rightarrow F^{B})\Rightarrow F^{B} +\text{pure} & :A\rightarrow F^{A}\\ +\text{flatMap} & :F^{A}\rightarrow(A\rightarrow F^{B})\rightarrow F^{B} \end{align*} \end_inset @@ -6372,7 +6369,7 @@ flatMap Tree encoding: \size footnotesize -\begin_inset Formula $\text{FreeM}^{F^{\bullet},A}\equiv F^{A}+A+\exists Z.\text{FreeM}^{F^{\bullet},Z}\times\big(Z\Rightarrow\text{FreeM}^{F^{\bullet},A}\big)$ +\begin_inset Formula $\text{FreeM}^{F^{\bullet},A}\equiv F^{A}+A+\exists Z.\text{FreeM}^{F^{\bullet},Z}\times\big(Z\rightarrow\text{FreeM}^{F^{\bullet},A}\big)$ \end_inset @@ -6384,7 +6381,7 @@ Derivation of reduced encoding: \begin_layout Standard can simplify -\begin_inset Formula $A\times\big(A\Rightarrow\text{FreeM}^{F^{\bullet},B}\big)\cong\text{FreeM}^{F^{\bullet},B}$ +\begin_inset Formula $A\times\big(A\rightarrow\text{FreeM}^{F^{\bullet},B}\big)\cong\text{FreeM}^{F^{\bullet},B}$ \end_inset @@ -6392,11 +6389,11 @@ can simplify \begin_layout Standard use associativity to replace -\begin_inset Formula $\text{FreeM}^{A}\times(A\Rightarrow\text{FreeM}^{B})\times(B\Rightarrow\text{FreeM}^{C})$ +\begin_inset Formula $\text{FreeM}^{A}\times(A\rightarrow\text{FreeM}^{B})\times(B\rightarrow\text{FreeM}^{C})$ \end_inset by -\begin_inset Formula $\text{FreeM}^{A}\times\big(A\Rightarrow\text{FreeM}^{B}\times(B\Rightarrow\text{FreeM}^{C})\big)$ +\begin_inset Formula $\text{FreeM}^{A}\times\big(A\rightarrow\text{FreeM}^{B}\times(B\rightarrow\text{FreeM}^{C})\big)$ \end_inset @@ -6416,7 +6413,7 @@ therefore we can replace \begin_layout Standard Reduced encoding: -\begin_inset Formula $\text{FreeM}^{F^{\bullet},A}\equiv A+\exists Z.F^{Z}\times\big(Z\Rightarrow\text{FreeM}^{F^{\bullet},A}\big)$ +\begin_inset Formula $\text{FreeM}^{F^{\bullet},A}\equiv A+\exists Z.F^{Z}\times\big(Z\rightarrow\text{FreeM}^{F^{\bullet},A}\big)$ \end_inset @@ -6497,7 +6494,7 @@ Free monad over a pointed functor \begin_layout Standard start from half-reduced encoding -\begin_inset Formula $F^{A}+\exists Z.F^{Z}\times\big(Z\Rightarrow\text{FreeM}^{F^{\bullet},A}\big)$ +\begin_inset Formula $F^{A}+\exists Z.F^{Z}\times\big(Z\rightarrow\text{FreeM}^{F^{\bullet},A}\big)$ \end_inset @@ -6526,8 +6523,8 @@ Worked example VIII: Free applicative functor Methods: \begin_inset Formula \begin{align*} -\text{pure} & :A\Rightarrow F^{A}\\ -\text{ap} & :F^{A}\Rightarrow F^{A\Rightarrow B}\Rightarrow F^{B} +\text{pure} & :A\rightarrow F^{A}\\ +\text{ap} & :F^{A}\rightarrow F^{A\rightarrow B}\rightarrow F^{B} \end{align*} \end_inset @@ -6575,7 +6572,7 @@ map Tree encoding: \size footnotesize -\begin_inset Formula $\text{FreeAp}^{F^{\bullet},A}\equiv F^{A}+A+\exists Z.\text{FreeAp}^{F^{\bullet},Z}\times\text{FreeAp}^{F^{\bullet},Z\Rightarrow A}$ +\begin_inset Formula $\text{FreeAp}^{F^{\bullet},A}\equiv F^{A}+A+\exists Z.\text{FreeAp}^{F^{\bullet},Z}\times\text{FreeAp}^{F^{\bullet},Z\rightarrow A}$ \end_inset @@ -6585,7 +6582,7 @@ Tree encoding: Reduced encoding: \size footnotesize -\begin_inset Formula $\text{FreeAp}^{F^{\bullet},A}\equiv A+\exists Z.F^{Z}\times\text{FreeAp}^{F^{\bullet},Z\Rightarrow A}$ +\begin_inset Formula $\text{FreeAp}^{F^{\bullet},A}\equiv A+\exists Z.F^{Z}\times\text{FreeAp}^{F^{\bullet},Z\rightarrow A}$ \end_inset @@ -6597,19 +6594,19 @@ Derivation: a \end_inset is either -\begin_inset Formula $\exists Z_{1}...\exists Z_{n}.Z_{1}\times\text{FreeAp}^{Z_{1}\Rightarrow Z_{2}}\times...$ +\begin_inset Formula $\exists Z_{1}...\exists Z_{n}.Z_{1}\times\text{FreeAp}^{Z_{1}\rightarrow Z_{2}}\times...$ \end_inset or -\begin_inset Formula $\exists Z_{1}...\exists Z_{n}.F^{Z_{1}}\times\text{FreeAp}^{Z_{1}\Rightarrow Z_{2}}\times...$ +\begin_inset Formula $\exists Z_{1}...\exists Z_{n}.F^{Z_{1}}\times\text{FreeAp}^{Z_{1}\rightarrow Z_{2}}\times...$ \end_inset ; encode -\begin_inset Formula $Z_{1}\times\text{FreeAp}^{Z_{1}\Rightarrow Z_{2}}$ +\begin_inset Formula $Z_{1}\times\text{FreeAp}^{Z_{1}\rightarrow Z_{2}}$ \end_inset equivalently as -\begin_inset Formula $\text{FreeAp}^{Z_{1}\Rightarrow Z_{2}}\times\left(\left(Z_{1}\Rightarrow Z_{2}\right)\Rightarrow Z_{2}\right)$ +\begin_inset Formula $\text{FreeAp}^{Z_{1}\rightarrow Z_{2}}\times\left(\left(Z_{1}\rightarrow Z_{2}\right)\rightarrow Z_{2}\right)$ \end_inset using the identity law; so the first @@ -6632,7 +6629,7 @@ Free applicative over a functor \begin_inset Formula \begin{align*} \text{FreeAp}^{F^{\bullet},A} & \equiv A+\text{FreeZ}^{F^{\bullet},A}\\ -\text{FreeZ}^{F^{\bullet},A} & \equiv F^{A}+\exists Z.F^{Z}\times\text{FreeZ}^{F^{\bullet},Z\Rightarrow A} +\text{FreeZ}^{F^{\bullet},A} & \equiv F^{A}+\exists Z.F^{Z}\times\text{FreeZ}^{F^{\bullet},Z\rightarrow A} \end{align*} \end_inset @@ -6695,7 +6692,7 @@ Consider an inductive typeclass \end_inset with methods -\begin_inset Formula $C^{A}\Rightarrow A$ +\begin_inset Formula $C^{A}\rightarrow A$ \end_inset @@ -6732,7 +6729,7 @@ Define a free instance of \end_inset we can implement -\begin_inset Formula $C^{\text{FreeC}^{Z}}\Rightarrow\text{FreeC}^{Z}$ +\begin_inset Formula $C^{\text{FreeC}^{Z}}\rightarrow\text{FreeC}^{Z}$ \end_inset @@ -6749,7 +6746,7 @@ we can implement ; \size footnotesize -\begin_inset Formula $\text{fmap}_{\text{FreeC}}:\left(Y\Rightarrow Z\right)\Rightarrow\text{FreeC}^{Y}\Rightarrow\text{FreeC}^{Z}$ +\begin_inset Formula $\text{fmap}_{\text{FreeC}}:\left(Y\rightarrow Z\right)\rightarrow\text{FreeC}^{Y}\rightarrow\text{FreeC}^{Z}$ \end_inset @@ -6799,8 +6796,8 @@ For a \begin_inset Formula \begin{align*} -\text{run}^{P} & :\left(Z\Rightarrow P\right)\Rightarrow\text{FreeC}^{Z}\Rightarrow P\\ -\text{wrap} & :Z\Rightarrow\text{FreeC}^{Z} +\text{run}^{P} & :\left(Z\rightarrow P\right)\rightarrow\text{FreeC}^{Z}\rightarrow P\\ +\text{wrap} & :Z\rightarrow\text{FreeC}^{Z} \end{align*} \end_inset @@ -6834,8 +6831,8 @@ status open \size footnotesize \begin_inset Formula \[ -\xymatrix{\xyScaleY{1.5pc}\xyScaleX{5pc}\text{FreeC}^{Y}\ar[d]\sb(0.45){\text{fmap}\,f^{:Y\Rightarrow Z}}\ar[rd]\sp(0.65){\ \text{run}\left(f\bef g\right)}\\ -\text{FreeC}^{Z}\ar[r]\sp(0.5){\text{run}(g^{:Z\Rightarrow P})} & P +\xymatrix{\xyScaleY{1.5pc}\xyScaleX{5pc}\text{FreeC}^{Y}\ar[d]\sb(0.45){\text{fmap}\,f^{:Y\rightarrow Z}}\ar[rd]\sp(0.65){\ \text{run}\left(f\bef g\right)}\\ +\text{FreeC}^{Z}\ar[r]\sp(0.5){\text{run}(g^{:Z\rightarrow P})} & P } \] @@ -6885,11 +6882,11 @@ run \begin_layout Standard For any -\begin_inset Formula $P^{:C},Q^{:C},g^{:Z\Rightarrow P}$ +\begin_inset Formula $P^{:C},Q^{:C},g^{:Z\rightarrow P}$ \end_inset , and a typeclass-preserving -\begin_inset Formula $f^{:P\Rightarrow Q}$ +\begin_inset Formula $f^{:P\rightarrow Q}$ \end_inset , we have @@ -6905,8 +6902,8 @@ For any \begin_inset Formula \[ -\xymatrix{\xyScaleY{2.0pc}\xyScaleX{3pc}\text{FreeC}^{Z}\ar[d]\sb(0.4){\text{run}^{P}(g^{:Z\Rightarrow P})}\ar[rd]\sp(0.55){\quad\text{run}^{Q}(g\bef f)} & & & C^{P}\ar[d]\sb(0.4){\text{fmap}_{S}f}\ar[r]\sp(0.5){\text{ops}_{P}} & P\ar[d]\sb(0.4){f}\\ -P\ar[r]\sp(0.5){f^{:P\Rightarrow Q}} & Q & & C^{Q}\ar[r]\sp(0.5){\text{ops}_{Q}} & Q +\xymatrix{\xyScaleY{2.0pc}\xyScaleX{3pc}\text{FreeC}^{Z}\ar[d]\sb(0.4){\text{run}^{P}(g^{:Z\rightarrow P})}\ar[rd]\sp(0.55){\quad\text{run}^{Q}(g\bef f)} & & & C^{P}\ar[d]\sb(0.4){\text{fmap}_{S}f}\ar[r]\sp(0.5){\text{ops}_{P}} & P\ar[d]\sb(0.4){f}\\ +P\ar[r]\sp(0.5){f^{:P\rightarrow Q}} & Q & & C^{Q}\ar[r]\sp(0.5){\text{ops}_{Q}} & Q } \] @@ -6916,7 +6913,7 @@ P\ar[r]\sp(0.5){f^{:P\Rightarrow Q}} & Q & & C^{Q}\ar[r]\sp(0.5){\text{ops}_{Q} \end_layout \begin_layout Standard -\begin_inset Formula $f^{:P\Rightarrow Q}$ +\begin_inset Formula $f^{:P\rightarrow Q}$ \end_inset @@ -6951,7 +6948,7 @@ Consider \end_inset with methods -\begin_inset Formula $C^{X}\Rightarrow X$ +\begin_inset Formula $C^{X}\rightarrow X$ \end_inset @@ -7012,7 +7009,7 @@ Church encoding makes this easier to manage: \begin_layout Standard \size footnotesize -\begin_inset Formula $\text{FreeC}^{Z}\equiv\forall X.\left(Z\Rightarrow X\right)\times\big(C^{X}\Rightarrow X\big)\Rightarrow X$ +\begin_inset Formula $\text{FreeC}^{Z}\equiv\forall X.\left(Z\rightarrow X\right)\times\big(C^{X}\rightarrow X\big)\rightarrow X$ \end_inset @@ -7022,7 +7019,7 @@ Church encoding makes this easier to manage: \begin_inset Formula \[ -\text{FreeC}^{Z_{1}+Z_{2}}\equiv\forall X.\left(Z_{1}\Rightarrow X\right)\times\left(Z_{2}\Rightarrow X\right)\times\big(C^{X}\Rightarrow X\big)\Rightarrow X +\text{FreeC}^{Z_{1}+Z_{2}}\equiv\forall X.\left(Z_{1}\rightarrow X\right)\times\left(Z_{2}\rightarrow X\right)\times\big(C^{X}\rightarrow X\big)\rightarrow X \] \end_inset @@ -7032,7 +7029,7 @@ Church encoding makes this easier to manage: \begin_layout Standard Encode the functions -\begin_inset Formula $Z_{i}\Rightarrow X$ +\begin_inset Formula $Z_{i}\rightarrow X$ \end_inset via typeclasses @@ -7060,7 +7057,7 @@ ExZ1 \size default \color inherit has method -\begin_inset Formula $Z_{1}\Rightarrow X$ +\begin_inset Formula $Z_{1}\rightarrow X$ \end_inset , etc. @@ -7072,7 +7069,7 @@ Then \begin_inset Formula \[ -\text{FreeC}^{Z_{1}+Z_{2}}=\forall X^{:E_{Z_{1}}:E_{Z_{2}}}.\big(C^{X}\Rightarrow X\big)\Rightarrow X +\text{FreeC}^{Z_{1}+Z_{2}}=\forall X^{:E_{Z_{1}}:E_{Z_{2}}}.\big(C^{X}\rightarrow X\big)\rightarrow X \] \end_inset @@ -7185,7 +7182,7 @@ Option 2: use disjunction of method functors, \begin_layout Standard Church encoding: -\begin_inset Formula $\text{FreeC}_{12}^{Z}\equiv\forall X.\left(Z\Rightarrow X\right)\times\big(C_{1}^{X}+C_{2}^{X}\Rightarrow X\big)\Rightarrow X$ +\begin_inset Formula $\text{FreeC}_{12}^{Z}\equiv\forall X.\left(Z\rightarrow X\right)\times\big(C_{1}^{X}+C_{2}^{X}\rightarrow X\big)\rightarrow X$ \end_inset @@ -7334,7 +7331,7 @@ acts \end_inset via act -\begin_inset Formula $:L\Rightarrow P\Rightarrow P$ +\begin_inset Formula $:L\rightarrow P\rightarrow P$ \end_inset , with laws @@ -7365,7 +7362,7 @@ acts \begin_layout Standard Implement a monadic DSL with operations put -\begin_inset Formula $:A\Rightarrow1$ +\begin_inset Formula $:A\rightarrow1$ \end_inset and get @@ -7391,7 +7388,7 @@ Describe the monoid type class via a method functor \end_inset (such that the monoid's operations are combined into the type -\begin_inset Formula $S^{M}\Rightarrow M$ +\begin_inset Formula $S^{M}\rightarrow M$ \end_inset ). @@ -7412,15 +7409,15 @@ Assuming that \end_inset is a functor, define -\begin_inset Formula $Q^{A}\equiv\exists Z.F^{Z}\times\left(Z\Rightarrow A\right)$ +\begin_inset Formula $Q^{A}\equiv\exists Z.F^{Z}\times\left(Z\rightarrow A\right)$ \end_inset and implement f2q -\begin_inset Formula $:F^{A}\Rightarrow Q^{A}$ +\begin_inset Formula $:F^{A}\rightarrow Q^{A}$ \end_inset and q2f -\begin_inset Formula $:Q^{A}\Rightarrow F^{A}$ +\begin_inset Formula $:Q^{A}\rightarrow F^{A}$ \end_inset . @@ -7458,7 +7455,7 @@ Show: \end_inset ; -\begin_inset Formula $\forall A.\left(A\times A\times A\Rightarrow A\right)\cong1+1+1$ +\begin_inset Formula $\forall A.\left(A\times A\times A\rightarrow A\right)\cong1+1+1$ \end_inset . @@ -7516,7 +7513,7 @@ universal property \end_inset , however, this is not true; it is the right naturality property of -\begin_inset Formula $\text{run}^{P}:\left(Z\Rightarrow P\right)\Rightarrow\text{FreeC}^{Z}\Rightarrow P$ +\begin_inset Formula $\text{run}^{P}:\left(Z\rightarrow P\right)\rightarrow\text{FreeC}^{Z}\rightarrow P$ \end_inset with respect to the type parameter @@ -7529,7 +7526,7 @@ universal property \end_inset for any -\begin_inset Formula $f:Z\Rightarrow P$ +\begin_inset Formula $f:Z\rightarrow P$ \end_inset and any type diff --git a/sofp-src/sofp-free-type.tex b/sofp-src/sofp-free-type.tex index 9396d32be..188f096f8 100644 --- a/sofp-src/sofp-free-type.tex +++ b/sofp-src/sofp-free-type.tex @@ -94,7 +94,7 @@ \subsection{The interpreter pattern II. Variable binding} \textcolor{blue}{\footnotesize{}~~Read(Path(Literal(\textquotedbl /file\textquotedbl ))),}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}~~\{~str~$\Rightarrow$}\textcolor{darkgray}{\footnotesize{}~//~read~value~`str`}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}~~\{~str~$\rightarrow$}\textcolor{darkgray}{\footnotesize{}~//~read~value~`str`}{\footnotesize\par} \textcolor{blue}{\footnotesize{}~~~~if~(str.nonEmpty)}{\footnotesize\par} @@ -112,7 +112,7 @@ \subsection{The interpreter pattern II. Variable binding} \texttt{\textcolor{blue}{\footnotesize{}sealed trait Prg}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}case class Bind(p: Prg, f: String -$\Rightarrow$ Prg) extends Prg }}{\footnotesize\par} +$\rightarrow$ Prg) extends Prg }}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}case class Literal(s: String) extends Prg }}{\footnotesize\par} @@ -141,7 +141,7 @@ \subsection{The interpreter pattern III. Type safety} \texttt{\textcolor{blue}{\footnotesize{}sealed trait Prg{[}A{]}}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}case class Bind(p: Prg{[}String{]}, -f: String $\Rightarrow$ Prg{[}String{]})}}{\footnotesize\par} +f: String $\rightarrow$ Prg{[}String{]})}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{} extends Prg{[}String{]}}}{\footnotesize\par} @@ -163,7 +163,7 @@ \subsection{The interpreter pattern III. Type safety} \textcolor{blue}{\footnotesize{} Read(Path(Literal(\textquotedbl /file\textquotedbl ))),}{\footnotesize\par} -\textcolor{blue}{\footnotesize{} \{ str: String $\Rightarrow$}{\footnotesize\par} +\textcolor{blue}{\footnotesize{} \{ str: String $\rightarrow$}{\footnotesize\par} \textcolor{blue}{\footnotesize{} if (str.nonEmpty)}{\footnotesize\par} @@ -182,7 +182,7 @@ \subsection{The interpreter pattern IV. Cleaning up the DSL} \texttt{\textcolor{blue}{\footnotesize{}sealed trait Prg{[}A{]}}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}case class Bind(p: Prg{[}String{]}, -f: String $\Rightarrow$ Prg{[}String{]})}}{\footnotesize\par} +f: String $\rightarrow$ Prg{[}String{]})}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{} extends Prg{[}String{]}}}{\footnotesize\par} @@ -209,7 +209,7 @@ \subsection{The interpreter pattern IV. Cleaning up the DSL} \texttt{\textcolor{blue}{\footnotesize{}sealed trait Prg{[}A{]}}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}case class Bind{[}A, B{]}(p: Prg{[}A{]}, -f: A$\Rightarrow$Prg{[}B{]}) extends Prg{[}B{]}}}{\footnotesize\par} +f: A$\rightarrow$Prg{[}B{]}) extends Prg{[}B{]}}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}case class Literal{[}A{]}(a: A) extends Prg{[}A{]}}}{\footnotesize\par} @@ -233,9 +233,9 @@ \subsection{The interpreter pattern V. Define \texttt{Monad}-like methods} \texttt{\textcolor{blue}{\footnotesize{}sealed trait Prg{[}A{]} \{}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{} def flatMap{[}B{]}(f: A -$\Rightarrow$ Prg{[}B{]}): Prg{[}B{]} = Bind(this, f)}}{\footnotesize\par} +$\rightarrow$ Prg{[}B{]}): Prg{[}B{]} = Bind(this, f)}}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{} def map{[}B{]}(f: A $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{} def map{[}B{]}(f: A $\rightarrow$ B): Prg{[}B{]} = flatMap(this, f andThen Prg.pure)}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}\}}}{\footnotesize\par} @@ -284,7 +284,7 @@ \subsection{The interpreter pattern VI. Refactoring to an abstract DSL} changes}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}case class Bind{[}A, B{]}(p: Prg{[}A{]}, -f: A$\Rightarrow$Prg{[}B{]}) extends Prg{[}B{]}}}{\footnotesize\par} +f: A$\rightarrow$Prg{[}B{]}) extends Prg{[}B{]}}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}case class Literal{[}A{]}(a: A) extends Prg{[}A{]}}}{\footnotesize\par} @@ -311,7 +311,7 @@ \subsection{The interpreter pattern VI. Refactoring to an abstract DSL} A{]}}}\textcolor{darkgray}{\footnotesize{} // just for convenience}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}case class Bind{[}A, B{]}(p: Prg{[}A{]}, -f: A$\Rightarrow$Prg{[}B{]}) extends Prg{[}B{]}}}{\footnotesize\par} +f: A$\rightarrow$Prg{[}B{]}) extends Prg{[}B{]}}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}case class Literal{[}A{]}(a: A) extends Prg{[}A{]}}}{\footnotesize\par} @@ -320,7 +320,7 @@ \subsection{The interpreter pattern VI. Refactoring to an abstract DSL} extends Prg{[}A{]}}}\textcolor{darkgray}{\footnotesize{} // custom operations here}{\footnotesize\par} -Interpreter is parameterized by a ``value extractor'' {\footnotesize{}$\text{Ex}^{F}\equiv\forall A.\left(F^{A}\Rightarrow A\right)$}{\footnotesize\par} +Interpreter is parameterized by a ``value extractor'' {\footnotesize{}$\text{Ex}^{F}\equiv\forall A.\left(F^{A}\rightarrow A\right)$}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}def run{[}F{[}\_{]}, A{]}(ex: Ex{[}F{]})(prg: DSL{[}F, A{]}): A = ...}}{\footnotesize\par} @@ -334,7 +334,7 @@ \subsection{The interpreter pattern VII. Handling errors} To handle errors, we want to evaluate \texttt{\textcolor{blue}{\footnotesize{}DSL{[}F{[}\_{]}, A{]}}} to \texttt{\textcolor{blue}{\footnotesize{}Either{[}Err, A{]}}} -Suppose we have a value extractor of type $\text{Ex}^{F}\equiv\forall A.\left(F^{A}\Rightarrow\text{Err}+A\right)$ +Suppose we have a value extractor of type $\text{Ex}^{F}\equiv\forall A.\left(F^{A}\rightarrow\text{Err}+A\right)$ The code of the interpreter is almost unchanged: @@ -353,7 +353,7 @@ \subsection{The interpreter pattern VII. Handling errors} // Here, the .flatMap is from Either.}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{} case Literal(a) \ensuremath{\Rightarrow} -Right(a)}}\textcolor{darkgray}{\footnotesize{} // pure: A $\Rightarrow$ +Right(a)}}\textcolor{darkgray}{\footnotesize{} // pure: A $\rightarrow$ Err + A}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{} case Ops(f) \ensuremath{\Rightarrow} @@ -373,10 +373,10 @@ \subsection{The interpreter pattern VII. Handling errors} Start with an ``operations type constructor'' $F^{A}$ (often not a functor) -Use $\text{DSL}^{F,A}$ and interpreter {\footnotesize{}$\text{run}^{M,A}:\left(\forall X.F^{X}\Rightarrow M^{X}\right)\Rightarrow\text{DSL}^{F,A}\Rightarrow M^{A}$}{\footnotesize\par} +Use $\text{DSL}^{F,A}$ and interpreter {\footnotesize{}$\text{run}^{M,A}:\left(\forall X.F^{X}\rightarrow M^{X}\right)\rightarrow\text{DSL}^{F,A}\rightarrow M^{A}$}{\footnotesize\par} Create a DSL program $\text{prg}:\text{DSL}^{F,A}$ and an extractor -$\text{ex}^{X}:F^{X}\Rightarrow M^{X}$ +$\text{ex}^{X}:F^{X}\rightarrow M^{X}$ Run the program with the extractor: \texttt{\textcolor{blue}{\footnotesize{}run(ex)(prg)}}; get a value $M^{A}$ @@ -385,7 +385,7 @@ \subsection{The interpreter pattern VII. Handling errors} \subsection{The interpreter pattern VIII. Monadic DSLs: summary} Begin with a number of operations, which are typically functions of -fixed known types such as $A_{1}\Rightarrow B_{1}$, $A_{2}\Rightarrow B_{2}$ +fixed known types such as $A_{1}\rightarrow B_{1}$, $A_{2}\rightarrow B_{2}$ etc. Define a type constructor (typically not a functor) encapsulating @@ -404,7 +404,7 @@ \subsection{The interpreter pattern VIII. Monadic DSLs: summary} \texttt{\textcolor{blue}{\footnotesize{}prg:~DSL{[}F,A{]}}} Choose a target monad \texttt{\textcolor{blue}{\footnotesize{}M{[}A{]}}} -and implement an extractor \texttt{\textcolor{blue}{\footnotesize{}ex:F{[}A{]}$\Rightarrow$M{[}A{]}}} +and implement an extractor \texttt{\textcolor{blue}{\footnotesize{}ex:F{[}A{]}$\rightarrow$M{[}A{]}}} Run the program with the extractor, \texttt{\textcolor{blue}{\footnotesize{}val res:~M{[}A{]} = run(ex)(prg)}} @@ -413,7 +413,7 @@ \subsection{The interpreter pattern VIII. Monadic DSLs: summary} May choose another monad \texttt{\textcolor{blue}{\footnotesize{}N{[}A{]}}} and use interpreter \texttt{\textcolor{blue}{\footnotesize{}M{[}A{]} -$\Rightarrow$ N{[}A{]}}} +$\rightarrow$ N{[}A{]}}} E.g.~transform into another monadic DSL to optimize, test, etc. @@ -428,13 +428,13 @@ \subsection{Monad laws for DSL programs} Monad laws hold for DSL programs only after evaluating them Consider the law $\text{flm}\left(\text{pure}\right)=\text{id}$; -both functions $\text{DSL}^{F,A}\Rightarrow\text{DSL}^{F,A}$ +both functions $\text{DSL}^{F,A}\rightarrow\text{DSL}^{F,A}$ Apply both sides to some $\text{prg}:\text{DSL}^{F,A}$ and get the new value \texttt{\textcolor{blue}{\footnotesize{}prg.flatMap(pure) == Bind(prg, -a $\Rightarrow$ Literal(a))}}{\footnotesize\par} +a $\rightarrow$ Literal(a))}}{\footnotesize\par} This new value is \emph{not equal} to \texttt{\textcolor{blue}{\footnotesize{}prg}}, so this monad law fails! @@ -444,14 +444,14 @@ \subsection{Monad laws for DSL programs} After interpreting this program into a target monad $M^{A}$, the law holds: -\texttt{\textcolor{blue}{\footnotesize{}run(ex)(prg).flatMap((a $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{}run(ex)(prg).flatMap((a $\rightarrow$ Literal(a)) andThen run(ex)) }}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{} == run(ex)(prg).flatMap(a -$\Rightarrow$ run(ex)(Literal(a)) }}{\footnotesize\par} +$\rightarrow$ run(ex)(Literal(a)) }}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{} == run(ex)(prg).flatMap(a -$\Rightarrow$ pure(a))}}{\footnotesize\par} +$\rightarrow$ pure(a))}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{} == run(ex)(prg)}}{\footnotesize\par} @@ -561,8 +561,8 @@ \subsection{Worked example I: Free semigroup} Short type notation: $\text{FSIS}\equiv\text{Int}+\text{String}+\text{FSIS}\times\text{FSIS}$ -For a semigroup $S$ and given $\text{Int}\Rightarrow S$ and $\text{String}\Rightarrow S$, -map $\text{FSIS}\Rightarrow S$ +For a semigroup $S$ and given $\text{Int}\rightarrow S$ and $\text{String}\rightarrow S$, +map $\text{FSIS}\rightarrow S$ Simplify and generalize this construction by setting $Z=\text{Int}+\text{String}$ @@ -572,12 +572,12 @@ \subsection{Worked example I: Free semigroup} = Comb(x, y)}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}def run{[}S: Semigroup, Z{]}(extract: Z -$\Rightarrow$ S): FS{[}Z{]} $\Rightarrow$ S = \{}}{\footnotesize\par} +$\rightarrow$ S): FS{[}Z{]} $\rightarrow$ S = \{}}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{} case Wrap(z) $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{} case Wrap(z) $\rightarrow$ extract(z)}}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{} case Comb(x, y) $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{} case Comb(x, y) $\rightarrow$ run(extract)(x) |+| run(extract)(y)}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}\} }}\textcolor{darkgray}{\footnotesize{}// @@ -617,21 +617,21 @@ \subsection{Worked example II: Free monoid} Short type notation: $\text{FM}^{Z}\equiv1+Z+\text{FM}^{Z}\times\text{FM}^{Z}$ -For a monoid $M$ and given $Z\Rightarrow M$, map $\text{FM}^{Z}\Rightarrow M$ +For a monoid $M$ and given $Z\rightarrow M$, map $\text{FM}^{Z}\rightarrow M$ \texttt{\textcolor{blue}{\footnotesize{}def |+|(x: FM{[}Z{]}, y: FM{[}Z{]}): FM{[}Z{]} = Comb(x, y)}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}def run{[}M: Monoid, Z{]}(extract: Z -$\Rightarrow$ M): FM{[}Z{]} $\Rightarrow$ M = \{}}{\footnotesize\par} +$\rightarrow$ M): FM{[}Z{]} $\rightarrow$ M = \{}}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{} case Empty() $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{} case Empty() $\rightarrow$ Monoid{[}M{]}.empty}}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{} case Wrap(z) $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{} case Wrap(z) $\rightarrow$ extract(z)}}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{} case Comb(x, y) $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{} case Comb(x, y) $\rightarrow$ run(extract)(x) |+| run(extract)(y)}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}\} }}\textcolor{darkgray}{\footnotesize{}// @@ -650,25 +650,25 @@ \subsection{Mapping a free semigroup to different targets} What if we interpret $\text{FS}^{X}$ into \emph{another} free semigroup? -Given $Y\Rightarrow Z$, can we map $\text{FS}^{Y}\Rightarrow\text{FS}^{Z}$? +Given $Y\rightarrow Z$, can we map $\text{FS}^{Y}\rightarrow\text{FS}^{Z}$? -Need to map $\text{FS}^{Y}\equiv Y+\text{FS}^{Y}\times\text{FS}^{Y}\Rightarrow Z+\text{FS}^{Z}\times\text{FS}^{Z}$ +Need to map $\text{FS}^{Y}\equiv Y+\text{FS}^{Y}\times\text{FS}^{Y}\rightarrow Z+\text{FS}^{Z}\times\text{FS}^{Z}$ This is straightforward since $\text{FS}^{X}$ is a functor in $X$: -\texttt{\textcolor{blue}{\footnotesize{}def fmap{[}Y, Z{]}(f: Y $\Rightarrow$ -Z): FS{[}Y{]} $\Rightarrow$ FS{[}Z{]} = \{}}{\footnotesize\par} +\texttt{\textcolor{blue}{\footnotesize{}def fmap{[}Y, Z{]}(f: Y $\rightarrow$ +Z): FS{[}Y{]} $\rightarrow$ FS{[}Z{]} = \{}}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{} case Wrap(y) $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{} case Wrap(y) $\rightarrow$ Wrap(f(y))}}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{} case Comb(a, b) $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{} case Comb(a, b) $\rightarrow$ Comb(fmap(f)(a), fmap(f)(b))}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}\}}}{\footnotesize\par} Now we can use \texttt{\textcolor{blue}{\footnotesize{}run}} to interpret -$\text{FS}^{X}\Rightarrow\text{FS}^{Y}\Rightarrow\text{FS}^{Z}\Rightarrow S$, +$\text{FS}^{X}\rightarrow\text{FS}^{Y}\rightarrow\text{FS}^{Z}\rightarrow S$, etc. Functor laws hold for $\text{FS}^{X}$, so \texttt{\textcolor{blue}{\footnotesize{}fmap}} @@ -677,36 +677,36 @@ \subsection{Mapping a free semigroup to different targets} The ``interpreter'' commutes with \texttt{\textcolor{blue}{\footnotesize{}fmap}} as well (naturality law):{\footnotesize{} \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & \text{FS}^{Y}\ar[rd]\sp(0.6){\ \text{run}^{S}g^{:Y\Rightarrow S}}\\ -\text{FS}^{X}\ar[ru]\sp(0.45){\text{fmap}\,f^{:X\Rightarrow Y}}\ar[rr]\sb(0.5){\text{run}^{S}(f\bef g)^{:X\Rightarrow S}} & & S +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & \text{FS}^{Y}\ar[rd]\sp(0.6){\ \text{run}^{S}g^{:Y\rightarrow S}}\\ +\text{FS}^{X}\ar[ru]\sp(0.45){\text{fmap}\,f^{:X\rightarrow Y}}\ar[rr]\sb(0.5){\text{run}^{S}(f\bef g)^{:X\rightarrow S}} & & S } \] }{\footnotesize\par} -Combine two free semigroups: $\text{FS}^{X+Y}$; inject parts: $\text{FS}^{X}\Rightarrow\text{FS}^{X+Y}$ +Combine two free semigroups: $\text{FS}^{X+Y}$; inject parts: $\text{FS}^{X}\rightarrow\text{FS}^{X+Y}$ \subsection{Church encoding I: Motivation} Multiple target semigroups $S_{i}$ require many ``extractors'' -$\text{ex}_{i}:Z\Rightarrow S_{i}$ +$\text{ex}_{i}:Z\rightarrow S_{i}$ Refactor extractors $\text{ex}_{i}$ into evidence of a typeclass constraint on $S_{i}$ \textcolor{darkgray}{\footnotesize{}// Typeclass ExZ{[}S{]} has a -single method, extract: Z $\Rightarrow$ S.}{\footnotesize\par} +single method, extract: Z $\rightarrow$ S.}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}implicit val exZ: ExZ{[}MySemigroup{]} -= \{ z $\Rightarrow$ ... \}}}{\footnotesize\par} += \{ z $\rightarrow$ ... \}}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}def run{[}S: ExZ : Semigroup{]}(fs: FS{[}Z{]}): S = fs match \{}}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{} case Wrap(z) $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{} case Wrap(z) $\rightarrow$ implicitly{[}ExZ{[}S{]}{]}.extract(z)}}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{} case Comb(x, y) $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{} case Comb(x, y) $\rightarrow$ run(x) |+| run(y)}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}\}}}{\footnotesize\par} @@ -722,19 +722,19 @@ \subsection{Church encoding I: Motivation} \texttt{\textcolor{blue}{\footnotesize{}def x{[}S: ExZ : Semigroup{]}: S = wrap(1) |+| wrap(2)}}{\footnotesize\par} -The type of \texttt{\textcolor{blue}{\footnotesize{}x}} is {\footnotesize{}$\forall S.\left(Z\Rightarrow S\right)\times\left(S\times S\Rightarrow S\right)\Rightarrow S$}; +The type of \texttt{\textcolor{blue}{\footnotesize{}x}} is {\footnotesize{}$\forall S.\left(Z\rightarrow S\right)\times\left(S\times S\rightarrow S\right)\rightarrow S$}; an equivalent type is{\footnotesize{} \[ -\forall S.\left(\left(Z+S\times S\right)\Rightarrow S\right)\Rightarrow S +\forall S.\left(\left(Z+S\times S\right)\rightarrow S\right)\rightarrow S \] }{\footnotesize\par} This is the ``\textbf{Church encoding}'' (of the free semigroup over $Z$) -The Church encoding is based on the theorem {\footnotesize{}$A\cong\forall X.\left(A\Rightarrow X\right)\Rightarrow X$} +The Church encoding is based on the theorem {\footnotesize{}$A\cong\forall X.\left(A\rightarrow X\right)\rightarrow X$} -this \emph{resembles} the type of the continuation monad, $\left(A\Rightarrow R\right)\Rightarrow R$ +this \emph{resembles} the type of the continuation monad, $\left(A\rightarrow R\right)\rightarrow R$ but $\forall X$ makes the function fully generic, like a natural transformation @@ -744,18 +744,18 @@ \subsection{Church encoding II: Disjunction types} Consider the Church encoding for the disjunction type $P+Q$ -The encoding is {\footnotesize{}$\forall X.\left(P+Q\Rightarrow X\right)\Rightarrow X\cong\forall X.\left(P\Rightarrow X\right)\Rightarrow\left(Q\Rightarrow X\right)\Rightarrow X$}{\footnotesize\par} +The encoding is {\footnotesize{}$\forall X.\left(P+Q\rightarrow X\right)\rightarrow X\cong\forall X.\left(P\rightarrow X\right)\rightarrow\left(Q\rightarrow X\right)\rightarrow X$}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}trait Disj{[}P, Q{]} \{ def -run{[}X{]}(cp: P $\Rightarrow$ X)(cq: Q $\Rightarrow$ X): X \}}}{\footnotesize\par} +run{[}X{]}(cp: P $\rightarrow$ X)(cq: Q $\rightarrow$ X): X \}}}{\footnotesize\par} Define some values of this type: \texttt{\textcolor{blue}{\footnotesize{}def left{[}P, Q{]}(p: P) = new Disj{[}P, Q{]} \{}}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{} def run{[}X{]}(cp: P $\Rightarrow$ -X)(cq: Q $\Rightarrow$ X): X = cp(p) }}{\footnotesize\par} +\texttt{\textcolor{blue}{\footnotesize{} def run{[}X{]}(cp: P $\rightarrow$ +X)(cq: Q $\rightarrow$ X): X = cp(p) }}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}\}}}{\footnotesize\par} @@ -763,20 +763,20 @@ \subsection{Church encoding II: Disjunction types} expression simply as \texttt{\textcolor{blue}{\footnotesize{}val result = disj.run \{p -$\Rightarrow$ ...\} \{q $\Rightarrow$ ...\}}}{\footnotesize\par} +$\rightarrow$ ...\} \{q $\rightarrow$ ...\}}}{\footnotesize\par} This works in programming languages that have no disjunction types General recipe for implementing the Church encoding: -\texttt{\textcolor{blue}{\footnotesize{}trait Blah \{ def run{[}X{]}(cont: ... $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{}trait Blah \{ def run{[}X{]}(cont: ... $\rightarrow$ X): X \}}}{\footnotesize\par} For convenience, define a type class \texttt{\textcolor{blue}{\footnotesize{}Ex}} describing the inner function: \texttt{\textcolor{blue}{\footnotesize{}trait Ex{[}X{]} \{ def cp: P -$\Rightarrow$ X; def cq: Q $\Rightarrow$ X \}}}{\footnotesize\par} +$\rightarrow$ X; def cq: Q $\rightarrow$ X \}}}{\footnotesize\par} Different methods of this class return \texttt{\textcolor{blue}{\footnotesize{}X}}; convenient with disjunctions @@ -786,11 +786,11 @@ \subsection{Church encoding II: Disjunction types} \subsection{Church encoding III: How it works} -Why is the type $\text{Ch}^{A}\equiv\forall X.\left(A\Rightarrow X\right)\Rightarrow X$ +Why is the type $\text{Ch}^{A}\equiv\forall X.\left(A\rightarrow X\right)\rightarrow X$ equivalent to the type $A$? \texttt{\textcolor{blue}{\footnotesize{}trait Ch{[}A{]} \{ def run{[}X{]}(cont: A -$\Rightarrow$ X): X \}}}{\footnotesize\par} +$\rightarrow$ X): X \}}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}}}% \begin{minipage}[t]{0.65\textwidth}% @@ -800,7 +800,7 @@ \subsection{Church encoding III: How it works} \begin{lyxcode} \textcolor{blue}{\footnotesize{}def~a2c{[}A{]}(a:~A):~Ch{[}A{]}~=~new~Ch{[}A{]}~\{~}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}~~def~run{[}X{]}(cont:~A~$\Rightarrow$~X):~X~=~cont(a)}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}~~def~run{[}X{]}(cont:~A~$\rightarrow$~X):~X~=~cont(a)}{\footnotesize\par} \textcolor{blue}{\footnotesize{}\}}{\footnotesize\par} \end{lyxcode} @@ -808,15 +808,15 @@ \subsection{Church encoding III: How it works} \item If we have a $\text{ch}:\text{Ch}^{A}$, we can get an $a:A$ \end{itemize} \begin{lyxcode} -\textcolor{blue}{\footnotesize{}def~c2a{[}A{]}(ch:~Ch{[}A{]}):~A~=~ch.run{[}A{]}(a$\Rightarrow$a)}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}def~c2a{[}A{]}(ch:~Ch{[}A{]}):~A~=~ch.run{[}A{]}(a$\rightarrow$a)}{\footnotesize\par} \end{lyxcode} % \end{minipage}\texttt{\textcolor{blue}{\footnotesize{}\hfill{}}}% \begin{minipage}[t]{0.3\columnwidth}% {\footnotesize{} \[ -\xymatrix{\xyScaleY{1pc}\xyScaleX{3pc}\text{id}:\left(A\Rightarrow A\right)\ar[r]\sp(0.65){\text{ch}.\text{run}^{A}}\ar[d]\sp(0.5){\text{fmap}_{\text{Reader}_{A}}\left(f\right)} & A\ar[d]\sp(0.45){f}\\ -f:\left(A\Rightarrow X\right)\ar[r]\sb(0.65){\text{ch}.\text{run}^{X}} & X +\xymatrix{\xyScaleY{1pc}\xyScaleX{3pc}\text{id}:\left(A\rightarrow A\right)\ar[r]\sp(0.65){\text{ch}.\text{run}^{A}}\ar[d]\sp(0.5){\text{fmap}_{\text{Reader}_{A}}\left(f\right)} & A\ar[d]\sp(0.45){f}\\ +f:\left(A\rightarrow X\right)\ar[r]\sb(0.65){\text{ch}.\text{run}^{X}} & X } \] }% @@ -826,13 +826,13 @@ \subsection{Church encoding III: How it works} are inverses of each other To implement a value $\text{ch}^{:\text{Ch}^{A}}$, we must compute -an $x^{:X}$ given $f^{:A\Rightarrow X}$, for \emph{any} $X$, which +an $x^{:X}$ given $f^{:A\rightarrow X}$, for \emph{any} $X$, which \emph{requires} having a value $a^{:A}$ available To show that \texttt{\textcolor{blue}{\footnotesize{}ch = a2c(c2a(ch))}}, -apply both sides to an \texttt{\textcolor{blue}{\footnotesize{}f:~A$\Rightarrow$X}} +apply both sides to an \texttt{\textcolor{blue}{\footnotesize{}f:~A$\rightarrow$X}} and get \texttt{\textcolor{blue}{\footnotesize{}ch.run(f) = a2c(c2a(ch)).run(f) -= f(c2a(ch)) = f(ch.run(a$\Rightarrow$a))}} += f(c2a(ch)) = f(ch.run(a$\rightarrow$a))}} This is naturality of \texttt{\textcolor{blue}{\footnotesize{}ch.run}} as a transformation between \texttt{\textcolor{blue}{\footnotesize{}Reader}} @@ -851,7 +851,7 @@ \subsection{Church encoding III: How it works} \subsection{Worked example III: Free functor I} The \texttt{\textcolor{blue}{\footnotesize{}Functor}} type class has -one method, \texttt{\textcolor{blue}{\footnotesize{}fmap}}: $\left(Z\Rightarrow A\right)\Rightarrow F^{Z}\Rightarrow F^{A}$ +one method, \texttt{\textcolor{blue}{\footnotesize{}fmap}}: $\left(Z\rightarrow A\right)\rightarrow F^{Z}\rightarrow F^{A}$ The tree encoding of a free functor over $F^{\bullet}$ needs two case classes: @@ -888,7 +888,7 @@ \subsection{Worked example III: Free functor I} The existential quantifier applies to the ``hidden'' type parameter The constructor \texttt{\textcolor{blue}{\footnotesize{}QZ}} has type -$\exists Z.\left(A\times Z\Rightarrow Q^{A}\right)$ +$\exists Z.\left(A\times Z\rightarrow Q^{A}\right)$ It is not $\forall Z$ because a specific $Z$ is used when building up a value @@ -899,16 +899,16 @@ \subsection{Worked example III: Free functor I} \subsection{Encoding with an existential type: How it works} -Show that $P^{A}\equiv\exists Z.Z\times\left(Z\Rightarrow A\right)\cong A$ +Show that $P^{A}\equiv\exists Z.Z\times\left(Z\rightarrow A\right)\cong A$ \texttt{\textcolor{blue}{\footnotesize{}sealed trait P{[}A{]}; case -class PZ{[}A, Z{]}(z: Z, f: Z $\Rightarrow$ A) extends P{[}A{]}}}{\footnotesize\par} +class PZ{[}A, Z{]}(z: Z, f: Z $\rightarrow$ A) extends P{[}A{]}}}{\footnotesize\par} How to construct a value of type $P^{A}$ for a given $A$? -Have a function $Z\Rightarrow A$ and a $Z$, construct $Z\times\left(Z\Rightarrow A\right)$ +Have a function $Z\rightarrow A$ and a $Z$, construct $Z\times\left(Z\rightarrow A\right)$ -Particular case: $Z\equiv A$, have $a:A$ and build $a\times\text{id}^{:A\Rightarrow A}$ +Particular case: $Z\equiv A$, have $a:A$ and build $a\times\text{id}^{:A\rightarrow A}$ \texttt{\textcolor{blue}{\footnotesize{}def a2p{[}A{]}(a: A): P{[}A{]} = PZ{[}A, A{]}(a, identity)}}{\footnotesize\par} @@ -919,8 +919,8 @@ \subsection{Encoding with an existential type: How it works} \emph{Can} extract $A$ out of $P^{A}$ \textendash{} do not need to know $Z$ -\texttt{\textcolor{blue}{\footnotesize{}def p2a{[}A{]}: P{[}A{]} $\Rightarrow$ -A = \{ case PZ(z, f) $\Rightarrow$ f(z) \}}}{\footnotesize\par} +\texttt{\textcolor{blue}{\footnotesize{}def p2a{[}A{]}: P{[}A{]} $\rightarrow$ +A = \{ case PZ(z, f) $\rightarrow$ f(z) \}}}{\footnotesize\par} Cannot transform $P^{A}$ into anything else other than $A$ @@ -931,7 +931,7 @@ \subsection{Encoding with an existential type: How it works} inverses (i.e.~we need to use \texttt{\textcolor{blue}{\footnotesize{}p2a}} in order to compare values of type $P^{A}$) -If $F^{\bullet}$ is a functor then $Q^{A}\equiv\exists Z.F^{Z}\times\left(Z\Rightarrow A\right)\cong F^{A}$ +If $F^{\bullet}$ is a functor then $Q^{A}\equiv\exists Z.F^{Z}\times\left(Z\rightarrow A\right)\cong F^{A}$ A value of $Q^{A}$ can be observed only by extracting an $F^{A}$ from it @@ -943,22 +943,22 @@ \subsection{Encoding with an existential type: How it works} \subsection{Worked example III: Free functor II} Tree encoding of \texttt{\textcolor{blue}{\footnotesize{}FF}} has -type $\text{FF}^{F^{\bullet},A}\equiv F^{A}+\exists Z.\text{FF}^{F^{\bullet},Z}\times\left(Z\Rightarrow A\right)$ +type $\text{FF}^{F^{\bullet},A}\equiv F^{A}+\exists Z.\text{FF}^{F^{\bullet},Z}\times\left(Z\rightarrow A\right)$ Derivation of the reduced encoding: A value of type $\text{FF}^{F^{\bullet},A}$ must be of the form {\footnotesize{} \[ -\exists Z_{1}.\exists Z_{2}...\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\Rightarrow Z_{n-1}\right)\times...\times\left(Z_{2}\Rightarrow Z_{1}\right)\times\left(Z_{1}\Rightarrow A\right) +\exists Z_{1}.\exists Z_{2}...\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\rightarrow Z_{n-1}\right)\times...\times\left(Z_{2}\rightarrow Z_{1}\right)\times\left(Z_{1}\rightarrow A\right) \] }{\footnotesize\par} -The functions $Z_{1}\Rightarrow A$, $Z_{2}\Rightarrow Z_{1}$, etc., +The functions $Z_{1}\rightarrow A$, $Z_{2}\rightarrow Z_{1}$, etc., must be composed associatively -The equivalent type is $\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\Rightarrow A\right)$ +The equivalent type is $\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\rightarrow A\right)$ -Reduced encoding: $\text{FreeF}^{F^{\bullet},A}\equiv\exists Z.F^{Z}\times\left(Z\Rightarrow A\right)$ +Reduced encoding: $\text{FreeF}^{F^{\bullet},A}\equiv\exists Z.F^{Z}\times\left(Z\rightarrow A\right)$ Substituted $F^{Z}$ instead of $\text{FreeF}^{F^{\bullet},Z}$ and eliminated the case $F^{A}$ @@ -967,11 +967,11 @@ \subsection{Worked example III: Free functor II} Requires a proof that this encoding is equivalent to the tree encoding -If $F^{\bullet}$ is already a functor, can show $F^{A}\cong\exists Z.F^{Z}\times\left(Z\Rightarrow A\right)$ +If $F^{\bullet}$ is already a functor, can show $F^{A}\cong\exists Z.F^{Z}\times\left(Z\rightarrow A\right)$ -Church encoding (starting from the tree encoding): $\text{FreeF}^{F^{\bullet},A}\equiv\forall P^{\bullet}.\left(\forall C.\big(F^{C}+\exists Z.P^{Z}\times\left(Z\Rightarrow C\right)\big)\leadsto P^{C}\right)\Rightarrow P^{A}$ +Church encoding (starting from the tree encoding): $\text{FreeF}^{F^{\bullet},A}\equiv\forall P^{\bullet}.\left(\forall C.\big(F^{C}+\exists Z.P^{Z}\times\left(Z\rightarrow C\right)\big)\leadsto P^{C}\right)\rightarrow P^{A}$ -The structure of the type expression: $\forall P^{\bullet}.\left(\forall C.(...)^{C}\leadsto P^{C}\right)\Rightarrow P^{A}$ +The structure of the type expression: $\forall P^{\bullet}.\left(\forall C.(...)^{C}\leadsto P^{C}\right)\rightarrow P^{A}$ Cannot move $\forall C$ or $\exists Z$ to the outside of the type expression! @@ -982,7 +982,7 @@ \subsection{Church encoding IV: Recursive types and type constructors} Consider the recursive type {\footnotesize{}$P\equiv Z+P\times P$} (tree with $Z$-valued leaves) -The Church encoding is {\footnotesize{}$\forall X.\left(\left(Z+X\times X\right)\Rightarrow X\right)\Rightarrow X$}{\footnotesize\par} +The Church encoding is {\footnotesize{}$\forall X.\left(\left(Z+X\times X\right)\rightarrow X\right)\rightarrow X$}{\footnotesize\par} This is \emph{non-recursive}: the inductive use of $P$ is replaced by $X$ @@ -990,7 +990,7 @@ \subsection{Church encoding IV: Recursive types and type constructors} Generalize to recursive type $P\equiv S^{P}$ where $S^{\bullet}$ is a ``induction functor'': -The Church encoding of $P$ is {\footnotesize{}$\forall X.\left(S^{X}\Rightarrow X\right)\Rightarrow X$}{\footnotesize\par} +The Church encoding of $P$ is {\footnotesize{}$\forall X.\left(S^{X}\rightarrow X\right)\rightarrow X$}{\footnotesize\par} Church encoding of recursive types is non-recursive @@ -1000,9 +1000,9 @@ \subsection{Church encoding IV: Recursive types and type constructors} Notation: $P^{\bullet}$ is a type function; Scala syntax is \texttt{\textcolor{blue}{\footnotesize{}P{[}\_{]}}} -The Church encoding is {\footnotesize{}$\text{Ch}^{P^{\bullet},A}=\forall F^{\bullet}.\left(\forall X.P^{X}\Rightarrow F^{X}\right)\Rightarrow F^{A}$}{\footnotesize\par} +The Church encoding is {\footnotesize{}$\text{Ch}^{P^{\bullet},A}=\forall F^{\bullet}.\left(\forall X.P^{X}\rightarrow F^{X}\right)\rightarrow F^{A}$}{\footnotesize\par} -Note: $\forall X.P^{X}\Rightarrow F^{X}$ or $P^{\bullet}\leadsto F^{\bullet}$ +Note: $\forall X.P^{X}\rightarrow F^{X}$ or $P^{\bullet}\leadsto F^{\bullet}$ resembles a natural transformation Except that $P^{\bullet}$ and $F^{\bullet}$ are not necessarily @@ -1021,7 +1021,7 @@ \subsection{Church encoding IV: Recursive types and type constructors} Example: $\text{List}^{A}\equiv1+A\times\text{List}^{A}\equiv S^{\text{List}^{\bullet},A}$ where $S^{P^{\bullet},A}\equiv1+A\times P^{A}$ -The Church encoding of $P^{A}$ is {\footnotesize{}$\text{Ch}^{P^{\bullet},A}=\forall F^{\bullet}.\big(S^{F^{\bullet}}\leadsto F^{\bullet}\big)\Rightarrow F^{A}$}{\footnotesize\par} +The Church encoding of $P^{A}$ is {\footnotesize{}$\text{Ch}^{P^{\bullet},A}=\forall F^{\bullet}.\big(S^{F^{\bullet}}\leadsto F^{\bullet}\big)\rightarrow F^{A}$}{\footnotesize\par} The Church encoding of \texttt{\textcolor{blue}{\footnotesize{}List{[}\_{]}}} is non-recursive @@ -1031,21 +1031,21 @@ \subsection{Church encoding V: Type classes} Look at the Church encoding of the free semigroup:{\footnotesize{} \[ -\text{ChFS}^{Z}\equiv\forall X.\left(Z\Rightarrow X\right)\times\left(X\times X\Rightarrow X\right)\Rightarrow X +\text{ChFS}^{Z}\equiv\forall X.\left(Z\rightarrow X\right)\times\left(X\times X\rightarrow X\right)\rightarrow X \] }{\footnotesize\par} If $X$ is constrained to the \texttt{\textcolor{blue}{\footnotesize{}Semigroup}} -typeclass, we will already have a value {\footnotesize{}$X\times X\Rightarrow X$}, -so we can omit it: {\footnotesize{}$\text{ChFS}^{Z}=\forall X^{:\text{Semigroup}}.\left(Z\Rightarrow X\right)\Rightarrow X$}{\footnotesize\par} +typeclass, we will already have a value {\footnotesize{}$X\times X\rightarrow X$}, +so we can omit it: {\footnotesize{}$\text{ChFS}^{Z}=\forall X^{:\text{Semigroup}}.\left(Z\rightarrow X\right)\rightarrow X$}{\footnotesize\par} The ``induction functor'' for ``semigroup over $Z$'' is {\footnotesize{}$\text{SemiG}^{X}\equiv Z+X\times X$}{\footnotesize\par} -So the Church encoding is $\forall X.\big(\text{SemiG}^{X}\Rightarrow X\big)\Rightarrow X$ +So the Church encoding is $\forall X.\big(\text{SemiG}^{X}\rightarrow X\big)\rightarrow X$ Generalize to arbitrary type classes: -Type class $C$ is defined by its operations{\footnotesize{} $C^{X}\Rightarrow X$} +Type class $C$ is defined by its operations{\footnotesize{} $C^{X}\rightarrow X$} (with a suitable $C^{\bullet}$) call $C^{\bullet}$ the \textbf{method functor} of the inductive typeclass @@ -1053,15 +1053,15 @@ \subsection{Church encoding V: Type classes} Tree encoding of ``free $C$ over $Z$'' is recursive, $\text{FreeC}^{Z}\equiv Z+C^{\text{FreeC}^{Z}}$ -Church encoding is $\text{FreeC}^{Z}\equiv\forall X.\left(Z+C^{X}\Rightarrow X\right)\Rightarrow X$ +Church encoding is $\text{FreeC}^{Z}\equiv\forall X.\left(Z+C^{X}\rightarrow X\right)\rightarrow X$ -Equivalently, $\text{FreeC}^{Z}\equiv\forall X^{:C}.\left(Z\Rightarrow X\right)\Rightarrow X$ +Equivalently, $\text{FreeC}^{Z}\equiv\forall X^{:C}.\left(Z\rightarrow X\right)\rightarrow X$ Laws of the typeclass are satisfied automatically after ``running'' -Works similarly for type constructors: operations $C^{P^{\bullet},A}\Rightarrow P^{A}$ +Works similarly for type constructors: operations $C^{P^{\bullet},A}\rightarrow P^{A}$ -Free typeclass $C$ over $F^{\bullet}$ is $\text{FreeC}^{F^{\bullet},A}\equiv\forall P^{\bullet:C}.\left(F^{\bullet}\leadsto P^{\bullet}\right)\Rightarrow P^{A}$ +Free typeclass $C$ over $F^{\bullet}$ is $\text{FreeC}^{F^{\bullet},A}\equiv\forall P^{\bullet:C}.\left(F^{\bullet}\leadsto P^{\bullet}\right)\rightarrow P^{A}$ \subsection{Properties of free type constructions} @@ -1101,10 +1101,10 @@ \subsection{Properties of free type constructions} ``free instance of $C$ over $F$''? For all $F^{\bullet}$, must have \texttt{\textcolor{blue}{\footnotesize{}wrap{[}A{]}}} -$:F^{A}\Rightarrow\text{FreeC}^{F,A}$ or $F^{\bullet}\leadsto\text{FreeC}^{F,\bullet}$ +$:F^{A}\rightarrow\text{FreeC}^{F,A}$ or $F^{\bullet}\leadsto\text{FreeC}^{F,\bullet}$ For all $M^{\bullet}:C$, must have \texttt{\textcolor{blue}{\footnotesize{}run}} -$:\left(F^{\bullet}\leadsto M^{\bullet}\right)\Rightarrow\text{FreeC}^{F,\bullet}\leadsto M^{\bullet}$ +$:\left(F^{\bullet}\leadsto M^{\bullet}\right)\rightarrow\text{FreeC}^{F,\bullet}\leadsto M^{\bullet}$ The laws of typeclass $C$ must hold after interpreting into an $M^{\bullet}:C$ @@ -1120,8 +1120,8 @@ \subsection{Recipes for encoding free typeclass instances} The typeclass $C$ can be functor, contrafunctor, monad, etc. Assume that $C$ has methods $m_{1}$, $m_{2}$, ..., with type signatures -{\footnotesize{}$m_{1}:Q_{1}^{P^{\bullet},A}\Rightarrow P^{A}$}, -{\footnotesize{}$m_{2}:Q_{2}^{P^{\bullet},A}\Rightarrow P^{A}$}, +{\footnotesize{}$m_{1}:Q_{1}^{P^{\bullet},A}\rightarrow P^{A}$}, +{\footnotesize{}$m_{2}:Q_{2}^{P^{\bullet},A}\rightarrow P^{A}$}, etc., where $Q_{i}^{P^{\bullet},A}$ are covariant in $P^{\bullet}$ \textbf{Inductive typeclass} is defined via a methods functor, $S^{P^{\bullet}}\leadsto P^{\bullet}$ @@ -1158,25 +1158,25 @@ \subsection{Recipes for encoding free typeclass instances} \subsection{Properties of inductive typeclasses} -If a typeclass $C$ is inductive with methods $C^{X}\Rightarrow X$ +If a typeclass $C$ is inductive with methods $C^{X}\rightarrow X$ then: A free instance of $C$ over $Z$ can be tree-encoded as {\footnotesize{}$\text{FreeC}^{Z}\equiv Z+C^{\text{FreeC}^{Z}}$} All inductive typeclasses have free instances, $\text{FreeC}^{Z}$ -If $P^{:C}$ and $Q^{:C}$ then $P\times Q$ and $Z\Rightarrow P$ +If $P^{:C}$ and $Q^{:C}$ then $P\times Q$ and $Z\rightarrow P$ also belong to typeclass $C$ but not necessarily $P+Q$ or $Z\times P$ -Proof: can implement $(C^{P}\Rightarrow P)\times(C^{Q}\Rightarrow Q)\Rightarrow C^{P\times Q}\Rightarrow P\times Q$ -and $\left(C^{P}\Rightarrow P\right)\Rightarrow C^{Z\Rightarrow P}\Rightarrow Z\Rightarrow P$, -but cannot implement $\left(...\right)\Rightarrow P+Q$ +Proof: can implement $(C^{P}\rightarrow P)\times(C^{Q}\rightarrow Q)\rightarrow C^{P\times Q}\rightarrow P\times Q$ +and $\left(C^{P}\rightarrow P\right)\rightarrow C^{Z\rightarrow P}\rightarrow Z\rightarrow P$, +but cannot implement $\left(...\right)\rightarrow P+Q$ Analogous properties hold for type constructor typeclasses -Methods described as $C^{F^{\bullet},A}\Rightarrow F^{A}$ with type +Methods described as $C^{F^{\bullet},A}\rightarrow F^{A}$ with type constructor parameter $F^{\bullet}$ What typeclasses \emph{cannot} be tree-encoded (or have no ``free'' @@ -1185,41 +1185,41 @@ \subsection{Properties of inductive typeclasses} Any typeclass with a method \emph{not ultimately returning} a value of $P^{A}$ -Example: a typeclass with methods $\text{pt}:A\Rightarrow P^{A}$ -and $\text{ex}:P^{A}\Rightarrow A$ +Example: a typeclass with methods $\text{pt}:A\rightarrow P^{A}$ +and $\text{ex}:P^{A}\rightarrow A$ Such typeclasses are not inductive -Typeclasses with methods of the form $P^{A}\Rightarrow...$ are \textbf{co-inductive} +Typeclasses with methods of the form $P^{A}\rightarrow...$ are \textbf{co-inductive} \subsection{Worked example IV: Free contrafunctor} -Method $\text{contramap}:C^{A}\times\left(B\Rightarrow A\right)\Rightarrow C^{B}$ +Method $\text{contramap}:C^{A}\times\left(B\rightarrow A\right)\rightarrow C^{B}$ -Tree encoding: $\text{FreeCF}^{F^{\bullet},B}\equiv F^{B}+\exists A.\text{FreeCF}^{F^{\bullet},A}\times\left(B\Rightarrow A\right)$ +Tree encoding: $\text{FreeCF}^{F^{\bullet},B}\equiv F^{B}+\exists A.\text{FreeCF}^{F^{\bullet},A}\times\left(B\rightarrow A\right)$ -Reduced encoding: $\text{FreeCF}^{F^{\bullet},B}\equiv\exists A.F^{A}\times\left(B\Rightarrow A\right)$ +Reduced encoding: $\text{FreeCF}^{F^{\bullet},B}\equiv\exists A.F^{A}\times\left(B\rightarrow A\right)$ A value of type $\text{FreeCF}^{F^{\bullet},B}$ must be of the form {\footnotesize{} \[ -\exists Z_{1}.\exists Z_{2}...\exists Z_{n}.F^{Z_{1}}\times\left(B\Rightarrow Z_{n}\right)\times\left(Z_{n}\Rightarrow Z_{n-1}\right)\times...\times\left(Z_{2}\Rightarrow Z_{1}\right) +\exists Z_{1}.\exists Z_{2}...\exists Z_{n}.F^{Z_{1}}\times\left(B\rightarrow Z_{n}\right)\times\left(Z_{n}\rightarrow Z_{n-1}\right)\times...\times\left(Z_{2}\rightarrow Z_{1}\right) \] }{\footnotesize\par} -The functions $B\Rightarrow Z_{n}$, $Z_{n}\Rightarrow Z_{n-1}$, +The functions $B\rightarrow Z_{n}$, $Z_{n}\rightarrow Z_{n-1}$, etc., are composed associatively -The equivalent type is $\exists Z_{1}.F^{Z_{1}}\times\left(B\Rightarrow Z_{1}\right)$ +The equivalent type is $\exists Z_{1}.F^{Z_{1}}\times\left(B\rightarrow Z_{1}\right)$ The reduced encoding is non-recursive Example: $F^{A}\equiv A$, ``interpret'' into the contrafunctor -$C^{A}\equiv A\Rightarrow\text{String}$ +$C^{A}\equiv A\rightarrow\text{String}$ \texttt{\textcolor{blue}{\footnotesize{}def prefixLog{[}A{]}(p: A): A -$\Rightarrow$ String = a $\Rightarrow$ p.toString + a.toString}}{\footnotesize\par} +$\rightarrow$ String = a $\rightarrow$ p.toString + a.toString}}{\footnotesize\par} If $F^{\bullet}$ is already a contrafunctor then $\text{FreeCF}^{F^{\bullet},A}\cong F^{A}$ @@ -1228,30 +1228,30 @@ \subsection{Worked example V: Free pointed functor} Over an arbitrary type constructor $F^{\bullet}$: -Pointed functor methods {\footnotesize{}$\text{pt}:A\Rightarrow P^{A}$} -and {\footnotesize{}$\text{map}:P^{A}\times\left(A\Rightarrow B\right)\Rightarrow P^{B}$}{\footnotesize\par} +Pointed functor methods {\footnotesize{}$\text{pt}:A\rightarrow P^{A}$} +and {\footnotesize{}$\text{map}:P^{A}\times\left(A\rightarrow B\right)\rightarrow P^{B}$}{\footnotesize\par} -Tree encoding: {\footnotesize{}$\text{FreeP}^{F^{\bullet},A}\equiv A+F^{A}+\exists Z.\text{FreeP}^{F^{\bullet},Z}\times\left(Z\Rightarrow A\right)$}{\footnotesize\par} +Tree encoding: {\footnotesize{}$\text{FreeP}^{F^{\bullet},A}\equiv A+F^{A}+\exists Z.\text{FreeP}^{F^{\bullet},Z}\times\left(Z\rightarrow A\right)$}{\footnotesize\par} Derivation of the reduced encoding: The tree encoding of a value $\text{FreeP}^{F^{\bullet},A}$ is either{\footnotesize{} \[ -\exists Z_{1}.\exists Z_{2}...\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\Rightarrow Z_{n-1}\right)\times...\times\left(Z_{2}\Rightarrow Z_{1}\right)\times\left(Z_{1}\Rightarrow A\right) +\exists Z_{1}.\exists Z_{2}...\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\rightarrow Z_{n-1}\right)\times...\times\left(Z_{2}\rightarrow Z_{1}\right)\times\left(Z_{1}\rightarrow A\right) \] }or{\footnotesize{} \[ -\exists Z_{1}.\exists Z_{2}...\exists Z_{n}.Z_{n}\times\left(Z_{n}\Rightarrow Z_{n-1}\right)\times...\times\left(Z_{2}\Rightarrow Z_{1}\right)\times\left(Z_{1}\Rightarrow A\right) +\exists Z_{1}.\exists Z_{2}...\exists Z_{n}.Z_{n}\times\left(Z_{n}\rightarrow Z_{n-1}\right)\times...\times\left(Z_{2}\rightarrow Z_{1}\right)\times\left(Z_{1}\rightarrow A\right) \] }{\footnotesize\par} -Compose all functions by associativity; one function $Z_{n}\Rightarrow A$ +Compose all functions by associativity; one function $Z_{n}\rightarrow A$ remains -The case $\exists Z_{n}.Z_{n}\times\left(Z_{n}\Rightarrow A\right)$ +The case $\exists Z_{n}.Z_{n}\times\left(Z_{n}\rightarrow A\right)$ is equivalent to just $A$ -Reduced encoding: {\footnotesize{}$\text{FreeP}^{F^{\bullet},A}\equiv A+\exists Z.F^{Z}\times\left(Z\Rightarrow A\right)$, +Reduced encoding: {\footnotesize{}$\text{FreeP}^{F^{\bullet},A}\equiv A+\exists Z.F^{Z}\times\left(Z\rightarrow A\right)$, }non-recursive This reuses the free functor as $\text{FreeP}^{F^{\bullet},A}=A+\text{FreeF}^{F^{\bullet},A}$ @@ -1274,28 +1274,28 @@ \subsection{Worked example VI: Free filterable functor} (See Chapter 6.) Methods: \begin{align*} -\text{map} & :F^{A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow F^{B}\\ -\text{mapOpt} & :F^{A}\Rightarrow\left(A\Rightarrow1+B\right)\Rightarrow F^{B} +\text{map} & :F^{A}\rightarrow\left(A\rightarrow B\right)\rightarrow F^{B}\\ +\text{mapOpt} & :F^{A}\rightarrow\left(A\rightarrow1+B\right)\rightarrow F^{B} \end{align*} We can recover \texttt{\textcolor{blue}{\footnotesize{}map}} from \texttt{\textcolor{blue}{\footnotesize{}mapOpt}}, so we keep only \texttt{\textcolor{blue}{\footnotesize{}mapOpt}} -Tree encoding: $\text{FreeFi}^{F^{\bullet},A}\equiv F^{A}+\exists Z.\text{FreeFi}^{F^{\bullet},Z}\times\left(Z\Rightarrow1+A\right)$ +Tree encoding: $\text{FreeFi}^{F^{\bullet},A}\equiv F^{A}+\exists Z.\text{FreeFi}^{F^{\bullet},Z}\times\left(Z\rightarrow1+A\right)$ If $F^{\bullet}$ is already a functor, can simplify the tree encoding -using the identity $\exists Z.P^{Z}\times\left(Z\Rightarrow1+A\right)\cong P^{A}$ +using the identity $\exists Z.P^{Z}\times\left(Z\rightarrow1+A\right)\cong P^{A}$ and obtain $\text{FreeFi}^{F^{\bullet},A}\equiv F^{A}+\text{FreeFi}^{F^{\bullet},1+A}$, which is equivalent to $\text{FreeFi}^{F^{\bullet},A}=F^{A}+F^{1+A}+F^{1+1+A}+...$ -Reduced encoding: $\text{FreeFi}^{F^{\bullet},A}\equiv\exists Z.F^{Z}\times\left(Z\Rightarrow1+A\right)$, +Reduced encoding: $\text{FreeFi}^{F^{\bullet},A}\equiv\exists Z.F^{Z}\times\left(Z\rightarrow1+A\right)$, non-recursive -Derivation: $\exists Z_{1}...\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\Rightarrow1+Z_{n-1}\right)\times...\times\left(Z_{1}\Rightarrow1+A\right)$ +Derivation: $\exists Z_{1}...\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\rightarrow1+Z_{n-1}\right)\times...\times\left(Z_{1}\rightarrow1+A\right)$ is simplified using the laws of \texttt{\textcolor{blue}{\footnotesize{}mapOpt}} -and Kleisli composition, and yields $\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\Rightarrow1+A\right)$. -Encode $F^{A}$ as $\exists Z.F^{Z}\times\left(Z\Rightarrow0+Z\right)$. +and Kleisli composition, and yields $\exists Z_{n}.F^{Z_{n}}\times\left(Z_{n}\rightarrow1+A\right)$. +Encode $F^{A}$ as $\exists Z.F^{Z}\times\left(Z\rightarrow0+Z\right)$. If $F^{\bullet}$ is already a functor, the reduced encoding is $\text{FreeFi}^{F^{\bullet},A}=F^{1+A}$ @@ -1309,27 +1309,27 @@ \subsection{Worked example VII: Free monad} Methods: \begin{align*} -\text{pure} & :A\Rightarrow F^{A}\\ -\text{flatMap} & :F^{A}\Rightarrow(A\Rightarrow F^{B})\Rightarrow F^{B} +\text{pure} & :A\rightarrow F^{A}\\ +\text{flatMap} & :F^{A}\rightarrow(A\rightarrow F^{B})\rightarrow F^{B} \end{align*} Can recover \texttt{\textcolor{blue}{\footnotesize{}map}} from \texttt{\textcolor{blue}{\footnotesize{}flatMap}} and \texttt{\textcolor{blue}{\footnotesize{}pure}}, so we keep only \texttt{\textcolor{blue}{\footnotesize{}flatMap}} -Tree encoding: {\footnotesize{}$\text{FreeM}^{F^{\bullet},A}\equiv F^{A}+A+\exists Z.\text{FreeM}^{F^{\bullet},Z}\times\big(Z\Rightarrow\text{FreeM}^{F^{\bullet},A}\big)$}{\footnotesize\par} +Tree encoding: {\footnotesize{}$\text{FreeM}^{F^{\bullet},A}\equiv F^{A}+A+\exists Z.\text{FreeM}^{F^{\bullet},Z}\times\big(Z\rightarrow\text{FreeM}^{F^{\bullet},A}\big)$}{\footnotesize\par} Derivation of reduced encoding: -can simplify $A\times\big(A\Rightarrow\text{FreeM}^{F^{\bullet},B}\big)\cong\text{FreeM}^{F^{\bullet},B}$ +can simplify $A\times\big(A\rightarrow\text{FreeM}^{F^{\bullet},B}\big)\cong\text{FreeM}^{F^{\bullet},B}$ -use associativity to replace $\text{FreeM}^{A}\times(A\Rightarrow\text{FreeM}^{B})\times(B\Rightarrow\text{FreeM}^{C})$ -by $\text{FreeM}^{A}\times\big(A\Rightarrow\text{FreeM}^{B}\times(B\Rightarrow\text{FreeM}^{C})\big)$ +use associativity to replace $\text{FreeM}^{A}\times(A\rightarrow\text{FreeM}^{B})\times(B\rightarrow\text{FreeM}^{C})$ +by $\text{FreeM}^{A}\times\big(A\rightarrow\text{FreeM}^{B}\times(B\rightarrow\text{FreeM}^{C})\big)$ therefore we can replace $\exists Z.\text{FreeM}^{F^{\bullet},Z}\times...$ by $\exists Z.F^{Z}\times...$ -Reduced encoding: $\text{FreeM}^{F^{\bullet},A}\equiv A+\exists Z.F^{Z}\times\big(Z\Rightarrow\text{FreeM}^{F^{\bullet},A}\big)$ +Reduced encoding: $\text{FreeM}^{F^{\bullet},A}\equiv A+\exists Z.F^{Z}\times\big(Z\rightarrow\text{FreeM}^{F^{\bullet},A}\big)$ ``\textbf{Final} \textbf{Tagless} style'' means ``Church encoding of free monad over $F^{\bullet}$'' @@ -1341,7 +1341,7 @@ \subsection{Worked example VII: Free monad} Free monad over a pointed functor $F^{\bullet}$ is {\footnotesize{}$\text{FreeM}^{F^{\bullet},A}\equiv F^{A}+F^{\text{FreeM}^{F^{\bullet},A}}$}{\footnotesize\par} -start from half-reduced encoding $F^{A}+\exists Z.F^{Z}\times\big(Z\Rightarrow\text{FreeM}^{F^{\bullet},A}\big)$ +start from half-reduced encoding $F^{A}+\exists Z.F^{Z}\times\big(Z\rightarrow\text{FreeM}^{F^{\bullet},A}\big)$ replace the existential type by an equivalent type $F^{\text{FreeM}^{F^{\bullet},A}}$ @@ -1350,29 +1350,29 @@ \subsection{Worked example VIII: Free applicative functor} Methods: \begin{align*} -\text{pure} & :A\Rightarrow F^{A}\\ -\text{ap} & :F^{A}\Rightarrow F^{A\Rightarrow B}\Rightarrow F^{B} +\text{pure} & :A\rightarrow F^{A}\\ +\text{ap} & :F^{A}\rightarrow F^{A\rightarrow B}\rightarrow F^{B} \end{align*} We can recover \texttt{\textcolor{blue}{\footnotesize{}map}} from \texttt{\textcolor{blue}{\footnotesize{}ap}} and \texttt{\textcolor{blue}{\footnotesize{}pure}}, so we omit \texttt{\textcolor{blue}{\footnotesize{}map}} -Tree encoding: {\footnotesize{}$\text{FreeAp}^{F^{\bullet},A}\equiv F^{A}+A+\exists Z.\text{FreeAp}^{F^{\bullet},Z}\times\text{FreeAp}^{F^{\bullet},Z\Rightarrow A}$}{\footnotesize\par} +Tree encoding: {\footnotesize{}$\text{FreeAp}^{F^{\bullet},A}\equiv F^{A}+A+\exists Z.\text{FreeAp}^{F^{\bullet},Z}\times\text{FreeAp}^{F^{\bullet},Z\rightarrow A}$}{\footnotesize\par} -Reduced encoding:{\footnotesize{} $\text{FreeAp}^{F^{\bullet},A}\equiv A+\exists Z.F^{Z}\times\text{FreeAp}^{F^{\bullet},Z\Rightarrow A}$}{\footnotesize\par} +Reduced encoding:{\footnotesize{} $\text{FreeAp}^{F^{\bullet},A}\equiv A+\exists Z.F^{Z}\times\text{FreeAp}^{F^{\bullet},Z\rightarrow A}$}{\footnotesize\par} -Derivation: a $\text{FreeAp}^{A}$ is either $\exists Z_{1}...\exists Z_{n}.Z_{1}\times\text{FreeAp}^{Z_{1}\Rightarrow Z_{2}}\times...$ -or $\exists Z_{1}...\exists Z_{n}.F^{Z_{1}}\times\text{FreeAp}^{Z_{1}\Rightarrow Z_{2}}\times...$; -encode $Z_{1}\times\text{FreeAp}^{Z_{1}\Rightarrow Z_{2}}$ equivalently -as $\text{FreeAp}^{Z_{1}\Rightarrow Z_{2}}\times\left(\left(Z_{1}\Rightarrow Z_{2}\right)\Rightarrow Z_{2}\right)$ +Derivation: a $\text{FreeAp}^{A}$ is either $\exists Z_{1}...\exists Z_{n}.Z_{1}\times\text{FreeAp}^{Z_{1}\rightarrow Z_{2}}\times...$ +or $\exists Z_{1}...\exists Z_{n}.F^{Z_{1}}\times\text{FreeAp}^{Z_{1}\rightarrow Z_{2}}\times...$; +encode $Z_{1}\times\text{FreeAp}^{Z_{1}\rightarrow Z_{2}}$ equivalently +as $\text{FreeAp}^{Z_{1}\rightarrow Z_{2}}\times\left(\left(Z_{1}\rightarrow Z_{2}\right)\rightarrow Z_{2}\right)$ using the identity law; so the first $\text{FreeAp}^{Z}$ is always $F^{A}$, or we have a pure value Free applicative over a functor $F^{\bullet}$: \begin{align*} \text{FreeAp}^{F^{\bullet},A} & \equiv A+\text{FreeZ}^{F^{\bullet},A}\\ -\text{FreeZ}^{F^{\bullet},A} & \equiv F^{A}+\exists Z.F^{Z}\times\text{FreeZ}^{F^{\bullet},Z\Rightarrow A} +\text{FreeZ}^{F^{\bullet},A} & \equiv F^{A}+\exists Z.F^{Z}\times\text{FreeZ}^{F^{\bullet},Z\rightarrow A} \end{align*} $\text{FreeZ}^{F^{\bullet},\bullet}$ is the reduced encoding of ``free @@ -1384,22 +1384,22 @@ \subsection{Worked example VIII: Free applicative functor} \subsection{Laws for free typeclass constructions} -Consider an inductive typeclass $C$ with methods $C^{A}\Rightarrow A$ +Consider an inductive typeclass $C$ with methods $C^{A}\rightarrow A$ Define a free instance of $C$ over $Z$ recursively, {\footnotesize{}$\text{FreeC}^{Z}\equiv Z+C^{\text{FreeC}^{Z}}$}{\footnotesize\par} $\text{FreeC}^{Z}$ has an instance of $C$, i.e.~we can implement -$C^{\text{FreeC}^{Z}}\Rightarrow\text{FreeC}^{Z}$ +$C^{\text{FreeC}^{Z}}\rightarrow\text{FreeC}^{Z}$ -$\text{FreeC}^{Z}$ is a functor in $Z$; {\footnotesize{}$\text{fmap}_{\text{FreeC}}:\left(Y\Rightarrow Z\right)\Rightarrow\text{FreeC}^{Y}\Rightarrow\text{FreeC}^{Z}$}{\footnotesize\par} +$\text{FreeC}^{Z}$ is a functor in $Z$; {\footnotesize{}$\text{fmap}_{\text{FreeC}}:\left(Y\rightarrow Z\right)\rightarrow\text{FreeC}^{Y}\rightarrow\text{FreeC}^{Z}$}{\footnotesize\par} {\footnotesize{}\vspace{-0.45cm}}% \begin{minipage}[t]{0.64\columnwidth}% \begin{itemize} \item For a $P^{:C}$ we can implement the functions {\footnotesize{} \begin{align*} -\text{run}^{P} & :\left(Z\Rightarrow P\right)\Rightarrow\text{FreeC}^{Z}\Rightarrow P\\ -\text{wrap} & :Z\Rightarrow\text{FreeC}^{Z} +\text{run}^{P} & :\left(Z\rightarrow P\right)\rightarrow\text{FreeC}^{Z}\rightarrow P\\ +\text{wrap} & :Z\rightarrow\text{FreeC}^{Z} \end{align*} } \end{itemize} @@ -1408,8 +1408,8 @@ \subsection{Laws for free typeclass constructions} \begin{minipage}[t]{0.36\columnwidth}% {\footnotesize{} \[ -\xymatrix{\xyScaleY{1.5pc}\xyScaleX{5pc}\text{FreeC}^{Y}\ar[d]\sb(0.45){\text{fmap}\,f^{:Y\Rightarrow Z}}\ar[rd]\sp(0.65){\ \text{run}\left(f\bef g\right)}\\ -\text{FreeC}^{Z}\ar[r]\sp(0.5){\text{run}(g^{:Z\Rightarrow P})} & P +\xymatrix{\xyScaleY{1.5pc}\xyScaleX{5pc}\text{FreeC}^{Y}\ar[d]\sb(0.45){\text{fmap}\,f^{:Y\rightarrow Z}}\ar[rd]\sp(0.65){\ \text{run}\left(f\bef g\right)}\\ +\text{FreeC}^{Z}\ar[r]\sp(0.5){\text{run}(g^{:Z\rightarrow P})} & P } \] }% @@ -1419,26 +1419,26 @@ \subsection{Laws for free typeclass constructions} law 2: {\footnotesize{}$\text{fmap}\,f\bef\text{run}\,g=\text{run}\left(f\bef g\right)$} (naturality of \texttt{\textcolor{blue}{\footnotesize{}run}}) -For any $P^{:C},Q^{:C},g^{:Z\Rightarrow P}$, and a typeclass-preserving -$f^{:P\Rightarrow Q}$, we have{\footnotesize{} +For any $P^{:C},Q^{:C},g^{:Z\rightarrow P}$, and a typeclass-preserving +$f^{:P\rightarrow Q}$, we have{\footnotesize{} \[ \text{run}^{P}(g)\bef f=\text{run}^{Q}\left(g\bef f\right)\quad\quad\text{\textendash\ \textquotedblleft universal property\textquotedblright\ of }\text{run} \] \[ -\xymatrix{\xyScaleY{2.0pc}\xyScaleX{3pc}\text{FreeC}^{Z}\ar[d]\sb(0.4){\text{run}^{P}(g^{:Z\Rightarrow P})}\ar[rd]\sp(0.55){\quad\text{run}^{Q}(g\bef f)} & & & C^{P}\ar[d]\sb(0.4){\text{fmap}_{S}f}\ar[r]\sp(0.5){\text{ops}_{P}} & P\ar[d]\sb(0.4){f}\\ -P\ar[r]\sp(0.5){f^{:P\Rightarrow Q}} & Q & & C^{Q}\ar[r]\sp(0.5){\text{ops}_{Q}} & Q +\xymatrix{\xyScaleY{2.0pc}\xyScaleX{3pc}\text{FreeC}^{Z}\ar[d]\sb(0.4){\text{run}^{P}(g^{:Z\rightarrow P})}\ar[rd]\sp(0.55){\quad\text{run}^{Q}(g\bef f)} & & & C^{P}\ar[d]\sb(0.4){\text{fmap}_{S}f}\ar[r]\sp(0.5){\text{ops}_{P}} & P\ar[d]\sb(0.4){f}\\ +P\ar[r]\sp(0.5){f^{:P\rightarrow Q}} & Q & & C^{Q}\ar[r]\sp(0.5){\text{ops}_{Q}} & Q } \] }{\footnotesize\par} -$f^{:P\Rightarrow Q}$ \textbf{preserves typeclass} $C$ if the diagram +$f^{:P\rightarrow Q}$ \textbf{preserves typeclass} $C$ if the diagram on the right commutes \subsection{Combining the generating constructors in a free typeclass} Consider $\text{FreeC}^{Z}$ for an inductive typeclass $C$ with -methods $C^{X}\Rightarrow X$ +methods $C^{X}\rightarrow X$ We would like to combine generating constructors $Z_{1}$, $Z_{2}$, etc. @@ -1455,21 +1455,21 @@ \subsection{Combining the generating constructors in a free typeclass} Church encoding makes this easier to manage: -{\footnotesize{}$\text{FreeC}^{Z}\equiv\forall X.\left(Z\Rightarrow X\right)\times\big(C^{X}\Rightarrow X\big)\Rightarrow X$} +{\footnotesize{}$\text{FreeC}^{Z}\equiv\forall X.\left(Z\rightarrow X\right)\times\big(C^{X}\rightarrow X\big)\rightarrow X$} and then {\footnotesize{} \[ -\text{FreeC}^{Z_{1}+Z_{2}}\equiv\forall X.\left(Z_{1}\Rightarrow X\right)\times\left(Z_{2}\Rightarrow X\right)\times\big(C^{X}\Rightarrow X\big)\Rightarrow X +\text{FreeC}^{Z_{1}+Z_{2}}\equiv\forall X.\left(Z_{1}\rightarrow X\right)\times\left(Z_{2}\rightarrow X\right)\times\big(C^{X}\rightarrow X\big)\rightarrow X \] }{\footnotesize\par} -Encode the functions $Z_{i}\Rightarrow X$ via typeclasses \texttt{\textcolor{blue}{\footnotesize{}ExZ1}}, +Encode the functions $Z_{i}\rightarrow X$ via typeclasses \texttt{\textcolor{blue}{\footnotesize{}ExZ1}}, \texttt{\textcolor{blue}{\footnotesize{}ExZ2}}, etc., where typeclass -\texttt{\textcolor{blue}{\footnotesize{}ExZ1}} has method $Z_{1}\Rightarrow X$, +\texttt{\textcolor{blue}{\footnotesize{}ExZ1}} has method $Z_{1}\rightarrow X$, etc. Then {\footnotesize{} \[ -\text{FreeC}^{Z_{1}+Z_{2}}=\forall X^{:E_{Z_{1}}:E_{Z_{2}}}.\big(C^{X}\Rightarrow X\big)\Rightarrow X +\text{FreeC}^{Z_{1}+Z_{2}}=\forall X^{:E_{Z_{1}}:E_{Z_{2}}}.\big(C^{X}\rightarrow X\big)\rightarrow X \] }or equivalently{\footnotesize{} \[ @@ -1499,7 +1499,7 @@ \subsection{Combining different free typeclasses} Option 2: use disjunction of method functors, $C^{X}\equiv C_{1}^{X}+C_{2}^{X}$, and build the free typeclass instance using $C^{X}$ -Church encoding: $\text{FreeC}_{12}^{Z}\equiv\forall X.\left(Z\Rightarrow X\right)\times\big(C_{1}^{X}+C_{2}^{X}\Rightarrow X\big)\Rightarrow X$ +Church encoding: $\text{FreeC}_{12}^{Z}\equiv\forall X.\left(Z\rightarrow X\right)\times\big(C_{1}^{X}+C_{2}^{X}\rightarrow X\big)\rightarrow X$ Example 1: $C_{1}$ is functor, $C_{2}$ is contrafunctor @@ -1527,31 +1527,31 @@ \subsection{Exercises} into a lawful semigroup $S$. Type $P$ is of typeclass $\text{Mod}_{L}$ (called ``$L$-module'') -if a fixed monoid $L$ ``acts'' on $P$ via act$:L\Rightarrow P\Rightarrow P$, +if a fixed monoid $L$ ``acts'' on $P$ via act$:L\rightarrow P\rightarrow P$, with laws $\text{act}\,x\bef\text{act}\,y=\text{act}\left(x\bef y\right)$ and $\text{act}\left(1^{:L}\right)=\text{id}$. Show that $\text{Mod}_{L}$ is an inductive typeclass. Implement a free $L$-module over a type $Z$. -Implement a monadic DSL with operations put$:A\Rightarrow1$ and get$:A$; +Implement a monadic DSL with operations put$:A\rightarrow1$ and get$:A$; run examples. Implement the Church encoding of the type constructor $P^{A}\equiv\text{Int}+A\times A$. For the resulting type constructor, implement a Functor instance. Describe the monoid type class via a method functor $C^{\bullet}$ -(such that the monoid's operations are combined into the type $S^{M}\Rightarrow M$). +(such that the monoid's operations are combined into the type $S^{M}\rightarrow M$). Using $S^{\bullet}$, implement the free monoid over a type $Z$ in the Church encoding. -Assuming that $F^{\bullet}$ is a functor, define $Q^{A}\equiv\exists Z.F^{Z}\times\left(Z\Rightarrow A\right)$ -and implement f2q$:F^{A}\Rightarrow Q^{A}$ and q2f$:Q^{A}\Rightarrow F^{A}$. +Assuming that $F^{\bullet}$ is a functor, define $Q^{A}\equiv\exists Z.F^{Z}\times\left(Z\rightarrow A\right)$ +and implement f2q$:F^{A}\rightarrow Q^{A}$ and q2f$:Q^{A}\rightarrow F^{A}$. Show that these functions are natural transformations, and that they are inverses of each other ``observationally'', i.e.~after applying q2f in order to compare values of $Q^{A}$. Show: $\forall X.X=0$; $\exists Z.Z\cong1$; $\exists Z.Z\times A\cong A$; -$\forall A.\left(A\times A\times A\Rightarrow A\right)\cong1+1+1$. +$\forall A.\left(A\times A\times A\rightarrow A\right)\cong1+1+1$. Derive a reduced encoding for a free applicative functor over a pointed functor. @@ -1566,9 +1566,9 @@ \subsection{Corrections} The slides say that the ``universal property'' of the runner is $\text{run}^{P}g\bef f=\text{run}^{Q}\left(g\bef f\right)$, however, -this is not true; it is the right naturality property of $\text{run}^{P}:\left(Z\Rightarrow P\right)\Rightarrow\text{FreeC}^{Z}\Rightarrow P$ +this is not true; it is the right naturality property of $\text{run}^{P}:\left(Z\rightarrow P\right)\rightarrow\text{FreeC}^{Z}\rightarrow P$ with respect to the type parameter $P$. The universal property is -$f=\text{wrap}\bef\text{run}^{P}f$ for any $f:Z\Rightarrow P$ and +$f=\text{wrap}\bef\text{run}^{P}f$ for any $f:Z\rightarrow P$ and any type $P$ that belongs to the typeclass $C$. \section{Discussion} diff --git a/sofp-src/sofp-functors.lyx b/sofp-src/sofp-functors.lyx index 15d11c2a4..f808b808a 100644 --- a/sofp-src/sofp-functors.lyx +++ b/sofp-src/sofp-functors.lyx @@ -109,15 +109,13 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} \def\mathunderline#1#2{\color{#1}\underline{{\color{black}#2}}\color{black}} % The LyX document will define a macro \gunderline{#1} that will use \mathunderline with the color `greenunder`. %\def\gunderline#1{\mathunderline{greenunder}{#1}} % This is now defined by LyX itself with GUI support. + \end_preamble \options open=any,numbers=noenddot,index=totoc,bibliography=totoc,listof=totoc,fontsize=10pt \use_default_options true @@ -751,7 +749,7 @@ status open \end_inset method will apply a given function -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset to the data of type @@ -998,7 +996,7 @@ map function is \begin_inset Formula \[ -\text{map}^{A,B}:\bbnum 1+A\Rightarrow\left(A\Rightarrow B\right)\Rightarrow\bbnum 1+B\quad. +\text{map}^{A,B}:\bbnum 1+A\rightarrow\left(A\rightarrow B\right)\rightarrow\bbnum 1+B\quad. \] \end_inset @@ -1182,11 +1180,11 @@ map(oa)(f) \end_inset and to choose the argument -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset to be the identity function -\begin_inset Formula $\text{id}^{:A\Rightarrow A}$ +\begin_inset Formula $\text{id}^{:A\rightarrow A}$ \end_inset (setting @@ -1465,7 +1463,7 @@ map is \begin_inset Formula \[ -\text{map}^{A,B}\triangleq p^{:\bbnum 1+A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow p\triangleright\begin{array}{|c||cc|} +\text{map}^{A,B}\triangleq p^{:\bbnum 1+A}\rightarrow f^{:A\rightarrow B}\rightarrow p\triangleright\begin{array}{|c||cc|} & \bbnum 1 & B\\ \hline \bbnum 1 & \text{id} & \bbnum 0\\ A & \bbnum 0 & f @@ -1519,7 +1517,7 @@ fmap , with the type signature \begin_inset Formula \[ -\text{fmap}^{A,B}:\left(A\Rightarrow B\right)\Rightarrow\bbnum 1+A\Rightarrow\bbnum 1+B\quad. +\text{fmap}^{A,B}:\left(A\rightarrow B\right)\rightarrow\bbnum 1+A\rightarrow\bbnum 1+B\quad. \] \end_inset @@ -1602,7 +1600,7 @@ def fmap[A, B](f: A => B): Option[A] => Option[B] = { The code notation for this function is \begin_inset Formula \begin{equation} -\text{fmap}\,(f^{:A\Rightarrow B})\triangleq\begin{array}{|c||cc|} +\text{fmap}\,(f^{:A\rightarrow B})\triangleq\begin{array}{|c||cc|} & \bbnum 1 & B\\ \hline \bbnum 1 & \text{id} & \bbnum 0\\ A & \bbnum 0 & f @@ -1708,7 +1706,7 @@ lifts \end_inset a function -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset operating on simple values into a function operating on @@ -1861,7 +1859,7 @@ Option using the incrementing function \begin_inset Formula \[ -\text{incr}\triangleq x^{:\text{Int}}\Rightarrow x+1\quad. +\text{incr}\triangleq x^{:\text{Int}}\rightarrow x+1\quad. \] \end_inset @@ -1929,7 +1927,7 @@ res1: Option[Int] = Some(2) \end_inset This result is the same as when applying a lifted function -\begin_inset Formula $x\Rightarrow x+2$ +\begin_inset Formula $x\rightarrow x+2$ \end_inset : @@ -2009,18 +2007,18 @@ c.map(incr).map(incr) \begin_layout Standard We can formulate this property more generally: liftings should preserve function composition for arbitrary functions -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset and -\begin_inset Formula $g^{:B\Rightarrow C}$ +\begin_inset Formula $g^{:B\rightarrow C}$ \end_inset . This is written as \begin_inset Formula \[ -\text{fmap}(f^{:A\Rightarrow B}\bef g^{:B\Rightarrow C})=\text{fmap}(f^{:A\Rightarrow B})\bef\text{fmap}(g^{:B\Rightarrow C})\quad. +\text{fmap}(f^{:A\rightarrow B}\bef g^{:B\rightarrow C})=\text{fmap}(f^{:A\rightarrow B})\bef\text{fmap}(g^{:B\rightarrow C})\quad. \] \end_inset @@ -2564,15 +2562,15 @@ noprefix "false" \begin_layout Standard For arbitrary functions -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset , -\begin_inset Formula $g^{:B\Rightarrow C}$ +\begin_inset Formula $g^{:B\rightarrow C}$ \end_inset , and -\begin_inset Formula $h^{:C\Rightarrow D}$ +\begin_inset Formula $h^{:C\rightarrow D}$ \end_inset , we have @@ -2683,7 +2681,7 @@ fmap with type signature \begin_inset Formula \[ -\text{fmap}_{L}:\left(A\Rightarrow B\right)\Rightarrow L^{A}\Rightarrow L^{B}\quad, +\text{fmap}_{L}:\left(A\rightarrow B\right)\rightarrow L^{A}\rightarrow L^{B}\quad, \] \end_inset @@ -2695,8 +2693,8 @@ fmap satisfying the laws \begin_inset Formula \begin{align} -\text{identity law for }L:\quad & \text{fmap}_{L}(\text{id}^{:A\Rightarrow A})=\text{id}^{:L^{A}\Rightarrow L^{A}}\quad,\label{eq:f-identity-law-functor-fmap}\\ -\text{composition law for }L:\quad & \text{fmap}_{L}(f^{:A\Rightarrow B}\bef g^{:B\Rightarrow C})=\text{fmap}_{L}(f^{:A\Rightarrow B})\bef\text{fmap}_{L}(g^{:B\Rightarrow C})\quad.\label{eq:f-composition-law-functor-fmap} +\text{identity law for }L:\quad & \text{fmap}_{L}(\text{id}^{:A\rightarrow A})=\text{id}^{:L^{A}\rightarrow L^{A}}\quad,\label{eq:f-identity-law-functor-fmap}\\ +\text{composition law for }L:\quad & \text{fmap}_{L}(f^{:A\rightarrow B}\bef g^{:B\rightarrow C})=\text{fmap}_{L}(f^{:A\rightarrow B})\bef\text{fmap}_{L}(g^{:B\rightarrow C})\quad.\label{eq:f-composition-law-functor-fmap} \end{align} \end_inset @@ -2811,8 +2809,8 @@ status open \begin_inset Formula \[ -\xymatrix{\xyScaleY{1.5pc}\xyScaleX{3pc} & L^{B}\ar[rd]\sp(0.6){~~\text{fmap}_{L}(g^{:B\Rightarrow C})}\\ -L^{A}\ar[ru]\sp(0.4){\text{fmap}_{L}(f^{:A\Rightarrow B})\ ~}\ar[rr]\sb(0.5){\text{fmap}_{L}(f^{:A\Rightarrow B}\bef g^{:B\Rightarrow C})\ } & & L^{C} +\xymatrix{\xyScaleY{1.5pc}\xyScaleX{3pc} & L^{B}\ar[rd]\sp(0.6){~~\text{fmap}_{L}(g^{:B\rightarrow C})}\\ +L^{A}\ar[ru]\sp(0.4){\text{fmap}_{L}(f^{:A\rightarrow B})\ ~}\ar[rr]\sb(0.5){\text{fmap}_{L}(f^{:A\rightarrow B}\bef g^{:B\rightarrow C})\ } & & L^{C} } \] @@ -2900,7 +2898,7 @@ noprefix "false" composition, \begin_inset Formula \[ -\text{fmap}_{L}(g^{:B\Rightarrow C}\circ f^{:A\Rightarrow B})=\text{fmap}_{L}(g^{:B\Rightarrow C})\circ\text{fmap}_{L}(f^{:A\Rightarrow B})\quad. +\text{fmap}_{L}(g^{:B\rightarrow C}\circ f^{:A\rightarrow B})=\text{fmap}_{L}(g^{:B\rightarrow C})\circ\text{fmap}_{L}(f^{:A\rightarrow B})\quad. \] \end_inset @@ -2948,8 +2946,8 @@ fmap by \begin_inset Formula \begin{align*} - & \text{map}_{L}:L^{A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow L^{B}\quad,\\ - & \text{map}_{L}(x^{:L^{A}})(f^{:A\Rightarrow B})=\text{fmap}_{L}(f^{:A\Rightarrow B})(x^{:L^{A}})\quad. + & \text{map}_{L}:L^{A}\rightarrow\left(A\rightarrow B\right)\rightarrow L^{B}\quad,\\ + & \text{map}_{L}(x^{:L^{A}})(f^{:A\rightarrow B})=\text{fmap}_{L}(f^{:A\rightarrow B})(x^{:L^{A}})\quad. \end{align*} \end_inset @@ -3872,7 +3870,7 @@ fmap method: \begin_inset Formula \[ -\text{fmap}_{\text{Counted}}(f^{:A\Rightarrow B})\triangleq\big(n^{:\text{Int}}\times a^{:A}\Rightarrow n\times f(a)\big)\quad. +\text{fmap}_{\text{Counted}}(f^{:A\rightarrow B})\triangleq\big(n^{:\text{Int}}\times a^{:A}\rightarrow n\times f(a)\big)\quad. \] \end_inset @@ -3881,8 +3879,8 @@ To verify the identity law, we write \begin_inset Formula \begin{align*} \text{expect to equal }\text{id}:\quad & \text{fmap}_{\text{Counted}}(\text{id})\\ -\text{definition of }\text{fmap}_{\text{Counted}}:\quad & =\big(n\times a\Rightarrow n\times\gunderline{\text{id}(a)}\big)\\ -\text{definition of }\text{id}:\quad & =\left(n\times a\Rightarrow n\times a\right)=\text{id}\quad. +\text{definition of }\text{fmap}_{\text{Counted}}:\quad & =\big(n\times a\rightarrow n\times\gunderline{\text{id}(a)}\big)\\ +\text{definition of }\text{id}:\quad & =\left(n\times a\rightarrow n\times a\right)=\text{id}\quad. \end{align*} \end_inset @@ -3891,9 +3889,9 @@ To verify the composition law, \begin_inset Formula \begin{align*} \text{expect to equal }\text{fmap}_{\text{Counted}}(f\bef g):\quad & \text{fmap}_{\text{Counted}}(f)\bef\text{fmap}_{\text{Counted}}(g)\\ -\text{definition of }\text{fmap}_{\text{Counted}}:\quad & =\left(n\times a\Rightarrow n\times f(a)\right)\bef\left(n\times b\Rightarrow n\times g(b)\right)\\ -\text{compute composition}:\quad & =n\times a\Rightarrow n\times\gunderline{g(f(a))}\\ -\text{definition of }\left(f\bef g\right):\quad & =\left(n\times a\Rightarrow n\times(f\bef g)(a)\right)=\text{fmap}_{\text{Counted}}(f\bef g)\quad. +\text{definition of }\text{fmap}_{\text{Counted}}:\quad & =\left(n\times a\rightarrow n\times f(a)\right)\bef\left(n\times b\rightarrow n\times g(b)\right)\\ +\text{compute composition}:\quad & =n\times a\rightarrow n\times\gunderline{g(f(a))}\\ +\text{definition of }\left(f\bef g\right):\quad & =\left(n\times a\rightarrow n\times(f\bef g)(a)\right)=\text{fmap}_{\text{Counted}}(f\bef g)\quad. \end{align*} \end_inset @@ -4290,7 +4288,7 @@ fmap is \begin_inset Formula \[ -\text{fmap}_{\text{Vec}_{3}}(f^{:A\Rightarrow B})\triangleq x^{:A}\times y^{:A}\times z^{:A}\Rightarrow f(x)\times f(y)\times f(z)\quad. +\text{fmap}_{\text{Vec}_{3}}(f^{:A\rightarrow B})\triangleq x^{:A}\times y^{:A}\times z^{:A}\rightarrow f(x)\times f(y)\times f(z)\quad. \] \end_inset @@ -7412,7 +7410,7 @@ Consider the type constructor defined by \begin_inset Formula \[ -C^{A}\triangleq A\Rightarrow\text{Int}\quad. +C^{A}\triangleq A\rightarrow\text{Int}\quad. \] \end_inset @@ -7469,7 +7467,7 @@ map function with the required type signature \begin_inset Formula \[ -\text{map}^{A,B}:\left(A\Rightarrow\text{Int}\right)\Rightarrow\left(A\Rightarrow B\right)\Rightarrow\left(B\Rightarrow\text{Int}\right)\quad. +\text{map}^{A,B}:\left(A\rightarrow\text{Int}\right)\rightarrow\left(A\rightarrow B\right)\rightarrow\left(B\rightarrow\text{Int}\right)\quad. \] \end_inset @@ -7566,7 +7564,7 @@ Int , we obtain the type signature \begin_inset Formula \[ -\text{map}^{A,B,N}:\left(A\Rightarrow N\right)\Rightarrow\left(A\Rightarrow B\right)\Rightarrow B\Rightarrow N\quad. +\text{map}^{A,B,N}:\left(A\rightarrow N\right)\rightarrow\left(A\rightarrow B\right)\rightarrow B\rightarrow N\quad. \] \end_inset @@ -8034,7 +8032,7 @@ map An example of a non-functor of the second kind is \begin_inset Formula \[ -Q^{A}\triangleq\left(A\Rightarrow\text{Int}\right)\times A\quad. +Q^{A}\triangleq\left(A\rightarrow\text{Int}\right)\times A\quad. \] \end_inset @@ -8070,7 +8068,7 @@ can be implemented (and there is only one such implementation): \begin_inset Formula \[ -\text{map}^{A,B}\triangleq q^{:A\Rightarrow\text{Int}}\times a^{:A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow(\_\Rightarrow q(a))^{:B\Rightarrow\text{Int}}\times f(a)\quad. +\text{map}^{A,B}\triangleq q^{:A\rightarrow\text{Int}}\times a^{:A}\rightarrow f^{:A\rightarrow B}\rightarrow(\_\rightarrow q(a))^{:B\rightarrow\text{Int}}\times f(a)\quad. \] \end_inset @@ -8156,26 +8154,26 @@ Int as a type parameter) and has the right type signature, but the functor laws do not hold. To show that the identity law fails, we consider an arbitrary value -\begin_inset Formula $q^{:A\Rightarrow\text{Int}}\times a^{:A}$ +\begin_inset Formula $q^{:A\rightarrow\text{Int}}\times a^{:A}$ \end_inset and compute: \begin_inset Formula \begin{align*} \text{expect to equal }q\times a:\quad & \text{map}(q\times a)(\text{id})\\ -\text{definition of }\text{map}:\quad & =(\_\Rightarrow q(a))\times\gunderline{\text{id}(a)}\\ -\text{definition of }\text{id}:\quad & =(\_\Rightarrow q(a))\times a\\ -\text{expanded function, }q=\left(x\Rightarrow q(x)\right):\quad & \quad\neq q\times a=(x\Rightarrow q(x))\times a\quad. +\text{definition of }\text{map}:\quad & =(\_\rightarrow q(a))\times\gunderline{\text{id}(a)}\\ +\text{definition of }\text{id}:\quad & =(\_\rightarrow q(a))\times a\\ +\text{expanded function, }q=\left(x\rightarrow q(x)\right):\quad & \quad\neq q\times a=(x\rightarrow q(x))\times a\quad. \end{align*} \end_inset The law must hold for arbitrary functions -\begin_inset Formula $q^{:A\Rightarrow\text{Int}}$ +\begin_inset Formula $q^{:A\rightarrow\text{Int}}$ \end_inset , but the function -\begin_inset Formula $\left(\_\Rightarrow q(a)\right)$ +\begin_inset Formula $\left(\_\rightarrow q(a)\right)$ \end_inset always returns the same value @@ -8282,7 +8280,7 @@ map function \begin_inset Formula \[ -\text{map}\triangleq x^{:A}\times y^{:A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow f(y)\times f(x)\quad. +\text{map}\triangleq x^{:A}\times y^{:A}\rightarrow f^{:A\rightarrow B}\rightarrow f(y)\times f(x)\quad. \] \end_inset @@ -8340,7 +8338,7 @@ map , \begin_inset Formula \[ -\text{map}\triangleq x^{:A}\times y^{:A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow f(x)\times f(y)\quad, +\text{map}\triangleq x^{:A}\times y^{:A}\rightarrow f^{:A\rightarrow B}\rightarrow f(x)\times f(y)\quad, \] \end_inset @@ -9621,7 +9619,7 @@ The functor laws for a type constructor used in the function \begin_inset Formula \[ -\text{fmap}_{L}:\left(A\Rightarrow B\right)\Rightarrow L^{A}\Rightarrow L^{B} +\text{fmap}_{L}:\left(A\rightarrow B\right)\rightarrow L^{A}\rightarrow L^{B} \] \end_inset @@ -9911,7 +9909,7 @@ noprefix "false" \end_inset defined by -\begin_inset Formula $C^{A}\triangleq A\Rightarrow\text{Int}$ +\begin_inset Formula $C^{A}\triangleq A\rightarrow\text{Int}$ \end_inset is not a functor because it is impossible to implement the type signature @@ -9930,7 +9928,7 @@ map for it, \begin_inset Formula \[ -\text{map}^{A,B}:\left(A\Rightarrow\text{Int}\right)\Rightarrow\left(A\Rightarrow B\right)\Rightarrow B\Rightarrow\text{Int}\quad. +\text{map}^{A,B}:\left(A\rightarrow\text{Int}\right)\rightarrow\left(A\rightarrow B\right)\rightarrow B\rightarrow\text{Int}\quad. \] \end_inset @@ -9938,13 +9936,13 @@ map To see why, begin writing the code with a typed hole, \begin_inset Formula \[ -\text{map}(c^{:A\Rightarrow\text{Int}})(f^{:A\Rightarrow B})(b^{:B})=\text{???}^{:\text{Int}}\quad. +\text{map}(c^{:A\rightarrow\text{Int}})(f^{:A\rightarrow B})(b^{:B})=\text{???}^{:\text{Int}}\quad. \] \end_inset Since -\begin_inset Formula $c^{:A\Rightarrow\text{Int}}$ +\begin_inset Formula $c^{:A\rightarrow\text{Int}}$ \end_inset consumes (rather than wraps) values of type @@ -9956,12 +9954,12 @@ Since \end_inset and cannot apply the function -\begin_inset Formula $c^{:A\Rightarrow\text{Int}}$ +\begin_inset Formula $c^{:A\rightarrow\text{Int}}$ \end_inset . However, it would be possible to apply a function of type -\begin_inset Formula $B\Rightarrow A$ +\begin_inset Formula $B\rightarrow A$ \end_inset since a value of type @@ -9986,17 +9984,17 @@ contramap \end_inset with a different type signature where the function type is -\begin_inset Formula $B\Rightarrow A$ +\begin_inset Formula $B\rightarrow A$ \end_inset instead of -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset : \begin_inset Formula \[ -\text{contramap}^{A,B}:\left(A\Rightarrow\text{Int}\right)\Rightarrow\left(B\Rightarrow A\right)\Rightarrow B\Rightarrow\text{Int}\quad. +\text{contramap}^{A,B}:\left(A\rightarrow\text{Int}\right)\rightarrow\left(B\rightarrow A\right)\rightarrow B\rightarrow\text{Int}\quad. \] \end_inset @@ -10004,7 +10002,7 @@ contramap The implementation of this function is written in the code notation as \begin_inset Formula \[ -\text{contramap}\triangleq c^{:A\Rightarrow\text{Int}}\Rightarrow f^{:B\Rightarrow A}\Rightarrow\left(f\bef c\right)^{:B\Rightarrow\text{Int}}\quad, +\text{contramap}\triangleq c^{:A\rightarrow\text{Int}}\rightarrow f^{:B\rightarrow A}\rightarrow\left(f\bef c\right)^{:B\rightarrow\text{Int}}\quad, \] \end_inset @@ -10048,8 +10046,8 @@ cmap as \begin_inset Formula \begin{align} -\text{cmap}^{A,B} & :\left(B\Rightarrow A\right)\Rightarrow C^{A}\Rightarrow C^{B}\quad,\nonumber \\ -\text{cmap} & \triangleq f^{:B\Rightarrow A}\Rightarrow c^{:A\Rightarrow\text{Int}}\Rightarrow\left(f\bef c\right)^{:B\Rightarrow\text{Int}}\quad.\label{eq:f-example-1-contrafmap} +\text{cmap}^{A,B} & :\left(B\rightarrow A\right)\rightarrow C^{A}\rightarrow C^{B}\quad,\nonumber \\ +\text{cmap} & \triangleq f^{:B\rightarrow A}\rightarrow c^{:A\rightarrow\text{Int}}\rightarrow\left(f\bef c\right)^{:B\rightarrow\text{Int}}\quad.\label{eq:f-example-1-contrafmap} \end{align} \end_inset @@ -10138,8 +10136,8 @@ cmap satisfies two laws analogous to the functor laws: \begin_inset Formula \begin{align*} -\text{identity law}:\quad & \text{cmap}^{A,A}(\text{id}^{:A\Rightarrow A})=\text{id}^{:C^{A}\Rightarrow C^{A}}\quad,\\ -\text{composition law}:\quad & \text{cmap}^{A,B}(f^{:B\Rightarrow A})\bef\text{cmap}^{B,D}(g^{:D\Rightarrow B})=\text{cmap}(g\bef f)\quad. +\text{identity law}:\quad & \text{cmap}^{A,A}(\text{id}^{:A\rightarrow A})=\text{id}^{:C^{A}\rightarrow C^{A}}\quad,\\ +\text{composition law}:\quad & \text{cmap}^{A,B}(f^{:B\rightarrow A})\bef\text{cmap}^{B,D}(g^{:D\rightarrow B})=\text{cmap}(g\bef f)\quad. \end{align*} \end_inset @@ -10162,8 +10160,8 @@ status open \begin_inset Formula \[ -\xymatrix{\xyScaleY{1.5pc}\xyScaleX{3pc} & C^{B}\ar[rd]\sp(0.6){\ ~\text{cmap}_{C}(g^{:D\Rightarrow B})}\\ -C^{A}\ar[ru]\sp(0.4){\text{cmap}_{C}(f^{:B\Rightarrow A})\ }\ar[rr]\sb(0.5){\text{cmap}_{C}(g^{:D\Rightarrow B}\bef f^{:B\Rightarrow A})\ ~} & & C^{D} +\xymatrix{\xyScaleY{1.5pc}\xyScaleX{3pc} & C^{B}\ar[rd]\sp(0.6){\ ~\text{cmap}_{C}(g^{:D\rightarrow B})}\\ +C^{A}\ar[ru]\sp(0.4){\text{cmap}_{C}(f^{:B\rightarrow A})\ }\ar[rr]\sb(0.5){\text{cmap}_{C}(g^{:D\rightarrow B}\bef f^{:B\rightarrow A})\ ~} & & C^{D} } \] @@ -10187,7 +10185,7 @@ C^{A}\ar[ru]\sp(0.4){\text{cmap}_{C}(f^{:B\Rightarrow A})\ }\ar[rr]\sb(0.5){\tex \begin_layout Standard \noindent Since the function argument -\begin_inset Formula $f^{:B\Rightarrow A}$ +\begin_inset Formula $f^{:B\rightarrow A}$ \end_inset has the reverse order of types, the composition law reverses the order @@ -10200,8 +10198,8 @@ Since the function argument \begin_inset Formula \begin{align*} \text{expect to equal }\text{id}:\quad & \text{cmap}\left(\text{id}\right)\\ -\text{use Eq.~(\ref{eq:f-example-1-contrafmap})}:\quad & =c\Rightarrow\gunderline{(\text{id}\bef c)}\\ -\text{definition of }\text{id}:\quad & =\left(c\Rightarrow c\right)=\text{id}\quad. +\text{use Eq.~(\ref{eq:f-example-1-contrafmap})}:\quad & =c\rightarrow\gunderline{(\text{id}\bef c)}\\ +\text{definition of }\text{id}:\quad & =\left(c\rightarrow c\right)=\text{id}\quad. \end{align*} \end_inset @@ -10210,9 +10208,9 @@ To verify the composition law: \begin_inset Formula \begin{align*} \text{expect to equal }\text{cmap}\left(g\bef f\right):\quad & \text{cmap}\left(f\right)\bef\text{cmap}\left(g\right)\\ -\text{use Eq.~(\ref{eq:f-example-1-contrafmap})}:\quad & =\left(c\Rightarrow(f\bef c)\right)\bef(\gunderline c\Rightarrow(g\bef\gunderline c))\\ -\text{rename }c\text{ to }d\text{ for clarity}:\quad & =\left(c\Rightarrow(f\bef c)\right)\bef\left(d\Rightarrow(g\bef d)\right)\\ -\text{compute composition}:\quad & =\left(c\Rightarrow g\bef f\bef c\right)\\ +\text{use Eq.~(\ref{eq:f-example-1-contrafmap})}:\quad & =\left(c\rightarrow(f\bef c)\right)\bef(\gunderline c\rightarrow(g\bef\gunderline c))\\ +\text{rename }c\text{ to }d\text{ for clarity}:\quad & =\left(c\rightarrow(f\bef c)\right)\bef\left(d\rightarrow(g\bef d)\right)\\ +\text{compute composition}:\quad & =\left(c\rightarrow g\bef f\bef c\right)\\ \text{use Eq.~(\ref{eq:f-example-1-contrafmap})}:\quad & =\text{cmap}\left(g\bef f\right)\quad. \end{align*} @@ -10274,7 +10272,7 @@ noprefix "false" \begin_layout Standard Show that the type constructor -\begin_inset Formula $D^{A}\triangleq A\Rightarrow A\Rightarrow\text{Int}$ +\begin_inset Formula $D^{A}\triangleq A\rightarrow A\rightarrow\text{Int}$ \end_inset is a contrafunctor. @@ -10324,7 +10322,7 @@ contramap by writing code with a typed hole: \begin_inset Formula \[ -\text{contramap}^{A,B}\triangleq d^{:A\Rightarrow A\Rightarrow\text{Int}}\Rightarrow f^{:B\Rightarrow A}\Rightarrow b_{1}^{:B}\Rightarrow b_{2}^{:B}\Rightarrow\text{???}^{:\text{Int}}\quad. +\text{contramap}^{A,B}\triangleq d^{:A\rightarrow A\rightarrow\text{Int}}\rightarrow f^{:B\rightarrow A}\rightarrow b_{1}^{:B}\rightarrow b_{2}^{:B}\rightarrow\text{???}^{:\text{Int}}\quad. \] \end_inset @@ -10357,7 +10355,7 @@ Int . So we apply -\begin_inset Formula $f^{:B\Rightarrow A}$ +\begin_inset Formula $f^{:B\rightarrow A}$ \end_inset to those arguments, obtaining two values of type @@ -10370,7 +10368,7 @@ Int So the resulting expression is \begin_inset Formula \[ -\text{contramap}^{A,B}\triangleq d^{:A\Rightarrow A\Rightarrow\text{Int}}\Rightarrow f^{:B\Rightarrow A}\Rightarrow b_{1}^{:B}\Rightarrow b_{2}^{:B}\Rightarrow d\left(f(b_{1})\right)\left(f(b_{2})\right)\quad. +\text{contramap}^{A,B}\triangleq d^{:A\rightarrow A\rightarrow\text{Int}}\rightarrow f^{:B\rightarrow A}\rightarrow b_{1}^{:B}\rightarrow b_{2}^{:B}\rightarrow d\left(f(b_{1})\right)\left(f(b_{2})\right)\quad. \] \end_inset @@ -10403,7 +10401,7 @@ cmap defined by \begin_inset Formula \begin{equation} -\text{cmap}^{A,B}(f^{:B\Rightarrow A})\triangleq d^{:A\Rightarrow A\Rightarrow\text{Int}}\Rightarrow b_{1}^{:B}\Rightarrow b_{2}^{:B}\Rightarrow d\left(f(b_{1})\right)\left(f(b_{2})\right)\quad.\label{eq:f-example-2-contrafmap} +\text{cmap}^{A,B}(f^{:B\rightarrow A})\triangleq d^{:A\rightarrow A\rightarrow\text{Int}}\rightarrow b_{1}^{:B}\rightarrow b_{2}^{:B}\rightarrow d\left(f(b_{1})\right)\left(f(b_{2})\right)\quad.\label{eq:f-example-2-contrafmap} \end{equation} \end_inset @@ -10412,9 +10410,9 @@ To verify the identity law: \begin_inset Formula \begin{align*} \text{expect to equal }\text{id}:\quad & \text{cmap}\left(\text{id}\right)\\ -\text{use Eq.~(\ref{eq:f-example-2-contrafmap})}:\quad & =d\Rightarrow b_{1}\Rightarrow b_{2}\Rightarrow d\gunderline{\left(\text{id}(b_{1})\right)}\gunderline{\left(\text{id}(b_{2})\right)}\\ -\text{definition of }\text{id}:\quad & =d\Rightarrow\gunderline{b_{1}\Rightarrow b_{2}\Rightarrow d(b_{1})(b_{2})}\\ -\text{simplify curried function}:\quad & =\left(d\Rightarrow d\right)=\text{id}\quad. +\text{use Eq.~(\ref{eq:f-example-2-contrafmap})}:\quad & =d\rightarrow b_{1}\rightarrow b_{2}\rightarrow d\gunderline{\left(\text{id}(b_{1})\right)}\gunderline{\left(\text{id}(b_{2})\right)}\\ +\text{definition of }\text{id}:\quad & =d\rightarrow\gunderline{b_{1}\rightarrow b_{2}\rightarrow d(b_{1})(b_{2})}\\ +\text{simplify curried function}:\quad & =\left(d\rightarrow d\right)=\text{id}\quad. \end{align*} \end_inset @@ -10424,10 +10422,10 @@ To verify the composition law, we rewrite its left-hand side into the right-hand \begin_inset Formula \begin{align*} & \text{cmap}\left(f\right)\bef\text{cmap}\left(g\right)\\ -\text{use Eq.~(\ref{eq:f-example-2-contrafmap})}:\quad & =\left(d\Rightarrow b_{1}\Rightarrow b_{2}\Rightarrow d\left(f(b_{1})\right)\left(f(b_{2})\right)\right)\bef(\gunderline d\Rightarrow b_{1}\Rightarrow b_{2}\Rightarrow\gunderline d\left(g(b_{1})\right)\left(g(b_{2})\right))\\ -\text{rename }d\text{ to }e:\quad & =\left(d\Rightarrow b_{1}\Rightarrow b_{2}\Rightarrow d\left(f(b_{1})\right)\left(f(b_{2})\right)\right)\bef\left(e\Rightarrow b_{1}\Rightarrow b_{2}\Rightarrow e\left(g(b_{1})\right)\left(g(b_{2})\right)\right)\\ -\text{compute composition}:\quad & =d\Rightarrow b_{1}\Rightarrow b_{2}\Rightarrow d\left(f(g(b_{1}))\right)\left(f(g(b_{2}))\right)\\ -\text{use Eq.~(\ref{eq:f-example-2-contrafmap})}:\quad & =\text{cmap}(b\Rightarrow f(g(b)))\\ +\text{use Eq.~(\ref{eq:f-example-2-contrafmap})}:\quad & =\left(d\rightarrow b_{1}\rightarrow b_{2}\rightarrow d\left(f(b_{1})\right)\left(f(b_{2})\right)\right)\bef(\gunderline d\rightarrow b_{1}\rightarrow b_{2}\rightarrow\gunderline d\left(g(b_{1})\right)\left(g(b_{2})\right))\\ +\text{rename }d\text{ to }e:\quad & =\left(d\rightarrow b_{1}\rightarrow b_{2}\rightarrow d\left(f(b_{1})\right)\left(f(b_{2})\right)\right)\bef\left(e\rightarrow b_{1}\rightarrow b_{2}\rightarrow e\left(g(b_{1})\right)\left(g(b_{2})\right)\right)\\ +\text{compute composition}:\quad & =d\rightarrow b_{1}\rightarrow b_{2}\rightarrow d\left(f(g(b_{1}))\right)\left(f(g(b_{2}))\right)\\ +\text{use Eq.~(\ref{eq:f-example-2-contrafmap})}:\quad & =\text{cmap}(b\rightarrow f(g(b)))\\ \text{definition of }\left(g\bef f\right):\quad & =\text{cmap}(g\bef f)\quad. \end{align*} @@ -10481,7 +10479,7 @@ wrap \end_inset or -\begin_inset Formula $A\Rightarrow A\Rightarrow\text{Int}$ +\begin_inset Formula $A\rightarrow A\rightarrow\text{Int}$ \end_inset , we can see whether the type parameter is @@ -10548,7 +10546,7 @@ and An example of such a type constructor is \begin_inset Formula \[ -N^{A}\triangleq\left(A\Rightarrow\text{Int}\right)\times\left(\bbnum 1+A\right)\quad. +N^{A}\triangleq\left(A\rightarrow\text{Int}\right)\times\left(\bbnum 1+A\right)\quad. \] \end_inset @@ -10714,12 +10712,12 @@ type conversion function type conversion \series default function of type -\begin_inset Formula $P\Rightarrow Q$ +\begin_inset Formula $P\rightarrow Q$ \end_inset that the compiler will automatically use whenever necessary to match types. For instance, applying a function of type -\begin_inset Formula $Q\Rightarrow Z$ +\begin_inset Formula $Q\rightarrow Z$ \end_inset to a value of type @@ -10757,7 +10755,7 @@ However, this code will work when \end_inset because the compiler will automatically use the type conversion -\begin_inset Formula $P\Rightarrow Q$ +\begin_inset Formula $P\rightarrow Q$ \end_inset before applying the function @@ -11008,13 +11006,13 @@ def p2q(f: P): Q = { t: Two => f(t) } This is written in the code notation as \begin_inset Formula \[ -\text{p2q}(f^{:\text{AtMostTwo}\Rightarrow\text{Int}})\triangleq t^{:\text{Two}}\Rightarrow f(t)\quad. +\text{p2q}(f^{:\text{AtMostTwo}\rightarrow\text{Int}})\triangleq t^{:\text{Two}}\rightarrow f(t)\quad. \] \end_inset Note that -\begin_inset Formula $t^{:\text{Two}}\Rightarrow f(t)$ +\begin_inset Formula $t^{:\text{Two}}\rightarrow f(t)$ \end_inset is the same function as @@ -11333,13 +11331,13 @@ If a type constructor \end_inset method to lift a type conversion function -\begin_inset Formula $f:P\Rightarrow Q$ +\begin_inset Formula $f:P\rightarrow Q$ \end_inset into \begin_inset Formula \[ -\text{fmap}_{L}(f):L^{P}\Rightarrow L^{Q}\quad, +\text{fmap}_{L}(f):L^{P}\rightarrow L^{Q}\quad, \] \end_inset @@ -11383,13 +11381,13 @@ If a type constructor \end_inset is a contrafunctor, a type conversion function -\begin_inset Formula $f^{:P\Rightarrow Q}$ +\begin_inset Formula $f^{:P\rightarrow Q}$ \end_inset is lifted to \begin_inset Formula \[ -\text{cmap}_{C}(f):C^{Q}\Rightarrow C^{P}\quad, +\text{cmap}_{C}(f):C^{Q}\rightarrow C^{P}\quad, \] \end_inset @@ -12177,7 +12175,7 @@ fmap (c) \series default -\begin_inset Formula $\text{Data}^{A}\triangleq(\text{String}\Rightarrow\text{Int}\Rightarrow A)\times A+(\text{Bool}\Rightarrow\text{Double}\Rightarrow A)\times A\quad.$ +\begin_inset Formula $\text{Data}^{A}\triangleq(\text{String}\rightarrow\text{Int}\rightarrow A)\times A+(\text{Bool}\rightarrow\text{Double}\rightarrow A)\times A\quad.$ \end_inset @@ -12323,7 +12321,7 @@ fmap must have the type signature \begin_inset Formula \[ -\text{fmap}^{A,B}:f^{:A\Rightarrow B}\Rightarrow\text{Data}^{A}\Rightarrow\text{Data}^{B}\quad. +\text{fmap}^{A,B}:f^{:A\rightarrow B}\rightarrow\text{Data}^{A}\rightarrow\text{Data}^{B}\quad. \] \end_inset @@ -12366,7 +12364,7 @@ Data[B] without loss of information. To clarify where the transformation -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset need to be applied, let us write the type notation for @@ -12532,7 +12530,7 @@ and transform \end_inset by applying -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset at the correct places: @@ -12631,17 +12629,17 @@ def fmap[A, B](f: A => B): Data[A] => Data[B] = { (c) \series default Since the type structures -\begin_inset Formula $(\text{String}\Rightarrow\text{Int}\Rightarrow A)\times A$ +\begin_inset Formula $(\text{String}\rightarrow\text{Int}\rightarrow A)\times A$ \end_inset and -\begin_inset Formula $(\text{Bool}\Rightarrow\text{Double}\Rightarrow A)\times A$ +\begin_inset Formula $(\text{Bool}\rightarrow\text{Double}\rightarrow A)\times A$ \end_inset have a similar pattern, let us define a parameterized type \begin_inset Formula \[ -Q^{X,Y,A}\triangleq\left(X\Rightarrow Y\Rightarrow A\right)\times A\quad, +Q^{X,Y,A}\triangleq\left(X\rightarrow Y\rightarrow A\right)\times A\quad, \] \end_inset @@ -12738,7 +12736,7 @@ fmap , we begin with the type signature \begin_inset Formula \[ -\text{fmap}_{Q}^{A,B}:\left(A\Rightarrow B\right)\Rightarrow\left(X\Rightarrow Y\Rightarrow A\right)\times A\Rightarrow\left(X\Rightarrow Y\Rightarrow B\right)\times B +\text{fmap}_{Q}^{A,B}:\left(A\rightarrow B\right)\rightarrow\left(X\rightarrow Y\rightarrow A\right)\times A\rightarrow\left(X\rightarrow Y\rightarrow B\right)\times B \] \end_inset @@ -12746,7 +12744,7 @@ fmap and start writing the code using typed holes, \begin_inset Formula \[ -\text{fmap}_{Q}(f^{:A\Rightarrow B})\triangleq g^{:X\Rightarrow Y\Rightarrow A}\times a^{:A}\Rightarrow\text{???}^{:X\Rightarrow Y\Rightarrow B}\times\text{???}^{:B}\quad. +\text{fmap}_{Q}(f^{:A\rightarrow B})\triangleq g^{:X\rightarrow Y\rightarrow A}\times a^{:A}\rightarrow\text{???}^{:X\rightarrow Y\rightarrow B}\times\text{???}^{:B}\quad. \] \end_inset @@ -12763,9 +12761,9 @@ The typed hole To fill the remaining type hole, we write \begin_inset Formula \begin{align*} - & \text{???}^{:X\Rightarrow Y\Rightarrow B}\\ - & =x^{:X}\Rightarrow y^{:Y}\Rightarrow\gunderline{\text{???}^{:B}}\\ - & =x^{:X}\Rightarrow y^{:Y}\Rightarrow f(\text{???}^{:A})\quad. + & \text{???}^{:X\rightarrow Y\rightarrow B}\\ + & =x^{:X}\rightarrow y^{:Y}\rightarrow\gunderline{\text{???}^{:B}}\\ + & =x^{:X}\rightarrow y^{:Y}\rightarrow f(\text{???}^{:A})\quad. \end{align*} \end_inset @@ -12779,22 +12777,22 @@ It would be wrong to fill the typed hole \end_inset because a value of type -\begin_inset Formula $X\Rightarrow Y\Rightarrow B$ +\begin_inset Formula $X\rightarrow Y\rightarrow B$ \end_inset should be computed using the given data -\begin_inset Formula $g^{:X\Rightarrow Y\Rightarrow A}$ +\begin_inset Formula $g^{:X\rightarrow Y\rightarrow A}$ \end_inset of type -\begin_inset Formula $X\Rightarrow Y\Rightarrow A$ +\begin_inset Formula $X\rightarrow Y\rightarrow A$ \end_inset . So we write \begin_inset Formula \[ -\text{???}^{:X\Rightarrow Y\Rightarrow B}=x^{:X}\Rightarrow y^{:Y}\Rightarrow f(g(x)(y))\quad. +\text{???}^{:X\rightarrow Y\rightarrow B}=x^{:X}\rightarrow y^{:Y}\rightarrow f(g(x)(y))\quad. \] \end_inset @@ -12973,7 +12971,7 @@ cmap (a) \series default -\begin_inset Formula $\text{Data}^{A}\triangleq\left(A\Rightarrow\text{Int}\right)+(A\Rightarrow A\Rightarrow\text{String})\quad.$ +\begin_inset Formula $\text{Data}^{A}\triangleq\left(A\rightarrow\text{Int}\right)+(A\rightarrow A\rightarrow\text{String})\quad.$ \end_inset @@ -12985,7 +12983,7 @@ cmap (b) \series default -\begin_inset Formula $\text{Data}^{A,B}\triangleq\left(A+B\right)\times\left(\left(A\Rightarrow\text{Int}\right)\Rightarrow B\right)\quad.$ +\begin_inset Formula $\text{Data}^{A,B}\triangleq\left(A+B\right)\times\left(\left(A\rightarrow\text{Int}\right)\rightarrow B\right)\quad.$ \end_inset @@ -13158,12 +13156,12 @@ wrapped it is in a covariant position within the first part of the tuple. It remains to check the second part of the tuple, which is a higher-order function of type -\begin_inset Formula $\left(A\Rightarrow\text{Int}\right)\Rightarrow B$ +\begin_inset Formula $\left(A\rightarrow\text{Int}\right)\rightarrow B$ \end_inset . This function consumes a function of type -\begin_inset Formula $A\Rightarrow\text{Int}$ +\begin_inset Formula $A\rightarrow\text{Int}$ \end_inset , which in turn consumes a value of type @@ -13240,7 +13238,7 @@ fmap like this, \begin_inset Formula \[ -\text{fmap}^{A,C,Z}:\left(A\Rightarrow C\right)\Rightarrow\left(A+Z\right)\times\left(\left(A\Rightarrow\text{Int}\right)\Rightarrow Z\right)\Rightarrow\left(C+Z\right)\times\left(\left(C\Rightarrow\text{Int}\right)\Rightarrow Z\right)\quad. +\text{fmap}^{A,C,Z}:\left(A\rightarrow C\right)\rightarrow\left(A+Z\right)\times\left(\left(A\rightarrow\text{Int}\right)\rightarrow Z\right)\rightarrow\left(C+Z\right)\times\left(\left(C\rightarrow\text{Int}\right)\rightarrow Z\right)\quad. \] \end_inset @@ -13294,23 +13292,23 @@ status open \end_inset To derive code transforming -\begin_inset Formula $\left(A\Rightarrow\text{Int}\right)\Rightarrow Z$ +\begin_inset Formula $\left(A\rightarrow\text{Int}\right)\rightarrow Z$ \end_inset into -\begin_inset Formula $\left(C\Rightarrow\text{Int}\right)\Rightarrow Z$ +\begin_inset Formula $\left(C\rightarrow\text{Int}\right)\rightarrow Z$ \end_inset , we use typed holes: \begin_inset Formula \begin{align*} - & f^{:A\Rightarrow C}\Rightarrow g^{:\left(A\Rightarrow\text{Int}\right)\Rightarrow Z}\Rightarrow\gunderline{\text{???}^{:\left(C\Rightarrow\text{Int}\right)\Rightarrow Z}}\\ -\text{nameless function}:\quad & =f^{:A\Rightarrow C}\Rightarrow g^{:\left(A\Rightarrow\text{Int}\right)\Rightarrow Z}\Rightarrow p^{:C\Rightarrow\text{Int}}\Rightarrow\gunderline{\text{???}^{:Z}}\\ -\text{get a }Z\text{ by applying }g:\quad & =f\Rightarrow g\Rightarrow p\Rightarrow g(\gunderline{\text{???}^{:A\Rightarrow\text{Int}}})\\ -\text{nameless function}:\quad & =f\Rightarrow g\Rightarrow p\Rightarrow g(a^{:A}\Rightarrow\gunderline{\text{???}^{:\text{Int}}})\\ -\text{get an Int by applying }p:\quad & =f\Rightarrow g\Rightarrow p\Rightarrow g(a\Rightarrow p(\gunderline{\text{???}^{:C}}))\\ -\text{get a }C\text{ by applying }f:\quad & =f\Rightarrow g\Rightarrow p\Rightarrow g(a\Rightarrow p(f(\gunderline{\text{???}^{:A}})))\\ -\text{use argument }a^{:A}:\quad & =f\Rightarrow g\Rightarrow p\Rightarrow g(a\Rightarrow p(f(a))\quad. + & f^{:A\rightarrow C}\rightarrow g^{:\left(A\rightarrow\text{Int}\right)\rightarrow Z}\rightarrow\gunderline{\text{???}^{:\left(C\rightarrow\text{Int}\right)\rightarrow Z}}\\ +\text{nameless function}:\quad & =f^{:A\rightarrow C}\rightarrow g^{:\left(A\rightarrow\text{Int}\right)\rightarrow Z}\rightarrow p^{:C\rightarrow\text{Int}}\rightarrow\gunderline{\text{???}^{:Z}}\\ +\text{get a }Z\text{ by applying }g:\quad & =f\rightarrow g\rightarrow p\rightarrow g(\gunderline{\text{???}^{:A\rightarrow\text{Int}}})\\ +\text{nameless function}:\quad & =f\rightarrow g\rightarrow p\rightarrow g(a^{:A}\rightarrow\gunderline{\text{???}^{:\text{Int}}})\\ +\text{get an Int by applying }p:\quad & =f\rightarrow g\rightarrow p\rightarrow g(a\rightarrow p(\gunderline{\text{???}^{:C}}))\\ +\text{get a }C\text{ by applying }f:\quad & =f\rightarrow g\rightarrow p\rightarrow g(a\rightarrow p(f(\gunderline{\text{???}^{:A}})))\\ +\text{use argument }a^{:A}:\quad & =f\rightarrow g\rightarrow p\rightarrow g(a\rightarrow p(f(a))\quad. \end{align*} \end_inset @@ -13582,7 +13580,7 @@ Solution The type notation puts together all parts of the disjunctive type: \begin_inset Formula \[ -\text{Coi}^{A,B}\triangleq A\times B\times(B\Rightarrow\text{Int})+A\times B\times\text{Int}+(\text{String}\Rightarrow A)\times(B\Rightarrow A)\quad. +\text{Coi}^{A,B}\triangleq A\times B\times(B\rightarrow\text{Int})+A\times B\times\text{Int}+(\text{String}\rightarrow A)\times(B\rightarrow A)\quad. \] \end_inset @@ -13597,7 +13595,7 @@ Now find which types are wrapped and which are consumed in this type expression. \end_inset is both wrapped and consumed (in -\begin_inset Formula $B\Rightarrow A$ +\begin_inset Formula $B\rightarrow A$ \end_inset ). @@ -13946,7 +13944,7 @@ cmap (b) \series default -\begin_inset Formula $\text{Data}^{A}\triangleq(A\Rightarrow\text{Bool})\Rightarrow\left(A\times\left(\text{Int}+A\right)\right)\quad.$ +\begin_inset Formula $\text{Data}^{A}\triangleq(A\rightarrow\text{Bool})\rightarrow\left(A\times\left(\text{Int}+A\right)\right)\quad.$ \end_inset @@ -13958,7 +13956,7 @@ cmap (c) \series default -\begin_inset Formula $\text{Data}^{A,B}\triangleq(A\Rightarrow\text{Bool})\times\left((A+B)\Rightarrow\text{Int}\right)\quad.$ +\begin_inset Formula $\text{Data}^{A,B}\triangleq(A\rightarrow\text{Bool})\times\left((A+B)\rightarrow\text{Int}\right)\quad.$ \end_inset @@ -13970,7 +13968,7 @@ cmap (d) \series default -\begin_inset Formula $\text{Data}^{A}\triangleq(\bbnum 1+(A\Rightarrow\text{Bool}))\Rightarrow(\bbnum 1+(A\Rightarrow\text{Int}))\Rightarrow\text{Int}\quad.$ +\begin_inset Formula $\text{Data}^{A}\triangleq(\bbnum 1+(A\rightarrow\text{Bool}))\rightarrow(\bbnum 1+(A\rightarrow\text{Int}))\rightarrow\text{Int}\quad.$ \end_inset @@ -13982,7 +13980,7 @@ cmap (e) \series default -\begin_inset Formula $\text{Data}^{B}\triangleq(B+(\text{Int}\Rightarrow B))\times(B+(\text{String}\Rightarrow B))\quad.$ +\begin_inset Formula $\text{Data}^{B}\triangleq(B+(\text{Int}\rightarrow B))\times(B+(\text{String}\rightarrow B))\quad.$ \end_inset @@ -14079,7 +14077,7 @@ map defined by \begin_inset Formula \begin{equation} -Z^{A,R}\triangleq\left(\left(A\Rightarrow A\Rightarrow R\right)\Rightarrow R\right)\times A+\left(\bbnum 1+R\Rightarrow A+\text{Int}\right)+A\times A\times\text{Int}\times\text{Int}\quad.\label{eq:f-example-complicated-z} +Z^{A,R}\triangleq\left(\left(A\rightarrow A\rightarrow R\right)\rightarrow R\right)\times A+\left(\bbnum 1+R\rightarrow A+\text{Int}\right)+A\times A\times\text{Int}\times\text{Int}\quad.\label{eq:f-example-complicated-z} \end{equation} \end_inset @@ -14159,8 +14157,8 @@ map , the structure of the laws becomes less clear: \begin_inset Formula \begin{align*} - & \text{map}_{L}(x^{:L^{A}})(\text{id}^{:A\Rightarrow A})=x\quad,\\ - & \text{map}_{L}(x^{:L^{A}})(f^{:A\Rightarrow B}\bef g^{:B\Rightarrow C})=\text{map}_{L}\big(\text{map}_{L}(x)(f)\big)(g)\quad. + & \text{map}_{L}(x^{:L^{A}})(\text{id}^{:A\rightarrow A})=x\quad,\\ + & \text{map}_{L}(x^{:L^{A}})(f^{:A\rightarrow B}\bef g^{:B\rightarrow C})=\text{map}_{L}\big(\text{map}_{L}(x)(f)\big)(g)\quad. \end{align*} \end_inset @@ -14392,7 +14390,7 @@ lifted to , by \begin_inset Formula \[ -(f^{:A\Rightarrow B})^{\uparrow L}:L^{A}\Rightarrow L^{B}\quad,\quad\quad f^{\uparrow L}\triangleq\text{fmap}_{L}(f)\quad. +(f^{:A\rightarrow B})^{\uparrow L}:L^{A}\rightarrow L^{B}\quad,\quad\quad f^{\uparrow L}\triangleq\text{fmap}_{L}(f)\quad. \] \end_inset @@ -14590,7 +14588,7 @@ fmap function \begin_inset Formula \[ -\text{fmap}_{F^{\bullet,B}}(f^{:A\Rightarrow C})\triangleq a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\Rightarrow f(a)\times b_{1}\times b_{2}\quad. +\text{fmap}_{F^{\bullet,B}}(f^{:A\rightarrow C})\triangleq a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\rightarrow f(a)\times b_{1}\times b_{2}\quad. \] \end_inset @@ -14635,7 +14633,7 @@ fmap function \begin_inset Formula \[ -\text{fmap}_{F^{A,\bullet}}(g^{:B\Rightarrow D})\triangleq a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\Rightarrow a\times g(b_{1})\times g(b_{2})\quad. +\text{fmap}_{F^{A,\bullet}}(g^{:B\rightarrow D})\triangleq a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\rightarrow a\times g(b_{1})\times g(b_{2})\quad. \] \end_inset @@ -14684,18 +14682,18 @@ bimap \end_inset that uses two functions -\begin_inset Formula $f^{:A\Rightarrow C}$ +\begin_inset Formula $f^{:A\rightarrow C}$ \end_inset and -\begin_inset Formula $g^{:B\Rightarrow D}$ +\begin_inset Formula $g^{:B\rightarrow D}$ \end_inset as arguments: \begin_inset Formula \begin{align} -\text{bimap}_{F}(f^{:A\Rightarrow C})(g^{:B\Rightarrow D}) & :F^{A,B}\Rightarrow F^{C,D}\quad,\nonumber \\ -\text{bimap}_{F}(f^{:A\Rightarrow C})(g^{:B\Rightarrow D}) & \triangleq\text{fmap}_{F^{\bullet,B}}(f^{:A\Rightarrow C})\bef\text{fmap}_{F^{C,\bullet}}(g^{:B\Rightarrow D})\quad.\label{eq:f-definition-of-bimap} +\text{bimap}_{F}(f^{:A\rightarrow C})(g^{:B\rightarrow D}) & :F^{A,B}\rightarrow F^{C,D}\quad,\nonumber \\ +\text{bimap}_{F}(f^{:A\rightarrow C})(g^{:B\rightarrow D}) & \triangleq\text{fmap}_{F^{\bullet,B}}(f^{:A\rightarrow C})\bef\text{fmap}_{F^{C,\bullet}}(g^{:B\rightarrow D})\quad.\label{eq:f-definition-of-bimap} \end{align} \end_inset @@ -14703,7 +14701,7 @@ bimap In the condensed notation, this is written as \begin_inset Formula \[ -\text{bimap}_{F}(f^{:A\Rightarrow C})(g^{:B\Rightarrow D})\triangleq f^{\uparrow F^{\bullet,B}}\bef g^{\uparrow F^{C,\bullet}}\quad, +\text{bimap}_{F}(f^{:A\rightarrow C})(g^{:B\rightarrow D})\triangleq f^{\uparrow F^{\bullet,B}}\bef g^{\uparrow F^{C,\bullet}}\quad, \] \end_inset @@ -14741,13 +14739,13 @@ fmap functions in the opposite order? Since these functions work with different type parameters, it is reasonable to expect that the transformation -\begin_inset Formula $F^{A,B}\Rightarrow F^{C,D}$ +\begin_inset Formula $F^{A,B}\rightarrow F^{C,D}$ \end_inset should be independent of the order of application: \begin_inset Formula \begin{equation} -\text{fmap}_{F^{\bullet,B}}(f^{:A\Rightarrow C})\bef\text{fmap}_{F^{C,\bullet}}(g^{:B\Rightarrow D})=\text{fmap}_{F^{A,\bullet}}(g^{:B\Rightarrow D})\bef\text{fmap}_{F^{\bullet,D}}(f^{:A\Rightarrow C})\quad.\label{eq:f-fmap-fmap-bifunctor-commutativity} +\text{fmap}_{F^{\bullet,B}}(f^{:A\rightarrow C})\bef\text{fmap}_{F^{C,\bullet}}(g^{:B\rightarrow D})=\text{fmap}_{F^{A,\bullet}}(g^{:B\rightarrow D})\bef\text{fmap}_{F^{\bullet,D}}(f^{:A\rightarrow C})\quad.\label{eq:f-fmap-fmap-bifunctor-commutativity} \end{equation} \end_inset @@ -14770,9 +14768,9 @@ status open \begin_inset Formula \[ -\xymatrix{\xyScaleY{2.0pc}\xyScaleX{5.0pc} & F^{C,B}\ar[rd]\sp(0.6){\ ~~\text{fmap}_{F^{C,\bullet}}(g^{:B\Rightarrow D})}\\ -F^{A,B}\ar[ru]\sp(0.4){\text{fmap}_{F^{\bullet,B}}(f^{:A\Rightarrow C})~~~}\ar[rd]\sb(0.5){\text{fmap}_{F^{A,\bullet}}(g^{:B\Rightarrow D})~~\ }\ar[rr]\sb(0.5){\text{bimap}_{F}(f^{:A\Rightarrow C})(g^{:B\Rightarrow D})\ } & & F^{C,D}\\ - & F^{A,D}\ar[ru]\sb(0.6){~~~~\text{fmap}_{F^{\bullet,D}}(f^{:A\Rightarrow C})} +\xymatrix{\xyScaleY{2.0pc}\xyScaleX{5.0pc} & F^{C,B}\ar[rd]\sp(0.6){\ ~~\text{fmap}_{F^{C,\bullet}}(g^{:B\rightarrow D})}\\ +F^{A,B}\ar[ru]\sp(0.4){\text{fmap}_{F^{\bullet,B}}(f^{:A\rightarrow C})~~~}\ar[rd]\sb(0.5){\text{fmap}_{F^{A,\bullet}}(g^{:B\rightarrow D})~~\ }\ar[rr]\sb(0.5){\text{bimap}_{F}(f^{:A\rightarrow C})(g^{:B\rightarrow D})\ } & & F^{C,D}\\ + & F^{A,D}\ar[ru]\sb(0.6){~~~~\text{fmap}_{F^{\bullet,D}}(f^{:A\rightarrow C})} } \] @@ -14843,12 +14841,12 @@ Let us verify the commutativity law for the bifunctor : \begin_inset Formula \begin{align*} -\text{left-hand side}:\quad & \text{fmap}_{F^{\bullet,B}}(f^{:A\Rightarrow C})\bef\text{fmap}_{F^{C,\bullet}}(g^{:B\Rightarrow D})\\ -\text{definitions of }\text{fmap}:\quad & =(a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\Rightarrow f(a)\times b_{1}\times b_{2})\bef(c^{:C}\times b_{1}^{:B}\times b_{2}^{:B}\Rightarrow c\times g(b_{1})\times g(b_{2}))\\ -\text{compute composition}:\quad & =a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\Rightarrow f(a)\times g(b_{1})\times g(b_{2})\quad,\\ -\text{right-hand side}:\quad & \text{fmap}_{F^{A,\bullet}}(g^{:B\Rightarrow D})\bef\text{fmap}_{F^{\bullet,D}}(f^{:A\Rightarrow C})\\ -\text{definitions of }\text{fmap}:\quad & =(a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\Rightarrow a\times g(b_{1})\times g(b_{2}))\bef(a^{:A}\times d_{1}^{:D}\times d_{2}^{:D}\Rightarrow f(a)\times d_{1}\times d_{2})\\ -\text{compute composition}:\quad & =a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\Rightarrow f(a)\times g(b_{1})\times g(b_{2})\quad. +\text{left-hand side}:\quad & \text{fmap}_{F^{\bullet,B}}(f^{:A\rightarrow C})\bef\text{fmap}_{F^{C,\bullet}}(g^{:B\rightarrow D})\\ +\text{definitions of }\text{fmap}:\quad & =(a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\rightarrow f(a)\times b_{1}\times b_{2})\bef(c^{:C}\times b_{1}^{:B}\times b_{2}^{:B}\rightarrow c\times g(b_{1})\times g(b_{2}))\\ +\text{compute composition}:\quad & =a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\rightarrow f(a)\times g(b_{1})\times g(b_{2})\quad,\\ +\text{right-hand side}:\quad & \text{fmap}_{F^{A,\bullet}}(g^{:B\rightarrow D})\bef\text{fmap}_{F^{\bullet,D}}(f^{:A\rightarrow C})\\ +\text{definitions of }\text{fmap}:\quad & =(a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\rightarrow a\times g(b_{1})\times g(b_{2}))\bef(a^{:A}\times d_{1}^{:D}\times d_{2}^{:D}\rightarrow f(a)\times d_{1}\times d_{2})\\ +\text{compute composition}:\quad & =a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\rightarrow f(a)\times g(b_{1})\times g(b_{2})\quad. \end{align*} \end_inset @@ -14886,7 +14884,7 @@ bimap , \begin_inset Formula \begin{equation} -\text{bimap}_{F}(f_{1}^{:A\Rightarrow C})(g_{1}^{:B\Rightarrow D})\bef\text{bimap}_{F}(f_{2}^{:C\Rightarrow E})(g_{2}^{:D\Rightarrow G})=\text{bimap}_{F}(f_{1}\bef f_{2})(g_{1}\bef g_{2})\quad.\label{eq:f-bimap-composition-law} +\text{bimap}_{F}(f_{1}^{:A\rightarrow C})(g_{1}^{:B\rightarrow D})\bef\text{bimap}_{F}(f_{2}^{:C\rightarrow E})(g_{2}^{:D\rightarrow G})=\text{bimap}_{F}(f_{1}\bef f_{2})(g_{1}\bef g_{2})\quad.\label{eq:f-bimap-composition-law} \end{equation} \end_inset @@ -14918,9 +14916,9 @@ fmap functions: \begin_inset Formula \[ -\xymatrix{\xyScaleY{3.0pc}\xyScaleX{12.0pc}F^{A,B}\ar[rd]\sp(0.6){~~~\text{bimap}_{F}(f_{1})(g_{1})}\ar[r]\sp(0.4){\text{fmap}_{F^{\bullet,B}}(f_{1}^{:A\Rightarrow C})}\ar[d]\sp(0.5){\text{fmap}_{F^{A,\bullet}}(g_{1}^{:B\Rightarrow D})} & F^{C,B}\ar[rd]\sp(0.6){~~~\text{bimap}_{F}(f_{2})(g_{1})}\ar[r]\sp(0.4){~\text{fmap}_{F^{\bullet,B}}(f_{2}^{:C\Rightarrow E})}\ar[d]\sp(0.5){\text{fmap}_{F^{C,\bullet}}(g_{1}^{:B\Rightarrow D})~~~} & F^{E,B}\ar[d]\sp(0.5){\text{fmap}_{F^{E,\bullet}}(g_{1}^{:B\Rightarrow D})}\\ -F^{A,D}\ar[rd]\sp(0.6){~~~\text{bimap}_{F}(f_{1})(g_{2})}\ar[r]\sp(0.4){\text{fmap}_{F^{\bullet,D}}(f_{1}^{:A\Rightarrow C})}\ar[d]\sp(0.5){\text{fmap}_{F^{A,\bullet}}(g_{2}^{:D\Rightarrow G})} & F^{C,D}\ar[rd]\sp(0.6){~~~\text{bimap}_{F}(f_{2})(g_{2})}\ar[r]\sp(0.4){~\text{fmap}_{F^{\bullet,D}}(f_{2}^{:C\Rightarrow E})}\ar[d]\sp(0.5){\text{fmap}_{F^{C,\bullet}}(g_{2}^{:D\Rightarrow G})~~~} & F^{E,D}\ar[d]\sp(0.5){\text{fmap}_{F^{E,\bullet}}(g_{2}^{:D\Rightarrow G})}\\ -F^{A,G}\ar[r]\sp(0.4){~\text{fmap}_{F^{\bullet,G}}(f_{1}^{:A\Rightarrow C})} & F^{C,G}\ar[r]\sp(0.4){~\text{fmap}_{F^{\bullet,G}}(f_{2}^{:C\Rightarrow E})} & F^{E,G} +\xymatrix{\xyScaleY{3.0pc}\xyScaleX{12.0pc}F^{A,B}\ar[rd]\sp(0.6){~~~\text{bimap}_{F}(f_{1})(g_{1})}\ar[r]\sp(0.4){\text{fmap}_{F^{\bullet,B}}(f_{1}^{:A\rightarrow C})}\ar[d]\sp(0.5){\text{fmap}_{F^{A,\bullet}}(g_{1}^{:B\rightarrow D})} & F^{C,B}\ar[rd]\sp(0.6){~~~\text{bimap}_{F}(f_{2})(g_{1})}\ar[r]\sp(0.4){~\text{fmap}_{F^{\bullet,B}}(f_{2}^{:C\rightarrow E})}\ar[d]\sp(0.5){\text{fmap}_{F^{C,\bullet}}(g_{1}^{:B\rightarrow D})~~~} & F^{E,B}\ar[d]\sp(0.5){\text{fmap}_{F^{E,\bullet}}(g_{1}^{:B\rightarrow D})}\\ +F^{A,D}\ar[rd]\sp(0.6){~~~\text{bimap}_{F}(f_{1})(g_{2})}\ar[r]\sp(0.4){\text{fmap}_{F^{\bullet,D}}(f_{1}^{:A\rightarrow C})}\ar[d]\sp(0.5){\text{fmap}_{F^{A,\bullet}}(g_{2}^{:D\rightarrow G})} & F^{C,D}\ar[rd]\sp(0.6){~~~\text{bimap}_{F}(f_{2})(g_{2})}\ar[r]\sp(0.4){~\text{fmap}_{F^{\bullet,D}}(f_{2}^{:C\rightarrow E})}\ar[d]\sp(0.5){\text{fmap}_{F^{C,\bullet}}(g_{2}^{:D\rightarrow G})~~~} & F^{E,D}\ar[d]\sp(0.5){\text{fmap}_{F^{E,\bullet}}(g_{2}^{:D\rightarrow G})}\\ +F^{A,G}\ar[r]\sp(0.4){~\text{fmap}_{F^{\bullet,G}}(f_{1}^{:A\rightarrow C})} & F^{C,G}\ar[r]\sp(0.4){~\text{fmap}_{F^{\bullet,G}}(f_{2}^{:C\rightarrow E})} & F^{E,G} } \] @@ -14988,7 +14986,7 @@ noprefix "false" We write the composition law with specially chosen functions: \begin_inset Formula \begin{equation} -\text{bimap}_{F}(f^{:A\Rightarrow C})(g^{:B\Rightarrow D})=\text{bimap}_{F}(\text{id}^{:A\Rightarrow A})(g^{:B\Rightarrow D})\bef\text{bimap}_{F}(f^{:A\Rightarrow C})(\text{id}^{:D\Rightarrow D})\quad.\label{eq:f-bimap-id-f-g-id} +\text{bimap}_{F}(f^{:A\rightarrow C})(g^{:B\rightarrow D})=\text{bimap}_{F}(\text{id}^{:A\rightarrow A})(g^{:B\rightarrow D})\bef\text{bimap}_{F}(f^{:A\rightarrow C})(\text{id}^{:D\rightarrow D})\quad.\label{eq:f-bimap-id-f-g-id} \end{equation} \end_inset @@ -15010,9 +15008,9 @@ noprefix "false" ), we find \begin_inset Formula \begin{align*} -\text{expect }\text{fmap}_{F^{A,\bullet}}(g)\bef\text{fmap}_{F^{\bullet,D}}(f):\quad & \text{fmap}_{F^{\bullet,B}}(f^{:A\Rightarrow C})\bef\text{fmap}_{F^{C,\bullet}}(g^{:B\Rightarrow D})\\ -\text{use Eq.~(\ref{eq:f-definition-of-bimap})}:\quad & =\text{bimap}_{F}(f^{:A\Rightarrow C})(g^{:B\Rightarrow D})\\ -\text{use Eq.~(\ref{eq:f-bimap-id-f-g-id})}:\quad & =\text{bimap}_{F}(\text{id}^{:A\Rightarrow A})(g^{:B\Rightarrow D})\bef\text{bimap}_{F}(f^{:A\Rightarrow C})(\text{id}^{:D\Rightarrow D})\\ +\text{expect }\text{fmap}_{F^{A,\bullet}}(g)\bef\text{fmap}_{F^{\bullet,D}}(f):\quad & \text{fmap}_{F^{\bullet,B}}(f^{:A\rightarrow C})\bef\text{fmap}_{F^{C,\bullet}}(g^{:B\rightarrow D})\\ +\text{use Eq.~(\ref{eq:f-definition-of-bimap})}:\quad & =\text{bimap}_{F}(f^{:A\rightarrow C})(g^{:B\rightarrow D})\\ +\text{use Eq.~(\ref{eq:f-bimap-id-f-g-id})}:\quad & =\text{bimap}_{F}(\text{id}^{:A\rightarrow A})(g^{:B\rightarrow D})\bef\text{bimap}_{F}(f^{:A\rightarrow C})(\text{id}^{:D\rightarrow D})\\ \text{use Eq.~(\ref{eq:f-definition-of-bimap})}:\quad & =\gunderline{\text{fmap}_{F^{\bullet,B}}(\text{id})}\bef\text{fmap}_{F^{A,\bullet}}(g)\bef\text{fmap}_{F^{\bullet,D}}(f)\bef\gunderline{\text{fmap}_{F^{C,\bullet}}(\text{id})}\\ \text{identity laws for }F:\quad & =\text{fmap}_{F^{A,\bullet}}(g)\bef\text{fmap}_{F^{\bullet,D}}(f)\quad. \end{align*} @@ -15038,7 +15036,7 @@ bimap holds as well, \begin_inset Formula \begin{align*} -\text{expect to equal }\text{id}:\quad & \text{bimap}_{F}(\text{id}^{:A\Rightarrow A})(\text{id}^{:B\Rightarrow B})\\ +\text{expect to equal }\text{id}:\quad & \text{bimap}_{F}(\text{id}^{:A\rightarrow A})(\text{id}^{:B\rightarrow B})\\ \text{use Eq.~(\ref{eq:f-definition-of-bimap})}:\quad & =\gunderline{\text{fmap}_{F^{\bullet,B}}(\text{id})}\bef\gunderline{\text{fmap}_{F^{C,\bullet}}(\text{id})}\\ \text{identity laws for }F:\quad & =\text{id}\bef\text{id}=\text{id}\quad. \end{align*} @@ -15428,7 +15426,7 @@ function type \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $L^{A}\triangleq C^{A}\Rightarrow P^{A}$ +\begin_inset Formula $L^{A}\triangleq C^{A}\rightarrow P^{A}$ \end_inset @@ -15728,15 +15726,15 @@ fmap function is defined by \begin_inset Formula \begin{align*} - & \text{fmap}_{\text{Id}}:\left(A\Rightarrow B\right)\Rightarrow\text{Id}^{A}\Rightarrow\text{Id}^{B}\cong\left(A\Rightarrow B\right)\Rightarrow A\Rightarrow B\quad,\\ - & \text{fmap}_{\text{Id}}\triangleq(f^{:A\Rightarrow B}\Rightarrow f)=\text{id}^{:(A\Rightarrow B)\Rightarrow A\Rightarrow B}\quad. + & \text{fmap}_{\text{Id}}:\left(A\rightarrow B\right)\rightarrow\text{Id}^{A}\rightarrow\text{Id}^{B}\cong\left(A\rightarrow B\right)\rightarrow A\rightarrow B\quad,\\ + & \text{fmap}_{\text{Id}}\triangleq(f^{:A\rightarrow B}\rightarrow f)=\text{id}^{:(A\rightarrow B)\rightarrow A\rightarrow B}\quad. \end{align*} \end_inset The identity function is the only fully parametric implementation of the type signature -\begin_inset Formula $\left(A\Rightarrow B\right)\Rightarrow A\Rightarrow B$ +\begin_inset Formula $\left(A\rightarrow B\right)\rightarrow A\rightarrow B$ \end_inset . @@ -15831,8 +15829,8 @@ fmap function is defined by \begin_inset Formula \begin{align*} -\text{fmap}_{\text{Const}} & :\left(A\Rightarrow B\right)\Rightarrow\text{Const}^{Z,A}\Rightarrow\text{Const}^{Z,B}\cong\left(A\Rightarrow B\right)\Rightarrow Z\Rightarrow Z\quad,\\ -\text{fmap}_{\text{Const}}(f^{:A\Rightarrow B}) & \triangleq(z^{:Z}\Rightarrow z)=\text{id}^{:Z\Rightarrow Z}\quad. +\text{fmap}_{\text{Const}} & :\left(A\rightarrow B\right)\rightarrow\text{Const}^{Z,A}\rightarrow\text{Const}^{Z,B}\cong\left(A\rightarrow B\right)\rightarrow Z\rightarrow Z\quad,\\ +\text{fmap}_{\text{Const}}(f^{:A\rightarrow B}) & \triangleq(z^{:Z}\rightarrow z)=\text{id}^{:Z\rightarrow Z}\quad. \end{align*} \end_inset @@ -15842,7 +15840,7 @@ It is a constant function that ignores \end_inset and returns the identity -\begin_inset Formula $\text{id}^{:Z\Rightarrow Z}$ +\begin_inset Formula $\text{id}^{:Z\rightarrow Z}$ \end_inset . @@ -16053,7 +16051,7 @@ def fmap[A, B](f: A => B): (L[A], M[A]) => (L[B], M[B]) = { The corresponding code notation is \begin_inset Formula \[ -\negthickspace\negthickspace f^{\uparrow P}\triangleq l^{:L^{A}}\times m^{:M^{A}}\Rightarrow f^{\uparrow L}(l)\times f^{\uparrow M}(m)\quad. +\negthickspace\negthickspace f^{\uparrow P}\triangleq l^{:L^{A}}\times m^{:M^{A}}\rightarrow f^{\uparrow L}(l)\times f^{\uparrow M}(m)\quad. \] \end_inset @@ -16091,8 +16089,8 @@ function product defined by \begin_inset Formula \begin{align*} - & p^{:A\Rightarrow B}\boxtimes q^{:C\Rightarrow D}:A\times C\Rightarrow B\times D\quad,\\ - & p\boxtimes q\triangleq a\times c\Rightarrow p(a)\times q(c)\quad,\\ + & p^{:A\rightarrow B}\boxtimes q^{:C\rightarrow D}:A\times C\rightarrow B\times D\quad,\\ + & p\boxtimes q\triangleq a\times c\rightarrow p(a)\times q(c)\quad,\\ & (a\times c)\triangleright\left(p\boxtimes q\right)=\left(a\triangleright p\right)\times\left(b\triangleright q\right)\quad. \end{align*} @@ -16424,7 +16422,7 @@ fmap function is \begin_inset Formula \[ -\text{fmap}_{L}(f^{:A\Rightarrow B})=f^{\uparrow L}\triangleq\begin{array}{|c||cc|} +\text{fmap}_{L}(f^{:A\rightarrow B})=f^{\uparrow L}\triangleq\begin{array}{|c||cc|} & P^{B} & Q^{B}\\ \hline P^{A} & f^{\uparrow P} & \bbnum 0\\ Q^{A} & \bbnum 0 & f^{\uparrow Q} @@ -16718,7 +16716,7 @@ If \end_inset is a functor then -\begin_inset Formula $L^{A}\triangleq C^{A}\Rightarrow P^{A}$ +\begin_inset Formula $L^{A}\triangleq C^{A}\rightarrow P^{A}$ \end_inset is a functor, called an @@ -16750,8 +16748,8 @@ fmap defined by \begin_inset Formula \begin{align} - & \text{fmap}_{L}^{A,B}(f^{:A\Rightarrow B}):(C^{A}\Rightarrow P^{A})\Rightarrow C^{B}\Rightarrow P^{B}\quad,\nonumber \\ - & \text{fmap}_{L}(f^{:A\Rightarrow B})=f^{\uparrow L}\triangleq h^{:C^{A}\Rightarrow P^{A}}\Rightarrow f^{\downarrow C}\bef h\bef f^{\uparrow P}\quad.\label{eq:f-functor-exponential-def-of-fmap} + & \text{fmap}_{L}^{A,B}(f^{:A\rightarrow B}):(C^{A}\rightarrow P^{A})\rightarrow C^{B}\rightarrow P^{B}\quad,\nonumber \\ + & \text{fmap}_{L}(f^{:A\rightarrow B})=f^{\uparrow L}\triangleq h^{:C^{A}\rightarrow P^{A}}\rightarrow f^{\downarrow C}\bef h\bef f^{\uparrow P}\quad.\label{eq:f-functor-exponential-def-of-fmap} \end{align} \end_inset @@ -16785,8 +16783,8 @@ A type diagram for can be drawn as \begin_inset Formula \[ -\xymatrix{\xyScaleY{1.5pc}\xyScaleX{2.5pc} & C^{A}\ar[r]\sp(0.5){h} & P^{A}\ar[rd]\sp(0.6){\ \text{fmap}_{P}(f^{:A\Rightarrow B})\ }\\ -C^{B}\ar[ru]\sp(0.4){\text{cmap}_{C}(f^{:A\Rightarrow B})\ ~~}\ar[rrr]\sb(0.5){\text{fmap}_{L}(f^{:A\Rightarrow B})(h^{:C^{A}\Rightarrow P^{A}})\ } & & & P^{B} +\xymatrix{\xyScaleY{1.5pc}\xyScaleX{2.5pc} & C^{A}\ar[r]\sp(0.5){h} & P^{A}\ar[rd]\sp(0.6){\ \text{fmap}_{P}(f^{:A\rightarrow B})\ }\\ +C^{B}\ar[ru]\sp(0.4){\text{cmap}_{C}(f^{:A\rightarrow B})\ ~~}\ar[rrr]\sb(0.5){\text{fmap}_{L}(f^{:A\rightarrow B})(h^{:C^{A}\rightarrow P^{A}})\ } & & & P^{B} } \] @@ -16911,7 +16909,7 @@ exponential functor \end_inset functor construction are -\begin_inset Formula $L^{A}\triangleq Z\Rightarrow A$ +\begin_inset Formula $L^{A}\triangleq Z\rightarrow A$ \end_inset (with the contrafunctor @@ -16927,11 +16925,11 @@ exponential functor \end_inset is a fixed type) and -\begin_inset Formula $L^{A}\triangleq\left(A\Rightarrow Z\right)\Rightarrow A$ +\begin_inset Formula $L^{A}\triangleq\left(A\rightarrow Z\right)\rightarrow A$ \end_inset (with the contrafunctor -\begin_inset Formula $C^{A}\triangleq A\Rightarrow Z$ +\begin_inset Formula $C^{A}\triangleq A\rightarrow Z$ \end_inset ). @@ -16958,7 +16956,7 @@ noprefix "false" \begin_layout Standard In a similar way, one can prove that -\begin_inset Formula $P^{A}\Rightarrow C^{A}$ +\begin_inset Formula $P^{A}\rightarrow C^{A}$ \end_inset is a contrafunctor (Exercise @@ -17013,7 +17011,7 @@ noprefix "false" \end_inset , while -\begin_inset Formula $A\Rightarrow Z$ +\begin_inset Formula $A\rightarrow Z$ \end_inset is contravariant in @@ -17021,7 +17019,7 @@ noprefix "false" \end_inset , and -\begin_inset Formula $\left(A\Rightarrow Z\right)\Rightarrow Z$ +\begin_inset Formula $\left(A\rightarrow Z\right)\rightarrow Z$ \end_inset is again covariant in @@ -17030,7 +17028,7 @@ noprefix "false" . As we have seen, -\begin_inset Formula $A\Rightarrow A\Rightarrow Z$ +\begin_inset Formula $A\rightarrow A\rightarrow Z$ \end_inset is contravariant in @@ -17039,12 +17037,12 @@ noprefix "false" , so any number of curried arrows count as one in this consideration (and, in any case, -\begin_inset Formula $A\Rightarrow A\Rightarrow Z\cong A\times A\Rightarrow Z$ +\begin_inset Formula $A\rightarrow A\rightarrow Z\cong A\times A\rightarrow Z$ \end_inset ). Products and disjunctions do not change variance, so -\begin_inset Formula $\left(A\Rightarrow Z_{1}\right)\times\left(A\Rightarrow Z_{2}\right)+\left(A\Rightarrow Z_{3}\right)$ +\begin_inset Formula $\left(A\rightarrow Z_{1}\right)\times\left(A\rightarrow Z_{2}\right)+\left(A\rightarrow Z_{3}\right)$ \end_inset is still contravariant in @@ -17226,7 +17224,7 @@ p.map(_.map(f)) \end_inset lifts an -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset into a function of type @@ -17374,7 +17372,7 @@ In the code notation, is written equivalently as \begin_inset Formula \begin{align} - & \text{fmap}_{L}:f^{:A\Rightarrow B}\Rightarrow P^{Q^{A}}\Rightarrow P^{Q^{B}}\quad,\nonumber \\ + & \text{fmap}_{L}:f^{:A\rightarrow B}\rightarrow P^{Q^{A}}\rightarrow P^{Q^{B}}\quad,\nonumber \\ \text{fmap}_{L}(f)\triangleq\text{fmap}_{P}(\text{fmap}_{Q}(f))\quad,\quad\quad & \text{fmap}_{L}\triangleq\text{fmap}_{Q}\bef\text{fmap}_{P}\quad,\nonumber \\ \text{in a shorter notation}:\quad & f^{\uparrow L}\triangleq(f^{\uparrow Q})^{\uparrow P}\triangleq f^{\uparrow Q\uparrow P}\quad.\label{eq:def-functor-composition-fmap} \end{align} @@ -18109,7 +18107,7 @@ fmap is a recursive function implemented as \begin_inset Formula \begin{equation} -\text{fmap}_{L}(f^{:A\Rightarrow B})\triangleq\text{bimap}_{S}(f)(\text{fmap}_{L}(f))\quad.\label{eq:def-recursive-functor-fmap} +\text{fmap}_{L}(f^{:A\rightarrow B})\triangleq\text{bimap}_{S}(f)(\text{fmap}_{L}(f))\quad.\label{eq:def-recursive-functor-fmap} \end{equation} \end_inset @@ -18675,7 +18673,7 @@ function type \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $C^{A}\triangleq L^{A}\Rightarrow H^{A}$ +\begin_inset Formula $C^{A}\triangleq L^{A}\rightarrow H^{A}$ \end_inset @@ -18944,7 +18942,7 @@ cmap \end_inset returns an identity function of type -\begin_inset Formula $Z\Rightarrow Z$ +\begin_inset Formula $Z\rightarrow Z$ \end_inset : @@ -19113,7 +19111,7 @@ cmap into the code notation: \begin_inset Formula \[ -\text{cmap}_{L}(f^{:B\Rightarrow A})\triangleq\text{fmap}_{P}(\text{cmap}_{Q}(f))\quad. +\text{cmap}_{L}(f^{:B\rightarrow A})\triangleq\text{fmap}_{P}(\text{cmap}_{Q}(f))\quad. \] \end_inset @@ -19161,7 +19159,7 @@ Finally, the recursive construction works for contrafunctors, except that An example of such a type constructor is \begin_inset Formula \begin{equation} -S^{A,R}\triangleq\left(A\Rightarrow\text{Int}\right)+R\times R\quad.\label{eq:f-example-contra-bifunctor} +S^{A,R}\triangleq\left(A\rightarrow\text{Int}\right)+R\times R\quad.\label{eq:f-example-contra-bifunctor} \end{equation} \end_inset @@ -19211,8 +19209,8 @@ def xmap[A, B, Q, R](f: B => A)(g: Q => R): S[A, Q] => S[B, R] \begin_inset Formula \begin{align*} - & \text{xmap}_{S}:\left(B\Rightarrow A\right)\Rightarrow\left(Q\Rightarrow R\right)\Rightarrow S^{A,Q}\Rightarrow S^{B,R}\quad,\\ - & \text{xmap}_{S}(f^{:B\Rightarrow A})(g^{:Q\Rightarrow R})\triangleq\text{fmap}_{S^{A,\bullet}}(g)\bef\text{cmap}_{S^{\bullet,R}}(f)\quad. + & \text{xmap}_{S}:\left(B\rightarrow A\right)\rightarrow\left(Q\rightarrow R\right)\rightarrow S^{A,Q}\rightarrow S^{B,R}\quad,\\ + & \text{xmap}_{S}(f^{:B\rightarrow A})(g^{:Q\rightarrow R})\triangleq\text{fmap}_{S^{A,\bullet}}(g)\bef\text{cmap}_{S^{\bullet,R}}(f)\quad. \end{align*} \end_inset @@ -19297,14 +19295,14 @@ If we define a type constructor using the recursive equation \begin_inset Formula \[ -L^{A}\triangleq S^{A,L^{A}}\triangleq\left(A\Rightarrow\text{Int}\right)+L^{A}\times L^{A}\quad, +L^{A}\triangleq S^{A,L^{A}}\triangleq\left(A\rightarrow\text{Int}\right)+L^{A}\times L^{A}\quad, \] \end_inset we obtain a contrafunctor in the shape of a binary tree whose leaves are functions of type -\begin_inset Formula $A\Rightarrow\text{Int}$ +\begin_inset Formula $A\rightarrow\text{Int}$ \end_inset . @@ -19413,8 +19411,8 @@ cmap as \begin_inset Formula \begin{align*} -\text{cmap}_{C}(f^{:B\Rightarrow A}) & :C^{A}\Rightarrow C^{B}\cong S^{A,C^{A}}\Rightarrow S^{B,C^{B}}\quad,\\ -\text{cmap}_{C}(f^{:B\Rightarrow A}) & \triangleq\text{xmap}_{S}(f)(\overline{\text{cmap}_{C}}(f))\quad. +\text{cmap}_{C}(f^{:B\rightarrow A}) & :C^{A}\rightarrow C^{B}\cong S^{A,C^{A}}\rightarrow S^{B,C^{B}}\quad,\\ +\text{cmap}_{C}(f^{:B\rightarrow A}) & \triangleq\text{xmap}_{S}(f)(\overline{\text{cmap}_{C}}(f))\quad. \end{align*} \end_inset @@ -19509,7 +19507,7 @@ To verify the identity law: To verify the composition law: \begin_inset Formula \begin{align*} -\text{expect to equal }(g^{\downarrow C}\bef f^{\downarrow C}):\quad & (f^{:D\Rightarrow B}\bef g^{:B\Rightarrow A})^{\downarrow C}=\text{xmap}_{S}(f\bef g)(\gunderline{\overline{\text{cmap}_{C}}(f\bef g)})\\ +\text{expect to equal }(g^{\downarrow C}\bef f^{\downarrow C}):\quad & (f^{:D\rightarrow B}\bef g^{:B\rightarrow A})^{\downarrow C}=\text{xmap}_{S}(f\bef g)(\gunderline{\overline{\text{cmap}_{C}}(f\bef g)})\\ \text{inductive assumption}:\quad & =\text{xmap}_{S}(f\bef g)(\overline{\text{cmap}_{C}}(g)\bef\overline{\text{cmap}_{C}}(f)))\\ \text{composition laws for }\text{xmap}_{S}:\quad & =\text{xmap}_{S}(g)(\overline{\text{cmap}_{C}}(g))\bef\text{xmap}_{S}(f)(\overline{\text{cmap}_{C}}(f))\\ \text{definition of }^{\downarrow C}:\quad & =g^{\downarrow C}\bef f^{\downarrow C}\quad. @@ -19720,7 +19718,7 @@ polynomial functor \begin_layout Itemize Type parameters to the right of a function arrow are in a covariant position. For example, -\begin_inset Formula $\text{Int}\Rightarrow A$ +\begin_inset Formula $\text{Int}\rightarrow A$ \end_inset is covariant in @@ -19736,7 +19734,7 @@ Each time a type parameter is placed to the left of an uncurried \emph default function arrow -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset , the variance is reversed: covariant becomes contravariant and vice versa. @@ -19744,9 +19742,9 @@ uncurried \begin_inset Formula \begin{align*} \text{this is covariant in }A:\quad & \bbnum 1+A\times A\quad,\\ -\text{this is contravariant in }A:\quad & \left(\bbnum 1+A\times A\right)\Rightarrow\text{Int}\quad,\\ -\text{this is covariant in }A:\quad & \left(\left(\bbnum 1+A\times A\right)\Rightarrow\text{Int}\right)\Rightarrow\text{Int}\quad,\\ -\text{this is contravariant in }A:\quad & \left(\left(\left(\bbnum 1+A\times A\right)\Rightarrow\text{Int}\right)\Rightarrow\text{Int}\right)\Rightarrow\text{Int}\quad. +\text{this is contravariant in }A:\quad & \left(\bbnum 1+A\times A\right)\rightarrow\text{Int}\quad,\\ +\text{this is covariant in }A:\quad & \left(\left(\bbnum 1+A\times A\right)\rightarrow\text{Int}\right)\rightarrow\text{Int}\quad,\\ +\text{this is contravariant in }A:\quad & \left(\left(\left(\bbnum 1+A\times A\right)\rightarrow\text{Int}\right)\rightarrow\text{Int}\right)\rightarrow\text{Int}\quad. \end{align*} \end_inset @@ -19756,7 +19754,7 @@ uncurried \begin_layout Itemize Repeated curried function arrows work as one arrow: -\begin_inset Formula $A\Rightarrow\text{Int}$ +\begin_inset Formula $A\rightarrow\text{Int}$ \end_inset is contravariant in @@ -19764,7 +19762,7 @@ Repeated curried function arrows work as one arrow: \end_inset , and -\begin_inset Formula $A\Rightarrow A\Rightarrow A\Rightarrow\text{Int}$ +\begin_inset Formula $A\rightarrow A\rightarrow A\rightarrow\text{Int}$ \end_inset is still contravariant in @@ -19773,15 +19771,15 @@ Repeated curried function arrows work as one arrow: . This is so because the type -\begin_inset Formula $A\Rightarrow A\Rightarrow A\Rightarrow\text{Int}$ +\begin_inset Formula $A\rightarrow A\rightarrow A\rightarrow\text{Int}$ \end_inset is equivalent to -\begin_inset Formula $A\times A\times A\Rightarrow\text{Int}$ +\begin_inset Formula $A\times A\times A\rightarrow\text{Int}$ \end_inset , which is of the form -\begin_inset Formula $F^{A}\Rightarrow\text{Int}$ +\begin_inset Formula $F^{A}\rightarrow\text{Int}$ \end_inset with a type constructor @@ -19804,7 +19802,7 @@ noprefix "false" \end_inset will show that -\begin_inset Formula $F^{A}\Rightarrow\text{Int}$ +\begin_inset Formula $F^{A}\rightarrow\text{Int}$ \end_inset is contravariant in @@ -19828,7 +19826,7 @@ if we know that \end_inset then -\begin_inset Formula $F^{A\Rightarrow\text{Int}}$ +\begin_inset Formula $F^{A\rightarrow\text{Int}}$ \end_inset is covariant in @@ -19864,7 +19862,7 @@ noprefix "false" ), \begin_inset Formula \[ -Z^{A,R}\triangleq\left(\left(A\Rightarrow A\Rightarrow R\right)\Rightarrow R\right)\times A+\left(\bbnum 1+R\Rightarrow A+\text{Int}\right)+A\times A\times\text{Int}\times\text{Int}\quad, +Z^{A,R}\triangleq\left(\left(A\rightarrow A\rightarrow R\right)\rightarrow R\right)\times A+\left(\bbnum 1+R\rightarrow A+\text{Int}\right)+A\times A\times\text{Int}\times\text{Int}\quad, \] \end_inset @@ -19880,7 +19878,7 @@ we can mark the position of each type parameter as either covariant ( ), according to the number of nested function arrows: \begin_inset Formula \[ -\big(\big(\underset{+}{A}\Rightarrow\underset{+}{A}\Rightarrow\underset{-}{R}\big)\Rightarrow\underset{+}{R}\big)\times\underset{+}{A}+\big(\bbnum 1+\underset{-}{R}\Rightarrow\underset{+}{A}+\text{Int}\big)+\underset{+}{A}\times\underset{+}{A}\times\text{Int}\times\text{Int}\quad. +\big(\big(\underset{+}{A}\rightarrow\underset{+}{A}\rightarrow\underset{-}{R}\big)\rightarrow\underset{+}{R}\big)\times\underset{+}{A}+\big(\bbnum 1+\underset{-}{R}\rightarrow\underset{+}{A}+\text{Int}\big)+\underset{+}{A}\times\underset{+}{A}\times\text{Int}\times\text{Int}\quad. \] \end_inset @@ -19935,7 +19933,7 @@ map and the previous chapters: starting from the type signature \begin_inset Formula \[ -\text{map}_{Z}:Z^{A,R}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow Z^{B,R}\quad, +\text{map}_{Z}:Z^{A,R}\rightarrow\left(A\rightarrow B\right)\rightarrow Z^{B,R}\quad, \] \end_inset @@ -20071,7 +20069,7 @@ Solution The type notation is \begin_inset Formula \[ -G^{A,Z}\triangleq(\text{Int}+A)\times(\bbnum 1+(Z\Rightarrow\text{Int}\Rightarrow Z\Rightarrow\text{Int}\times A))\quad. +G^{A,Z}\triangleq(\text{Int}+A)\times(\bbnum 1+(Z\rightarrow\text{Int}\rightarrow Z\rightarrow\text{Int}\times A))\quad. \] \end_inset @@ -20079,7 +20077,7 @@ G^{A,Z}\triangleq(\text{Int}+A)\times(\bbnum 1+(Z\Rightarrow\text{Int}\Rightarro Mark the covariant and the contravariant positions in this type expression: \begin_inset Formula \[ -(\text{Int}+\underset{+}{A})\times(\bbnum 1+(\underset{-}{Z}\Rightarrow\text{Int}\Rightarrow\underset{-}{Z}\Rightarrow\text{Int}\times\underset{+}{A}))\quad. +(\text{Int}+\underset{+}{A})\times(\bbnum 1+(\underset{-}{Z}\rightarrow\text{Int}\rightarrow\underset{-}{Z}\rightarrow\text{Int}\times\underset{+}{A}))\quad. \] \end_inset @@ -20089,7 +20087,7 @@ All \end_inset positions in the sub-expression -\begin_inset Formula $Z\Rightarrow\text{Int}\Rightarrow Z\Rightarrow\text{Int}\times A$ +\begin_inset Formula $Z\rightarrow\text{Int}\rightarrow Z\rightarrow\text{Int}\times A$ \end_inset are contravariant since the function arrows are curried rather than nested. @@ -20242,7 +20240,7 @@ noprefix "false" \begin_inset Formula \begin{align*} & G^{A,Z}\cong G_{1}^{A}\times G_{2}^{A,Z}\quad,\\ -\text{where } & G_{1}^{A}\triangleq\text{Int}+A\quad\text{ and }\quad G_{2}^{A,Z}\triangleq\bbnum 1+(Z\Rightarrow\text{Int}\Rightarrow Z\Rightarrow\text{Int}\times A)\quad. +\text{where } & G_{1}^{A}\triangleq\text{Int}+A\quad\text{ and }\quad G_{2}^{A,Z}\triangleq\bbnum 1+(Z\rightarrow\text{Int}\rightarrow Z\rightarrow\text{Int}\times A)\quad. \end{align*} \end_inset @@ -20338,7 +20336,7 @@ map together with a proof that it satisfies the functor laws: \begin_inset Formula \[ -\text{fmap}_{G_{1}}(f^{:A\Rightarrow B})=f^{\uparrow G_{1}}\triangleq\begin{array}{|c||cc|} +\text{fmap}_{G_{1}}(f^{:A\rightarrow B})=f^{\uparrow G_{1}}\triangleq\begin{array}{|c||cc|} & \text{Int} & B\\ \hline \text{Int} & \text{id} & \bbnum 0\\ A & \bbnum 0 & f @@ -20390,11 +20388,11 @@ product functor : \begin_inset Formula \begin{align*} - & G_{2}^{A,Z}\triangleq\bbnum 1+(Z\Rightarrow\text{Int}\Rightarrow Z\Rightarrow\text{Int}\times A)\quad.\\ -\text{co-product functor}:\quad & G_{2}^{A,Z}\cong\bbnum 1+G_{3}^{A,Z}\quad\text{ where }G_{3}^{A,Z}\triangleq Z\Rightarrow\text{Int}\Rightarrow Z\Rightarrow\text{Int}\times A\quad.\\ -\text{exponential functor}:\quad & G_{3}^{A,Z}\cong Z\Rightarrow G_{4}^{A,Z}\quad\text{ where }G_{4}^{A,Z}\triangleq\text{Int}\Rightarrow Z\Rightarrow\text{Int}\times A\quad.\\ -\text{exponential functor}:\quad & G_{4}^{A,Z}\cong\text{Int}\Rightarrow G_{5}^{A,Z}\quad\text{ where }G_{5}^{A,Z}\triangleq Z\Rightarrow\text{Int}\times A\quad.\\ -\text{exponential functor}:\quad & G_{5}^{A,Z}\cong Z\Rightarrow G_{6}^{A}\quad\text{ where }G_{6}^{A}\triangleq\text{Int}\times A\quad.\\ + & G_{2}^{A,Z}\triangleq\bbnum 1+(Z\rightarrow\text{Int}\rightarrow Z\rightarrow\text{Int}\times A)\quad.\\ +\text{co-product functor}:\quad & G_{2}^{A,Z}\cong\bbnum 1+G_{3}^{A,Z}\quad\text{ where }G_{3}^{A,Z}\triangleq Z\rightarrow\text{Int}\rightarrow Z\rightarrow\text{Int}\times A\quad.\\ +\text{exponential functor}:\quad & G_{3}^{A,Z}\cong Z\rightarrow G_{4}^{A,Z}\quad\text{ where }G_{4}^{A,Z}\triangleq\text{Int}\rightarrow Z\rightarrow\text{Int}\times A\quad.\\ +\text{exponential functor}:\quad & G_{4}^{A,Z}\cong\text{Int}\rightarrow G_{5}^{A,Z}\quad\text{ where }G_{5}^{A,Z}\triangleq Z\rightarrow\text{Int}\times A\quad.\\ +\text{exponential functor}:\quad & G_{5}^{A,Z}\cong Z\rightarrow G_{6}^{A}\quad\text{ where }G_{6}^{A}\triangleq\text{Int}\times A\quad.\\ \text{product functor}:\quad & G_{6}^{A}\cong\text{Int}\times A\cong\text{Const}^{\text{Int},A}\times\text{Id}^{A}\quad. \end{align*} @@ -20501,7 +20499,7 @@ x.map(f) \text{id} & \bbnum 0\\ \bbnum 0 & f^{\uparrow G_{3}} \end{array}\quad.\\ -\text{exponential functor}:\quad & G_{3}^{A,Z}\triangleq Z\Rightarrow G_{4}^{A,Z}\quad,\quad\quad g_{3}\triangleright f^{\uparrow G_{3}}=g_{3}\bef f^{\uparrow G_{4}}=(z^{:Z}\Rightarrow g_{3}(z)\triangleright f^{\uparrow G_{4}})\quad. +\text{exponential functor}:\quad & G_{3}^{A,Z}\triangleq Z\rightarrow G_{4}^{A,Z}\quad,\quad\quad g_{3}\triangleright f^{\uparrow G_{3}}=g_{3}\bef f^{\uparrow G_{4}}=(z^{:Z}\rightarrow g_{3}(z)\triangleright f^{\uparrow G_{4}})\quad. \end{align*} \end_inset @@ -20509,7 +20507,7 @@ x.map(f) Applying the exponential functor construction three times, we finally obtain \begin_inset Formula \begin{align*} - & G_{3}^{A,Z}\triangleq Z\Rightarrow\text{Int}\Rightarrow Z\Rightarrow G_{6}^{A}\quad,\quad\quad g_{3}\triangleright f^{\uparrow G_{3}}=z_{1}^{:Z}\Rightarrow n^{:\text{Int}}\Rightarrow z_{2}^{:Z}\Rightarrow g_{3}(z_{1})(n)(z_{2})\triangleright f^{\uparrow G_{6}}\quad.\\ + & G_{3}^{A,Z}\triangleq Z\rightarrow\text{Int}\rightarrow Z\rightarrow G_{6}^{A}\quad,\quad\quad g_{3}\triangleright f^{\uparrow G_{3}}=z_{1}^{:Z}\rightarrow n^{:\text{Int}}\rightarrow z_{2}^{:Z}\rightarrow g_{3}(z_{1})(n)(z_{2})\triangleright f^{\uparrow G_{6}}\quad.\\ & G_{6}^{A}\triangleq\text{Int}\times A\quad,\quad\quad(i\times a)\triangleright f^{\uparrow G_{6}}=i\times f(a)\quad. \end{align*} @@ -20712,7 +20710,7 @@ If \end_inset is a functor, show that -\begin_inset Formula $C\triangleq L^{A}\Rightarrow H^{A}$ +\begin_inset Formula $C\triangleq L^{A}\rightarrow H^{A}$ \end_inset is a contrafunctor with the @@ -21002,7 +21000,7 @@ noprefix "false" \begin_layout Standard Show that -\begin_inset Formula $L^{A}\triangleq F^{A}\Rightarrow G^{A}$ +\begin_inset Formula $L^{A}\triangleq F^{A}\rightarrow G^{A}$ \end_inset is, in general, neither a functor nor a contrafunctor when both @@ -21130,7 +21128,7 @@ cmap (a) \series default -\begin_inset Formula $F^{A}\triangleq\text{Int}\times A\times A+(\text{String}\Rightarrow A)\times A\quad.$ +\begin_inset Formula $F^{A}\triangleq\text{Int}\times A\times A+(\text{String}\rightarrow A)\times A\quad.$ \end_inset @@ -21142,7 +21140,7 @@ cmap (b) \series default -\begin_inset Formula $G^{A,B}\triangleq\left(A\Rightarrow\text{Int}\Rightarrow\bbnum 1+B\right)+\left(A\Rightarrow\bbnum 1+A\Rightarrow\text{Int}\right)\quad.$ +\begin_inset Formula $G^{A,B}\triangleq\left(A\rightarrow\text{Int}\rightarrow\bbnum 1+B\right)+\left(A\rightarrow\bbnum 1+A\rightarrow\text{Int}\right)\quad.$ \end_inset @@ -21154,7 +21152,7 @@ cmap (c) \series default -\begin_inset Formula $H^{A,B,C}\triangleq\left(A\Rightarrow A\Rightarrow B\Rightarrow C\right)\times C+\left(B\Rightarrow A\right)\quad.$ +\begin_inset Formula $H^{A,B,C}\triangleq\left(A\rightarrow A\rightarrow B\rightarrow C\right)\times C+\left(B\rightarrow A\right)\quad.$ \end_inset @@ -21166,7 +21164,7 @@ cmap (d) \series default -\begin_inset Formula $P^{A,B}\triangleq\left(\left(\left(A\Rightarrow B\right)\Rightarrow A\right)\Rightarrow B\right)\Rightarrow A\quad.$ +\begin_inset Formula $P^{A,B}\triangleq\left(\left(\left(A\rightarrow B\right)\rightarrow A\right)\rightarrow B\right)\rightarrow A\quad.$ \end_inset @@ -21269,7 +21267,7 @@ We have seen that some type constructors are neither functors nor contrafunctors An example of such a type constructor is \begin_inset Formula \[ -P^{A}\triangleq A+\left(A\Rightarrow\text{Int}\right)\quad. +P^{A}\triangleq A+\left(A\rightarrow\text{Int}\right)\quad. \] \end_inset @@ -21322,7 +21320,7 @@ xmap , with the type signature \begin_inset Formula \[ -\text{xmap}_{P}:\left(B\Rightarrow A\right)\Rightarrow\left(A\Rightarrow B\right)\Rightarrow P^{A}\Rightarrow P^{B}\quad. +\text{xmap}_{P}:\left(B\rightarrow A\right)\rightarrow\left(A\rightarrow B\right)\rightarrow P^{A}\rightarrow P^{B}\quad. \] \end_inset @@ -21342,7 +21340,7 @@ To see why, let us temporarily rename the contravariant occurrence of by \begin_inset Formula \[ -\tilde{P}^{Z,A}\triangleq A+\left(Z\Rightarrow\text{Int}\right)\quad. +\tilde{P}^{Z,A}\triangleq A+\left(Z\rightarrow\text{Int}\right)\quad. \] \end_inset @@ -21521,8 +21519,8 @@ xmap hold for all type parameters: \begin_inset Formula \begin{align*} -P\text{'s identity law}:\quad & \text{xmap}_{P}(\text{id}^{:A\Rightarrow A})(\text{id}^{:A\Rightarrow A})=\text{id}\quad,\\ -P\text{'s composition law}:\quad & \text{xmap}_{P}(f_{1}^{:B\Rightarrow A})(g_{1}^{:A\Rightarrow B})\bef\text{xmap}_{P}(f_{2}^{:C\Rightarrow B})(g_{2}^{:B\Rightarrow C})=\text{xmap}_{P}(f_{2}\bef f_{1})(g_{1}\bef g_{2})\quad. +P\text{'s identity law}:\quad & \text{xmap}_{P}(\text{id}^{:A\rightarrow A})(\text{id}^{:A\rightarrow A})=\text{id}\quad,\\ +P\text{'s composition law}:\quad & \text{xmap}_{P}(f_{1}^{:B\rightarrow A})(g_{1}^{:A\rightarrow B})\bef\text{xmap}_{P}(f_{2}^{:C\rightarrow B})(g_{2}^{:B\rightarrow C})=\text{xmap}_{P}(f_{2}\bef f_{1})(g_{1}\bef g_{2})\quad. \end{align*} \end_inset @@ -21589,7 +21587,7 @@ Consider an exponential-polynomial type constructor , no matter how complicated, such as \begin_inset Formula \[ -P^{A}\triangleq\left(\bbnum 1+A\times A\Rightarrow A\right)\times A\Rightarrow\bbnum 1+\left(A\Rightarrow A+\text{Int}\right)\quad. +P^{A}\triangleq\left(\bbnum 1+A\times A\rightarrow A\right)\times A\rightarrow\bbnum 1+\left(A\rightarrow A+\text{Int}\right)\quad. \] \end_inset @@ -21786,7 +21784,7 @@ subset . In other words, the conversion function -\begin_inset Formula $P\Rightarrow Q$ +\begin_inset Formula $P\rightarrow Q$ \end_inset is injective and embeds all information from a value of type @@ -21841,7 +21839,7 @@ Option[A] , and the conversion function is injective because it is an identity function, -\begin_inset Formula $\bbnum 0+x^{:A}\Rightarrow\bbnum 0+x$ +\begin_inset Formula $\bbnum 0+x^{:A}\rightarrow\bbnum 0+x$ \end_inset , that merely reassigns types. @@ -21855,11 +21853,11 @@ However, subtyping does not necessarily imply that the conversion function surjective \emph default conversion function is between the function types -\begin_inset Formula $P\triangleq\bbnum 1+A\Rightarrow\text{Int}$ +\begin_inset Formula $P\triangleq\bbnum 1+A\rightarrow\text{Int}$ \end_inset and -\begin_inset Formula $Q\triangleq\bbnum 0+A\Rightarrow\text{Int}$ +\begin_inset Formula $Q\triangleq\bbnum 0+A\rightarrow\text{Int}$ \end_inset (in Scala, @@ -21908,12 +21906,12 @@ P <: Q \end_inset , where -\begin_inset Formula $C^{X}\triangleq X\Rightarrow\text{Int}$ +\begin_inset Formula $C^{X}\triangleq X\rightarrow\text{Int}$ \end_inset is a contrafunctor. The conversion function -\begin_inset Formula $P\Rightarrow Q$ +\begin_inset Formula $P\rightarrow Q$ \end_inset is an identity function that reassigns types, @@ -21929,11 +21927,11 @@ def p2q[A](p: Option[A] => Int): Some[A] => Int = { x: Some[A] => p(x) } \end_inset In the code notation, -\begin_inset Formula $p\Rightarrow x\Rightarrow p(x)$ +\begin_inset Formula $p\rightarrow x\rightarrow p(x)$ \end_inset is easily seen to be the same as -\begin_inset Formula $p\Rightarrow p$ +\begin_inset Formula $p\rightarrow p$ \end_inset . @@ -21980,7 +21978,7 @@ None . The conversion function -\begin_inset Formula $\text{p2q}:P\Rightarrow Q$ +\begin_inset Formula $\text{p2q}:P\rightarrow Q$ \end_inset is surjective. @@ -22017,15 +22015,15 @@ We have now seen examples of either injective or surjective type conversions. . If -\begin_inset Formula $r_{1}:P_{1}\Rightarrow Q_{1}$ +\begin_inset Formula $r_{1}:P_{1}\rightarrow Q_{1}$ \end_inset is injective but -\begin_inset Formula $r_{2}:P_{2}\Rightarrow Q_{2}$ +\begin_inset Formula $r_{2}:P_{2}\rightarrow Q_{2}$ \end_inset is surjective, the function product -\begin_inset Formula $r_{1}\boxtimes r_{2}:P_{1}\times Q_{1}\Rightarrow P_{2}\times Q_{2}$ +\begin_inset Formula $r_{1}\boxtimes r_{2}:P_{1}\times Q_{1}\rightarrow P_{2}\times Q_{2}$ \end_inset is neither injective nor surjective. @@ -22044,11 +22042,11 @@ in between \begin_layout Standard An important property of functor liftings is that they preserve injectivity and surjectivity: if a function -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset is injective, it is lifted to an injective function -\begin_inset Formula $f^{\uparrow L}:L^{A}\Rightarrow L^{B}$ +\begin_inset Formula $f^{\uparrow L}:L^{A}\rightarrow L^{B}$ \end_inset ; and similarly for surjective functions @@ -22087,7 +22085,7 @@ If \end_inset is a lawful functor and -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset is an injective function then @@ -22095,7 +22093,7 @@ If \end_inset is also an injective function of type -\begin_inset Formula $L^{A}\Rightarrow L^{B}$ +\begin_inset Formula $L^{A}\rightarrow L^{B}$ \end_inset . @@ -22108,7 +22106,7 @@ Proof \begin_layout Standard We begin by noting that an injective function -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset must somehow embed all information from a value of type @@ -22162,7 +22160,7 @@ image \end_inset it came from; call that function -\begin_inset Formula $g^{:B\Rightarrow A}$ +\begin_inset Formula $g^{:B\rightarrow A}$ \end_inset . diff --git a/sofp-src/sofp-functors.tex b/sofp-src/sofp-functors.tex index 926073e26..26338ac95 100644 --- a/sofp-src/sofp-functors.tex +++ b/sofp-src/sofp-functors.tex @@ -55,7 +55,7 @@ \subsection{Motivation: Type constructors that wrap data} and reading the wrapped values have different type signatures for each ``wrapper''. However, the method \lstinline!.map! is similar in all three examples. We can say generally that the \lstinline!.map! -method will apply a given function $f^{:A\Rightarrow B}$ to the data +method will apply a given function $f^{:A\rightarrow B}$ to the data of type $A$ held inside the wrapper, and the new data (of type $B$) will remain within a wrapper of the same type: \begin{lstlisting} @@ -89,7 +89,7 @@ \subsection{Example: \texttt{Option} and the identity law\label{subsec:f-Example \] The type signature of its \lstinline!map! function is \[ -\text{map}^{A,B}:\bbnum 1+A\Rightarrow\left(A\Rightarrow B\right)\Rightarrow\bbnum 1+B\quad. +\text{map}^{A,B}:\bbnum 1+A\rightarrow\left(A\rightarrow B\right)\rightarrow\bbnum 1+B\quad. \] This function produces a new \lstinline!Option[B]! value, possibly holding transformed data. We will now use this example to develop @@ -116,8 +116,8 @@ \subsection{Example: \texttt{Option} and the identity law\label{subsec:f-Example How can we formulate this property of \lstinline!map! in a rigorous way? The trick is to write the expression \lstinline!map(oa)(f)! -and to choose the argument $f^{:A\Rightarrow B}$ to be the identity -function $\text{id}^{:A\Rightarrow A}$ (setting \lstinline!map!'s +and to choose the argument $f^{:A\rightarrow B}$ to be the identity +function $\text{id}^{:A\rightarrow A}$ (setting \lstinline!map!'s type parameters to be equal, $A=B$, so that the types match). Using an identity function to transform the data wrapped in a given value of type \lstinline!Option[A]! should not change that value. To check @@ -150,7 +150,7 @@ \subsection{Example: \texttt{Option} and the identity law\label{subsec:f-Example the wrapped data. So, the correct implementation of \lstinline!map! is \lstinline!mapY!. The code notation for \lstinline!map! is \[ -\text{map}^{A,B}\triangleq p^{:\bbnum 1+A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow p\triangleright\begin{array}{|c||cc|} +\text{map}^{A,B}\triangleq p^{:\bbnum 1+A}\rightarrow f^{:A\rightarrow B}\rightarrow p\triangleright\begin{array}{|c||cc|} & \bbnum 1 & B\\ \hline \bbnum 1 & \text{id} & \bbnum 0\\ A & \bbnum 0 & f @@ -163,7 +163,7 @@ \subsection{Example: \texttt{Option} and the identity law\label{subsec:f-Example to flip the order of the curried arguments and to use the equivalent function, called \lstinline!fmap!, with the type signature \[ -\text{fmap}^{A,B}:\left(A\Rightarrow B\right)\Rightarrow\bbnum 1+A\Rightarrow\bbnum 1+B\quad. +\text{fmap}^{A,B}:\left(A\rightarrow B\right)\rightarrow\bbnum 1+A\rightarrow\bbnum 1+B\quad. \] The Scala implementation of \lstinline!fmap! is shorter than that of \lstinline!map!: @@ -180,7 +180,7 @@ \subsection{Example: \texttt{Option} and the identity law\label{subsec:f-Example \end{wrapfigure}% The code notation for this function is \begin{equation} -\text{fmap}\,(f^{:A\Rightarrow B})\triangleq\begin{array}{|c||cc|} +\text{fmap}\,(f^{:A\rightarrow B})\triangleq\begin{array}{|c||cc|} & \bbnum 1 & B\\ \hline \bbnum 1 & \text{id} & \bbnum 0\\ A & \bbnum 0 & f @@ -195,7 +195,7 @@ \subsection{Example: \texttt{Option} and the identity law\label{subsec:f-Example Note that the type signature of \lstinline!fmap! looks like a transformation from functions of type \lstinline!A => B! to functions of type \lstinline!Option[A] => Option[B]!. This transformation is called \textbf{lifting}\index{lifting} because -it ``lifts'' a function $f^{:A\Rightarrow B}$ operating on simple +it ``lifts'' a function $f^{:A\rightarrow B}$ operating on simple values into a function operating on \lstinline!Option!-wrapped values. So, the identity law can be formulated as ``a lifted identity function @@ -217,7 +217,7 @@ \subsection{Motivation for the composition law} increment the integer value wrapped inside the \lstinline!Option! using the incrementing function \[ -\text{incr}\triangleq x^{:\text{Int}}\Rightarrow x+1\quad. +\text{incr}\triangleq x^{:\text{Int}}\rightarrow x+1\quad. \] In order to apply this function to the counter \lstinline!c!, we need to lift it. The Scala code is @@ -234,7 +234,7 @@ \subsection{Motivation for the composition law} scala> c.map(incr).map(incr) res1: Option[Int] = Some(2) \end{lstlisting} -This result is the same as when applying a lifted function $x\Rightarrow x+2$: +This result is the same as when applying a lifted function $x\rightarrow x+2$: \begin{wrapfigure}{l}{0.3\columnwidth}% \vspace{-0.8\baselineskip} @@ -249,10 +249,10 @@ \subsection{Motivation for the composition law} did not give the same result as \lstinline!c.map(incr).map(incr)!. We can formulate this property more generally: liftings should preserve -function composition for arbitrary functions $f^{:A\Rightarrow B}$ -and $g^{:B\Rightarrow C}$. This is written as +function composition for arbitrary functions $f^{:A\rightarrow B}$ +and $g^{:B\rightarrow C}$. This is written as \[ -\text{fmap}(f^{:A\Rightarrow B}\bef g^{:B\Rightarrow C})=\text{fmap}(f^{:A\Rightarrow B})\bef\text{fmap}(g^{:B\Rightarrow C})\quad. +\text{fmap}(f^{:A\rightarrow B}\bef g^{:B\rightarrow C})=\text{fmap}(f^{:A\rightarrow B})\bef\text{fmap}(g^{:B\rightarrow C})\quad. \] This equation is called the \textbf{composition law}\index{composition law!of functors}. @@ -347,8 +347,8 @@ \subsection{Motivation for the composition law} \subsubsection{Statement \label{subsec:f-Statement-composition-associativy-law}\ref{subsec:f-Statement-composition-associativy-law}} -For arbitrary functions $f^{:A\Rightarrow B}$, $g^{:B\Rightarrow C}$, -and $h^{:C\Rightarrow D}$, we have +For arbitrary functions $f^{:A\rightarrow B}$, $g^{:B\rightarrow C}$, +and $h^{:C\rightarrow D}$, we have \[ \text{fmap}(f)\bef\text{fmap}(g\bef h)=\text{fmap}(f\bef g)\bef\text{fmap}(h) \] @@ -376,12 +376,12 @@ \subsection{Functors: definition and examples\label{subsec:Functors:-definition- is not needed. \item A fully parametric function \lstinline!fmap! with type signature \[ -\text{fmap}_{L}:\left(A\Rightarrow B\right)\Rightarrow L^{A}\Rightarrow L^{B}\quad, +\text{fmap}_{L}:\left(A\rightarrow B\right)\rightarrow L^{A}\rightarrow L^{B}\quad, \] \item satisfying the laws \begin{align} -{\color{greenunder}\text{identity law for }L:}\quad & \text{fmap}_{L}(\text{id}^{:A\Rightarrow A})=\text{id}^{:L^{A}\Rightarrow L^{A}}\quad,\label{eq:f-identity-law-functor-fmap}\\ -{\color{greenunder}\text{composition law for }L:}\quad & \text{fmap}_{L}(f^{:A\Rightarrow B}\bef g^{:B\Rightarrow C})=\text{fmap}_{L}(f^{:A\Rightarrow B})\bef\text{fmap}_{L}(g^{:B\Rightarrow C})\quad.\label{eq:f-composition-law-functor-fmap} +{\color{greenunder}\text{identity law for }L:}\quad & \text{fmap}_{L}(\text{id}^{:A\rightarrow A})=\text{id}^{:L^{A}\rightarrow L^{A}}\quad,\label{eq:f-identity-law-functor-fmap}\\ +{\color{greenunder}\text{composition law for }L:}\quad & \text{fmap}_{L}(f^{:A\rightarrow B}\bef g^{:B\rightarrow C})=\text{fmap}_{L}(f^{:A\rightarrow B})\bef\text{fmap}_{L}(g^{:B\rightarrow C})\quad.\label{eq:f-composition-law-functor-fmap} \end{align} \end{itemize} A type constructor $L^{\bullet}$ with these properties is called @@ -397,8 +397,8 @@ \subsection{Functors: definition and examples\label{subsec:Functors:-definition- is shown\begin{wrapfigure}{l}{0.4\columnwidth}% \vspace{-1.9\baselineskip} \[ -\xymatrix{\xyScaleY{1.5pc}\xyScaleX{3pc} & L^{B}\ar[rd]\sp(0.6){~~\text{fmap}_{L}(g^{:B\Rightarrow C})}\\ -L^{A}\ar[ru]\sp(0.4){\text{fmap}_{L}(f^{:A\Rightarrow B})\ ~}\ar[rr]\sb(0.5){\text{fmap}_{L}(f^{:A\Rightarrow B}\bef g^{:B\Rightarrow C})\ } & & L^{C} +\xymatrix{\xyScaleY{1.5pc}\xyScaleX{3pc} & L^{B}\ar[rd]\sp(0.6){~~\text{fmap}_{L}(g^{:B\rightarrow C})}\\ +L^{A}\ar[ru]\sp(0.4){\text{fmap}_{L}(f^{:A\rightarrow B})\ ~}\ar[rr]\sb(0.5){\text{fmap}_{L}(f^{:A\rightarrow B}\bef g^{:B\rightarrow C})\ } & & L^{C} } \] @@ -414,14 +414,14 @@ \subsection{Functors: definition and examples\label{subsec:Functors:-definition- and the type diagram above with the same law written using the backward composition, \[ -\text{fmap}_{L}(g^{:B\Rightarrow C}\circ f^{:A\Rightarrow B})=\text{fmap}_{L}(g^{:B\Rightarrow C})\circ\text{fmap}_{L}(f^{:A\Rightarrow B})\quad. +\text{fmap}_{L}(g^{:B\rightarrow C}\circ f^{:A\rightarrow B})=\text{fmap}_{L}(g^{:B\rightarrow C})\circ\text{fmap}_{L}(f^{:A\rightarrow B})\quad. \] The function \lstinline!map! is computationally equivalent to \lstinline!fmap! and can be defined through \lstinline!fmap! by \begin{align*} - & \text{map}_{L}:L^{A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow L^{B}\quad,\\ - & \text{map}_{L}(x^{:L^{A}})(f^{:A\Rightarrow B})=\text{fmap}_{L}(f^{:A\Rightarrow B})(x^{:L^{A}})\quad. + & \text{map}_{L}:L^{A}\rightarrow\left(A\rightarrow B\right)\rightarrow L^{B}\quad,\\ + & \text{map}_{L}(x^{:L^{A}})(f^{:A\rightarrow B})=\text{fmap}_{L}(f^{:A\rightarrow B})(x^{:L^{A}})\quad. \end{align*} Each of the type constructors \lstinline!Option!, \lstinline!Seq!, @@ -536,20 +536,20 @@ \subsubsection{Example \label{subsec:f-Example-Int-x-A}\ref{subsec:f-Example-Int Let us now write a proof in the code notation, formulating the laws via the \lstinline!fmap! method: \[ -\text{fmap}_{\text{Counted}}(f^{:A\Rightarrow B})\triangleq\big(n^{:\text{Int}}\times a^{:A}\Rightarrow n\times f(a)\big)\quad. +\text{fmap}_{\text{Counted}}(f^{:A\rightarrow B})\triangleq\big(n^{:\text{Int}}\times a^{:A}\rightarrow n\times f(a)\big)\quad. \] To verify the identity law, we write \begin{align*} {\color{greenunder}\text{expect to equal }\text{id}:}\quad & \text{fmap}_{\text{Counted}}(\text{id})\\ -{\color{greenunder}\text{definition of }\text{fmap}_{\text{Counted}}:}\quad & =\big(n\times a\Rightarrow n\times\gunderline{\text{id}(a)}\big)\\ -{\color{greenunder}\text{definition of }\text{id}:}\quad & =\left(n\times a\Rightarrow n\times a\right)=\text{id}\quad. +{\color{greenunder}\text{definition of }\text{fmap}_{\text{Counted}}:}\quad & =\big(n\times a\rightarrow n\times\gunderline{\text{id}(a)}\big)\\ +{\color{greenunder}\text{definition of }\text{id}:}\quad & =\left(n\times a\rightarrow n\times a\right)=\text{id}\quad. \end{align*} To verify the composition law, \begin{align*} {\color{greenunder}\text{expect to equal }\text{fmap}_{\text{Counted}}(f\bef g):}\quad & \text{fmap}_{\text{Counted}}(f)\bef\text{fmap}_{\text{Counted}}(g)\\ -{\color{greenunder}\text{definition of }\text{fmap}_{\text{Counted}}:}\quad & =\left(n\times a\Rightarrow n\times f(a)\right)\bef\left(n\times b\Rightarrow n\times g(b)\right)\\ -{\color{greenunder}\text{compute composition}:}\quad & =n\times a\Rightarrow n\times\gunderline{g(f(a))}\\ -{\color{greenunder}\text{definition of }\left(f\bef g\right):}\quad & =\left(n\times a\Rightarrow n\times(f\bef g)(a)\right)=\text{fmap}_{\text{Counted}}(f\bef g)\quad. +{\color{greenunder}\text{definition of }\text{fmap}_{\text{Counted}}:}\quad & =\left(n\times a\rightarrow n\times f(a)\right)\bef\left(n\times b\rightarrow n\times g(b)\right)\\ +{\color{greenunder}\text{compute composition}:}\quad & =n\times a\rightarrow n\times\gunderline{g(f(a))}\\ +{\color{greenunder}\text{definition of }\left(f\bef g\right):}\quad & =\left(n\times a\rightarrow n\times(f\bef g)(a)\right)=\text{fmap}_{\text{Counted}}(f\bef g)\quad. \end{align*} We will prove later that all polynomial type constructors have a definition @@ -609,7 +609,7 @@ \subsubsection{Example \label{subsec:f-Example-A-A-A}\ref{subsec:f-Example-A-A-A \] and the code notation for \lstinline!fmap! is \[ -\text{fmap}_{\text{Vec}_{3}}(f^{:A\Rightarrow B})\triangleq x^{:A}\times y^{:A}\times z^{:A}\Rightarrow f(x)\times f(y)\times f(z)\quad. +\text{fmap}_{\text{Vec}_{3}}(f^{:A\rightarrow B})\triangleq x^{:A}\times y^{:A}\times z^{:A}\rightarrow f(x)\times f(y)\times f(z)\quad. \] @@ -1082,7 +1082,7 @@ \subsection{Examples of non-functors\label{subsec:Examples-of-non-functors}} Consider the type constructor $C^{\bullet}$ defined by \[ -C^{A}\triangleq A\Rightarrow\text{Int}\quad. +C^{A}\triangleq A\rightarrow\text{Int}\quad. \] Scala code for this type notation can be \begin{lstlisting} @@ -1093,7 +1093,7 @@ \subsection{Examples of non-functors\label{subsec:Examples-of-non-functors}} implement a fully parametric \lstinline!map! function with the required type signature \[ -\text{map}^{A,B}:\left(A\Rightarrow\text{Int}\right)\Rightarrow\left(A\Rightarrow B\right)\Rightarrow\left(B\Rightarrow\text{Int}\right)\quad. +\text{map}^{A,B}:\left(A\rightarrow\text{Int}\right)\rightarrow\left(A\rightarrow B\right)\rightarrow\left(B\rightarrow\text{Int}\right)\quad. \] To see this, recall that a \index{fully parametric function}fully parametric function needs to treat all types as type parameters, including @@ -1106,7 +1106,7 @@ \subsection{Examples of non-functors\label{subsec:Examples-of-non-functors}} type \lstinline!Int!, which is not allowed. Replacing the type \lstinline!Int! by a new type parameter $N$, we obtain the type signature \[ -\text{map}^{A,B,N}:\left(A\Rightarrow N\right)\Rightarrow\left(A\Rightarrow B\right)\Rightarrow B\Rightarrow N\quad. +\text{map}^{A,B,N}:\left(A\rightarrow N\right)\rightarrow\left(A\rightarrow B\right)\rightarrow B\rightarrow N\quad. \] We have seen in Example~\ref{subsec:ch-solvedExample-6} that this type signature is not implementable. So, the type constructor $C$ @@ -1158,7 +1158,7 @@ \subsection{Examples of non-functors\label{subsec:Examples-of-non-functors}} An example of a non-functor of the second kind is \[ -Q^{A}\triangleq\left(A\Rightarrow\text{Int}\right)\times A\quad. +Q^{A}\triangleq\left(A\rightarrow\text{Int}\right)\times A\quad. \] Scala code for this type constructor is \begin{lstlisting} @@ -1167,7 +1167,7 @@ \subsection{Examples of non-functors\label{subsec:Examples-of-non-functors}} A fully parametric \lstinline!map! function with the correct type signature \emph{can} be implemented (and there is only one such implementation): \[ -\text{map}^{A,B}\triangleq q^{:A\Rightarrow\text{Int}}\times a^{:A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow(\_\Rightarrow q(a))^{:B\Rightarrow\text{Int}}\times f(a)\quad. +\text{map}^{A,B}\triangleq q^{:A\rightarrow\text{Int}}\times a^{:A}\rightarrow f^{:A\rightarrow B}\rightarrow(\_\rightarrow q(a))^{:B\rightarrow\text{Int}}\times f(a)\quad. \] The corresponding Scala code is @@ -1185,16 +1185,16 @@ \subsection{Examples of non-functors\label{subsec:Examples-of-non-functors}} \noindent This \lstinline!map! function is fully parametric (since it treats the type \lstinline!Int! as a type parameter) and has the right type signature, but the functor laws do not hold. To show that -the identity law fails, we consider an arbitrary value $q^{:A\Rightarrow\text{Int}}\times a^{:A}$ +the identity law fails, we consider an arbitrary value $q^{:A\rightarrow\text{Int}}\times a^{:A}$ and compute: \begin{align*} {\color{greenunder}\text{expect to equal }q\times a:}\quad & \text{map}(q\times a)(\text{id})\\ -{\color{greenunder}\text{definition of }\text{map}:}\quad & =(\_\Rightarrow q(a))\times\gunderline{\text{id}(a)}\\ -{\color{greenunder}\text{definition of }\text{id}:}\quad & =(\_\Rightarrow q(a))\times a\\ -{\color{greenunder}\text{expanded function, }q=\left(x\Rightarrow q(x)\right):}\quad & \quad\neq q\times a=(x\Rightarrow q(x))\times a\quad. +{\color{greenunder}\text{definition of }\text{map}:}\quad & =(\_\rightarrow q(a))\times\gunderline{\text{id}(a)}\\ +{\color{greenunder}\text{definition of }\text{id}:}\quad & =(\_\rightarrow q(a))\times a\\ +{\color{greenunder}\text{expanded function, }q=\left(x\rightarrow q(x)\right):}\quad & \quad\neq q\times a=(x\rightarrow q(x))\times a\quad. \end{align*} -The law must hold for arbitrary functions $q^{:A\Rightarrow\text{Int}}$, -but the function $\left(\_\Rightarrow q(a)\right)$ always returns +The law must hold for arbitrary functions $q^{:A\rightarrow\text{Int}}$, +but the function $\left(\_\rightarrow q(a)\right)$ always returns the same value $q(a)$ and thus is not equal to the original function $q$. So, the result of evaluating the expression $\text{map}(q\times a)(\text{id})$ is not always equal to the original value $q\times a$. @@ -1210,7 +1210,7 @@ \subsection{Examples of non-functors\label{subsec:Examples-of-non-functors}} implemented \lstinline!map!. An example is a type constructor $P^{A}\triangleq A\times A$ with the \lstinline!map! function \[ -\text{map}\triangleq x^{:A}\times y^{:A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow f(y)\times f(x)\quad. +\text{map}\triangleq x^{:A}\times y^{:A}\rightarrow f^{:A\rightarrow B}\rightarrow f(y)\times f(x)\quad. \] Here is the Scala code corresponding to this code notation: \begin{lstlisting} @@ -1227,7 +1227,7 @@ \subsection{Examples of non-functors\label{subsec:Examples-of-non-functors}} We should not have swapped the values in the pair. The correct implementation of \lstinline!map!, \[ -\text{map}\triangleq x^{:A}\times y^{:A}\Rightarrow f^{:A\Rightarrow B}\Rightarrow f(x)\times f(y)\quad, +\text{map}\triangleq x^{:A}\times y^{:A}\rightarrow f^{:A\rightarrow B}\rightarrow f(x)\times f(y)\quad, \] preserves information and satisfies the functor laws. @@ -1404,7 +1404,7 @@ \subsection{Examples of non-functors\label{subsec:Examples-of-non-functors}} The functor laws for a type constructor $L^{\bullet}$ do not assume that the types $A,B$ used in the function \[ -\text{fmap}_{L}:\left(A\Rightarrow B\right)\Rightarrow L^{A}\Rightarrow L^{B} +\text{fmap}_{L}:\left(A\rightarrow B\right)\rightarrow L^{A}\rightarrow L^{B} \] should have a mathematically valid definition of the \lstinline!.equals! method (or of any other operation). The \lstinline!map! operation @@ -1430,31 +1430,31 @@ \subsection{Examples of non-functors\label{subsec:Examples-of-non-functors}} \subsection{Contrafunctors\label{subsec:Contrafunctors}} As we have seen in Section~\ref{subsec:Examples-of-non-functors}, -the type constructor $C^{\bullet}$ defined by $C^{A}\triangleq A\Rightarrow\text{Int}$ +the type constructor $C^{\bullet}$ defined by $C^{A}\triangleq A\rightarrow\text{Int}$ is not a functor because it is impossible to implement the type signature of \lstinline!map! for it, \[ -\text{map}^{A,B}:\left(A\Rightarrow\text{Int}\right)\Rightarrow\left(A\Rightarrow B\right)\Rightarrow B\Rightarrow\text{Int}\quad. +\text{map}^{A,B}:\left(A\rightarrow\text{Int}\right)\rightarrow\left(A\rightarrow B\right)\rightarrow B\rightarrow\text{Int}\quad. \] To see why, begin writing the code with a typed hole, \[ -\text{map}(c^{:A\Rightarrow\text{Int}})(f^{:A\Rightarrow B})(b^{:B})=\text{???}^{:\text{Int}}\quad. +\text{map}(c^{:A\rightarrow\text{Int}})(f^{:A\rightarrow B})(b^{:B})=\text{???}^{:\text{Int}}\quad. \] -Since $c^{:A\Rightarrow\text{Int}}$ consumes (rather than wraps) +Since $c^{:A\rightarrow\text{Int}}$ consumes (rather than wraps) values of type $A$, we have no values of type $A$ and cannot apply -the function $c^{:A\Rightarrow\text{Int}}$. However, it would be -possible to apply a function of type $B\Rightarrow A$ since a value +the function $c^{:A\rightarrow\text{Int}}$. However, it would be +possible to apply a function of type $B\rightarrow A$ since a value of type $B$ is given as one of the curried arguments, $b^{:B}$. So, we can implement a function called \lstinline!contramap! with -a different type signature where the function type is $B\Rightarrow A$ -instead of $A\Rightarrow B$: +a different type signature where the function type is $B\rightarrow A$ +instead of $A\rightarrow B$: \[ -\text{contramap}^{A,B}:\left(A\Rightarrow\text{Int}\right)\Rightarrow\left(B\Rightarrow A\right)\Rightarrow B\Rightarrow\text{Int}\quad. +\text{contramap}^{A,B}:\left(A\rightarrow\text{Int}\right)\rightarrow\left(B\rightarrow A\right)\rightarrow B\rightarrow\text{Int}\quad. \] The implementation of this function is written in the code notation as \[ -\text{contramap}\triangleq c^{:A\Rightarrow\text{Int}}\Rightarrow f^{:B\Rightarrow A}\Rightarrow\left(f\bef c\right)^{:B\Rightarrow\text{Int}}\quad, +\text{contramap}\triangleq c^{:A\rightarrow\text{Int}}\rightarrow f^{:B\rightarrow A}\rightarrow\left(f\bef c\right)^{:B\rightarrow\text{Int}}\quad, \] and the corresponding Scala code is \begin{lstlisting} @@ -1463,8 +1463,8 @@ \subsection{Contrafunctors\label{subsec:Contrafunctors}} Flipping the order of the curried arguments in \lstinline!contramap!, we define \lstinline!cmap! as \begin{align} -\text{cmap}^{A,B} & :\left(B\Rightarrow A\right)\Rightarrow C^{A}\Rightarrow C^{B}\quad,\nonumber \\ -\text{cmap} & \triangleq f^{:B\Rightarrow A}\Rightarrow c^{:A\Rightarrow\text{Int}}\Rightarrow\left(f\bef c\right)^{:B\Rightarrow\text{Int}}\quad.\label{eq:f-example-1-contrafmap} +\text{cmap}^{A,B} & :\left(B\rightarrow A\right)\rightarrow C^{A}\rightarrow C^{B}\quad,\nonumber \\ +\text{cmap} & \triangleq f^{:B\rightarrow A}\rightarrow c^{:A\rightarrow\text{Int}}\rightarrow\left(f\bef c\right)^{:B\rightarrow\text{Int}}\quad.\label{eq:f-example-1-contrafmap} \end{align} The type signature of \lstinline!cmap! has the form of a ``reverse lifting'': functions of type \lstinline!B => A! are lifted into @@ -1476,36 +1476,36 @@ \subsection{Contrafunctors\label{subsec:Contrafunctors}} We can check that this \lstinline!cmap! satisfies two laws analogous to the functor laws: \begin{align*} -{\color{greenunder}\text{identity law}:}\quad & \text{cmap}^{A,A}(\text{id}^{:A\Rightarrow A})=\text{id}^{:C^{A}\Rightarrow C^{A}}\quad,\\ -{\color{greenunder}\text{composition law}:}\quad & \text{cmap}^{A,B}(f^{:B\Rightarrow A})\bef\text{cmap}^{B,D}(g^{:D\Rightarrow B})=\text{cmap}(g\bef f)\quad. +{\color{greenunder}\text{identity law}:}\quad & \text{cmap}^{A,A}(\text{id}^{:A\rightarrow A})=\text{id}^{:C^{A}\rightarrow C^{A}}\quad,\\ +{\color{greenunder}\text{composition law}:}\quad & \text{cmap}^{A,B}(f^{:B\rightarrow A})\bef\text{cmap}^{B,D}(g^{:D\rightarrow B})=\text{cmap}(g\bef f)\quad. \end{align*} \begin{wrapfigure}{l}{0.4\columnwidth}% \vspace{-2\baselineskip} \[ -\xymatrix{\xyScaleY{1.5pc}\xyScaleX{3pc} & C^{B}\ar[rd]\sp(0.6){\ ~\text{cmap}_{C}(g^{:D\Rightarrow B})}\\ -C^{A}\ar[ru]\sp(0.4){\text{cmap}_{C}(f^{:B\Rightarrow A})\ }\ar[rr]\sb(0.5){\text{cmap}_{C}(g^{:D\Rightarrow B}\bef f^{:B\Rightarrow A})\ ~} & & C^{D} +\xymatrix{\xyScaleY{1.5pc}\xyScaleX{3pc} & C^{B}\ar[rd]\sp(0.6){\ ~\text{cmap}_{C}(g^{:D\rightarrow B})}\\ +C^{A}\ar[ru]\sp(0.4){\text{cmap}_{C}(f^{:B\rightarrow A})\ }\ar[rr]\sb(0.5){\text{cmap}_{C}(g^{:D\rightarrow B}\bef f^{:B\rightarrow A})\ ~} & & C^{D} } \] \vspace{-2\baselineskip} \end{wrapfigure}% -\noindent Since the function argument $f^{:B\Rightarrow A}$ has the +\noindent Since the function argument $f^{:B\rightarrow A}$ has the reverse order of types, the composition law reverses the order of composition $\left(g\bef f\right)$ on one side; in this way, all types match. To verify the identity law: \begin{align*} {\color{greenunder}\text{expect to equal }\text{id}:}\quad & \text{cmap}\left(\text{id}\right)\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:f-example-1-contrafmap})}:}\quad & =c\Rightarrow\gunderline{(\text{id}\bef c)}\\ -{\color{greenunder}\text{definition of }\text{id}:}\quad & =\left(c\Rightarrow c\right)=\text{id}\quad. +{\color{greenunder}\text{use Eq.~(\ref{eq:f-example-1-contrafmap})}:}\quad & =c\rightarrow\gunderline{(\text{id}\bef c)}\\ +{\color{greenunder}\text{definition of }\text{id}:}\quad & =\left(c\rightarrow c\right)=\text{id}\quad. \end{align*} To verify the composition law: \begin{align*} {\color{greenunder}\text{expect to equal }\text{cmap}\left(g\bef f\right):}\quad & \text{cmap}\left(f\right)\bef\text{cmap}\left(g\right)\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:f-example-1-contrafmap})}:}\quad & =\left(c\Rightarrow(f\bef c)\right)\bef(\gunderline c\Rightarrow(g\bef\gunderline c))\\ -{\color{greenunder}\text{rename }c\text{ to }d\text{ for clarity}:}\quad & =\left(c\Rightarrow(f\bef c)\right)\bef\left(d\Rightarrow(g\bef d)\right)\\ -{\color{greenunder}\text{compute composition}:}\quad & =\left(c\Rightarrow g\bef f\bef c\right)\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:f-example-1-contrafmap})}:}\quad & =\left(c\rightarrow(f\bef c)\right)\bef(\gunderline c\rightarrow(g\bef\gunderline c))\\ +{\color{greenunder}\text{rename }c\text{ to }d\text{ for clarity}:}\quad & =\left(c\rightarrow(f\bef c)\right)\bef\left(d\rightarrow(g\bef d)\right)\\ +{\color{greenunder}\text{compute composition}:}\quad & =\left(c\rightarrow g\bef f\bef c\right)\\ {\color{greenunder}\text{use Eq.~(\ref{eq:f-example-1-contrafmap})}:}\quad & =\text{cmap}\left(g\bef f\right)\quad. \end{align*} @@ -1515,7 +1515,7 @@ \subsection{Contrafunctors\label{subsec:Contrafunctors}} \subsubsection{Example \label{subsec:f-Example-contrafunctor}\ref{subsec:f-Example-contrafunctor}} -Show that the type constructor $D^{A}\triangleq A\Rightarrow A\Rightarrow\text{Int}$ +Show that the type constructor $D^{A}\triangleq A\rightarrow A\rightarrow\text{Int}$ is a contrafunctor. \subparagraph{Solution} @@ -1527,16 +1527,16 @@ \subsubsection{Example \label{subsec:f-Example-contrafunctor}\ref{subsec:f-Examp We begin implementing \lstinline!contramap! by writing code with a typed hole: \[ -\text{contramap}^{A,B}\triangleq d^{:A\Rightarrow A\Rightarrow\text{Int}}\Rightarrow f^{:B\Rightarrow A}\Rightarrow b_{1}^{:B}\Rightarrow b_{2}^{:B}\Rightarrow\text{???}^{:\text{Int}}\quad. +\text{contramap}^{A,B}\triangleq d^{:A\rightarrow A\rightarrow\text{Int}}\rightarrow f^{:B\rightarrow A}\rightarrow b_{1}^{:B}\rightarrow b_{2}^{:B}\rightarrow\text{???}^{:\text{Int}}\quad. \] To fill the typed hole, we need to compute a value of type \lstinline!Int!. The only possibility is to apply $d$ to two curried arguments of type $A$. We have two curried arguments of type $B$. So we apply -$f^{:B\Rightarrow A}$ to those arguments, obtaining two values of +$f^{:B\rightarrow A}$ to those arguments, obtaining two values of type $A$. To avoid information loss, we need to preserve the order of the curried arguments. So the resulting expression is \[ -\text{contramap}^{A,B}\triangleq d^{:A\Rightarrow A\Rightarrow\text{Int}}\Rightarrow f^{:B\Rightarrow A}\Rightarrow b_{1}^{:B}\Rightarrow b_{2}^{:B}\Rightarrow d\left(f(b_{1})\right)\left(f(b_{2})\right)\quad. +\text{contramap}^{A,B}\triangleq d^{:A\rightarrow A\rightarrow\text{Int}}\rightarrow f^{:B\rightarrow A}\rightarrow b_{1}^{:B}\rightarrow b_{2}^{:B}\rightarrow d\left(f(b_{1})\right)\left(f(b_{2})\right)\quad. \] The corresponding Scala code is \begin{lstlisting} @@ -1545,23 +1545,23 @@ \subsubsection{Example \label{subsec:f-Example-contrafunctor}\ref{subsec:f-Examp To verify the laws, it is easier to use the equivalent \lstinline!cmap! defined by \begin{equation} -\text{cmap}^{A,B}(f^{:B\Rightarrow A})\triangleq d^{:A\Rightarrow A\Rightarrow\text{Int}}\Rightarrow b_{1}^{:B}\Rightarrow b_{2}^{:B}\Rightarrow d\left(f(b_{1})\right)\left(f(b_{2})\right)\quad.\label{eq:f-example-2-contrafmap} +\text{cmap}^{A,B}(f^{:B\rightarrow A})\triangleq d^{:A\rightarrow A\rightarrow\text{Int}}\rightarrow b_{1}^{:B}\rightarrow b_{2}^{:B}\rightarrow d\left(f(b_{1})\right)\left(f(b_{2})\right)\quad.\label{eq:f-example-2-contrafmap} \end{equation} To verify the identity law: \begin{align*} {\color{greenunder}\text{expect to equal }\text{id}:}\quad & \text{cmap}\left(\text{id}\right)\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:f-example-2-contrafmap})}:}\quad & =d\Rightarrow b_{1}\Rightarrow b_{2}\Rightarrow d\gunderline{\left(\text{id}(b_{1})\right)}\gunderline{\left(\text{id}(b_{2})\right)}\\ -{\color{greenunder}\text{definition of }\text{id}:}\quad & =d\Rightarrow\gunderline{b_{1}\Rightarrow b_{2}\Rightarrow d(b_{1})(b_{2})}\\ -{\color{greenunder}\text{simplify curried function}:}\quad & =\left(d\Rightarrow d\right)=\text{id}\quad. +{\color{greenunder}\text{use Eq.~(\ref{eq:f-example-2-contrafmap})}:}\quad & =d\rightarrow b_{1}\rightarrow b_{2}\rightarrow d\gunderline{\left(\text{id}(b_{1})\right)}\gunderline{\left(\text{id}(b_{2})\right)}\\ +{\color{greenunder}\text{definition of }\text{id}:}\quad & =d\rightarrow\gunderline{b_{1}\rightarrow b_{2}\rightarrow d(b_{1})(b_{2})}\\ +{\color{greenunder}\text{simplify curried function}:}\quad & =\left(d\rightarrow d\right)=\text{id}\quad. \end{align*} To verify the composition law, we rewrite its left-hand side into the right-hand side: \begin{align*} & \text{cmap}\left(f\right)\bef\text{cmap}\left(g\right)\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:f-example-2-contrafmap})}:}\quad & =\left(d\Rightarrow b_{1}\Rightarrow b_{2}\Rightarrow d\left(f(b_{1})\right)\left(f(b_{2})\right)\right)\bef(\gunderline d\Rightarrow b_{1}\Rightarrow b_{2}\Rightarrow\gunderline d\left(g(b_{1})\right)\left(g(b_{2})\right))\\ -{\color{greenunder}\text{rename }d\text{ to }e:}\quad & =\left(d\Rightarrow b_{1}\Rightarrow b_{2}\Rightarrow d\left(f(b_{1})\right)\left(f(b_{2})\right)\right)\bef\left(e\Rightarrow b_{1}\Rightarrow b_{2}\Rightarrow e\left(g(b_{1})\right)\left(g(b_{2})\right)\right)\\ -{\color{greenunder}\text{compute composition}:}\quad & =d\Rightarrow b_{1}\Rightarrow b_{2}\Rightarrow d\left(f(g(b_{1}))\right)\left(f(g(b_{2}))\right)\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:f-example-2-contrafmap})}:}\quad & =\text{cmap}(b\Rightarrow f(g(b)))\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:f-example-2-contrafmap})}:}\quad & =\left(d\rightarrow b_{1}\rightarrow b_{2}\rightarrow d\left(f(b_{1})\right)\left(f(b_{2})\right)\right)\bef(\gunderline d\rightarrow b_{1}\rightarrow b_{2}\rightarrow\gunderline d\left(g(b_{1})\right)\left(g(b_{2})\right))\\ +{\color{greenunder}\text{rename }d\text{ to }e:}\quad & =\left(d\rightarrow b_{1}\rightarrow b_{2}\rightarrow d\left(f(b_{1})\right)\left(f(b_{2})\right)\right)\bef\left(e\rightarrow b_{1}\rightarrow b_{2}\rightarrow e\left(g(b_{1})\right)\left(g(b_{2})\right)\right)\\ +{\color{greenunder}\text{compute composition}:}\quad & =d\rightarrow b_{1}\rightarrow b_{2}\rightarrow d\left(f(g(b_{1}))\right)\left(f(g(b_{2}))\right)\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:f-example-2-contrafmap})}:}\quad & =\text{cmap}(b\rightarrow f(g(b)))\\ {\color{greenunder}\text{definition of }\left(g\bef f\right):}\quad & =\text{cmap}(g\bef f)\quad. \end{align*} @@ -1571,7 +1571,7 @@ \subsubsection{Example \label{subsec:f-Example-contrafunctor}\ref{subsec:f-Examp suggest the heuristic view that contrafunctors ``consume'' data while functors ``wrap'' data. By looking at the position of a given type parameter in a type expression such as $A\times\text{Int}$ or -$A\Rightarrow A\Rightarrow\text{Int}$, we can see whether the type +$A\rightarrow A\rightarrow\text{Int}$, we can see whether the type parameter is ``consumed'' or ``wrapped'': A type parameter to the left of a function arrow is being ``consumed''; a type parameter to the right of a function arrow (or used without a function arrow) @@ -1583,7 +1583,7 @@ \subsubsection{Example \label{subsec:f-Example-contrafunctor}\ref{subsec:f-Examp a functor nor a contrafunctor. An example of such a type constructor is \[ -N^{A}\triangleq\left(A\Rightarrow\text{Int}\right)\times\left(\bbnum 1+A\right)\quad. +N^{A}\triangleq\left(A\rightarrow\text{Int}\right)\times\left(\bbnum 1+A\right)\quad. \] We can implement neither \lstinline!map! nor \lstinline!contramap! for $N^{\bullet}$. Intuitively, the type parameter $A$ is used both @@ -1601,9 +1601,9 @@ \subsection{Subtyping, covariance, and contravariance} A type $P$ is called a \textbf{subtype}\index{types!subtype of} of a type $Q$ if there exists a designated\index{type conversion function} -\textbf{type conversion} function of type $P\Rightarrow Q$ that the +\textbf{type conversion} function of type $P\rightarrow Q$ that the compiler will automatically use whenever necessary to match types. -For instance, applying a function of type $Q\Rightarrow Z$ to a value +For instance, applying a function of type $Q\rightarrow Z$ to a value of type $P$ is ordinarily a type error, \begin{lstlisting} val h: Q => Z = ??? @@ -1611,7 +1611,7 @@ \subsection{Subtyping, covariance, and contravariance} h(p) // Type error: the argument of h must be of type Q, not P. \end{lstlisting} However, this code will work when $P$ is a subtype of $Q$ because -the compiler will automatically use the type conversion $P\Rightarrow Q$ +the compiler will automatically use the type conversion $P\rightarrow Q$ before applying the function \lstinline!h!. Different programming languages define subtyping differently because @@ -1678,9 +1678,9 @@ \subsection{Subtyping, covariance, and contravariance} \end{lstlisting} This is written in the code notation as \[ -\text{p2q}(f^{:\text{AtMostTwo}\Rightarrow\text{Int}})\triangleq t^{:\text{Two}}\Rightarrow f(t)\quad. +\text{p2q}(f^{:\text{AtMostTwo}\rightarrow\text{Int}})\triangleq t^{:\text{Two}}\rightarrow f(t)\quad. \] -Note that $t^{:\text{Two}}\Rightarrow f(t)$ is the same function +Note that $t^{:\text{Two}}\rightarrow f(t)$ is the same function as $f$, except applied to a subtype \lstinline!Two! of \lstinline!AtMostTwo!. So, the implementation of \lstinline!p2q! is an identity function with reassigned types. @@ -1738,9 +1738,9 @@ \subsection{Subtyping, covariance, and contravariance} \paragraph{Subtyping for type constructors} If a type constructor $L^{A}$ is a functor, we can use its $\text{fmap}_{L}$ -method to lift a type conversion function $f:P\Rightarrow Q$ into +method to lift a type conversion function $f:P\rightarrow Q$ into \[ -\text{fmap}_{L}(f):L^{P}\Rightarrow L^{Q}\quad, +\text{fmap}_{L}(f):L^{P}\rightarrow L^{Q}\quad, \] which gives a type conversion function from $L^{P}$ to $L^{Q}$. This gives a subtyping relation between the types $L^{P}$ and $L^{Q}$ @@ -1748,9 +1748,9 @@ \subsection{Subtyping, covariance, and contravariance} identity function, due to functor $L$'s identity law, $\text{fmap}_{L}(\text{id})=\text{id}$. If a type constructor $C^{A}$ is a contrafunctor, a type conversion -function $f^{:P\Rightarrow Q}$ is lifted to +function $f^{:P\rightarrow Q}$ is lifted to \[ -\text{cmap}_{C}(f):C^{Q}\Rightarrow C^{P}\quad, +\text{cmap}_{C}(f):C^{Q}\rightarrow C^{P}\quad, \] showing that $C^{Q}$ is a subtype of $C^{P}$. The identity law of the contrafunctor $C$, @@ -1856,7 +1856,7 @@ \subsubsection{Example \label{subsec:f-Example-functors-1}\ref{subsec:f-Example- \textbf{(b)} $\text{Data}^{A}\triangleq\bbnum 1+A\times(\text{Int}\times\text{String}+A)\quad.$ -\textbf{(c)} $\text{Data}^{A}\triangleq(\text{String}\Rightarrow\text{Int}\Rightarrow A)\times A+(\text{Bool}\Rightarrow\text{Double}\Rightarrow A)\times A\quad.$ +\textbf{(c)} $\text{Data}^{A}\triangleq(\text{String}\rightarrow\text{Int}\rightarrow A)\times A+(\text{Bool}\rightarrow\text{Double}\rightarrow A)\times A\quad.$ \subparagraph{Solution} @@ -1874,12 +1874,12 @@ \subsubsection{Example \label{subsec:f-Example-functors-1}\ref{subsec:f-Example- The function \lstinline!fmap! must have the type signature \[ -\text{fmap}^{A,B}:f^{:A\Rightarrow B}\Rightarrow\text{Data}^{A}\Rightarrow\text{Data}^{B}\quad. +\text{fmap}^{A,B}:f^{:A\rightarrow B}\rightarrow\text{Data}^{A}\rightarrow\text{Data}^{B}\quad. \] To implement \lstinline!fmap! correctly, we need to transform each part of the disjunctive type \lstinline!Data[A]! into the corresponding part of \lstinline!Data[B]! without loss of information. To clarify -where the transformation $f^{:A\Rightarrow B}$ need to be applied, +where the transformation $f^{:A\rightarrow B}$ need to be applied, let us write the type notation for $\text{Data}^{A}$ and $\text{Data}^{B}$ side by side: \begin{align*} @@ -1917,7 +1917,7 @@ \subsubsection{Example \label{subsec:f-Example-functors-1}\ref{subsec:f-Example- \text{Data}^{B} & \triangleq\bbnum 1+B\times(\text{Int}\times\text{String}+B)\quad, \end{align*} and transform $\text{Data}^{A}$ into $\text{Data}^{B}$ by applying -$f^{:A\Rightarrow B}$ at the correct places: +$f^{:A\rightarrow B}$ at the correct places: \begin{lstlisting} def fmap[A, B](f: A => B): Data[A] => Data[B] = { case Data(None) => Data(None) @@ -1939,11 +1939,11 @@ \subsubsection{Example \label{subsec:f-Example-functors-1}\ref{subsec:f-Example- } \end{lstlisting} -\textbf{(c)} Since the type structures $(\text{String}\Rightarrow\text{Int}\Rightarrow A)\times A$ -and $(\text{Bool}\Rightarrow\text{Double}\Rightarrow A)\times A$ +\textbf{(c)} Since the type structures $(\text{String}\rightarrow\text{Int}\rightarrow A)\times A$ +and $(\text{Bool}\rightarrow\text{Double}\rightarrow A)\times A$ have a similar pattern, let us define a parameterized type \[ -Q^{X,Y,A}\triangleq\left(X\Rightarrow Y\Rightarrow A\right)\times A\quad, +Q^{X,Y,A}\triangleq\left(X\rightarrow Y\rightarrow A\right)\times A\quad, \] and express the given type expression as \[ @@ -1961,25 +1961,25 @@ \subsubsection{Example \label{subsec:f-Example-functors-1}\ref{subsec:f-Example- To derive the code of \lstinline!fmap! for $Q^{\bullet}$, we begin with the type signature \[ -\text{fmap}_{Q}^{A,B}:\left(A\Rightarrow B\right)\Rightarrow\left(X\Rightarrow Y\Rightarrow A\right)\times A\Rightarrow\left(X\Rightarrow Y\Rightarrow B\right)\times B +\text{fmap}_{Q}^{A,B}:\left(A\rightarrow B\right)\rightarrow\left(X\rightarrow Y\rightarrow A\right)\times A\rightarrow\left(X\rightarrow Y\rightarrow B\right)\times B \] and start writing the code using typed holes, \[ -\text{fmap}_{Q}(f^{:A\Rightarrow B})\triangleq g^{:X\Rightarrow Y\Rightarrow A}\times a^{:A}\Rightarrow\text{???}^{:X\Rightarrow Y\Rightarrow B}\times\text{???}^{:B}\quad. +\text{fmap}_{Q}(f^{:A\rightarrow B})\triangleq g^{:X\rightarrow Y\rightarrow A}\times a^{:A}\rightarrow\text{???}^{:X\rightarrow Y\rightarrow B}\times\text{???}^{:B}\quad. \] The typed hole $\text{???}^{:B}$ is filled by $f(a)$. To fill the remaining type hole, we write \begin{align*} - & \text{???}^{:X\Rightarrow Y\Rightarrow B}\\ - & =x^{:X}\Rightarrow y^{:Y}\Rightarrow\gunderline{\text{???}^{:B}}\\ - & =x^{:X}\Rightarrow y^{:Y}\Rightarrow f(\text{???}^{:A})\quad. + & \text{???}^{:X\rightarrow Y\rightarrow B}\\ + & =x^{:X}\rightarrow y^{:Y}\rightarrow\gunderline{\text{???}^{:B}}\\ + & =x^{:X}\rightarrow y^{:Y}\rightarrow f(\text{???}^{:A})\quad. \end{align*} It would be wrong to fill the typed hole $\text{???}^{:A}$ by $a^{:A}$ -because a value of type $X\Rightarrow Y\Rightarrow B$ should be computed -using the given data $g^{:X\Rightarrow Y\Rightarrow A}$ of type $X\Rightarrow Y\Rightarrow A$. +because a value of type $X\rightarrow Y\rightarrow B$ should be computed +using the given data $g^{:X\rightarrow Y\rightarrow A}$ of type $X\rightarrow Y\rightarrow A$. So we write \[ -\text{???}^{:X\Rightarrow Y\Rightarrow B}=x^{:X}\Rightarrow y^{:Y}\Rightarrow f(g(x)(y))\quad. +\text{???}^{:X\rightarrow Y\rightarrow B}=x^{:X}\rightarrow y^{:Y}\rightarrow f(g(x)(y))\quad. \] The corresponding Scala code is \begin{lstlisting} @@ -2015,9 +2015,9 @@ \subsubsection{Example \label{subsec:f-Example-functors-4}\ref{subsec:f-Example- Decide which of these types are functors or contrafunctors, and implement \lstinline!fmap! or \lstinline!cmap! as appropriate: -\textbf{(a)} $\text{Data}^{A}\triangleq\left(A\Rightarrow\text{Int}\right)+(A\Rightarrow A\Rightarrow\text{String})\quad.$ +\textbf{(a)} $\text{Data}^{A}\triangleq\left(A\rightarrow\text{Int}\right)+(A\rightarrow A\rightarrow\text{String})\quad.$ -\textbf{(b)} $\text{Data}^{A,B}\triangleq\left(A+B\right)\times\left(\left(A\Rightarrow\text{Int}\right)\Rightarrow B\right)\quad.$ +\textbf{(b)} $\text{Data}^{A,B}\triangleq\left(A+B\right)\times\left(\left(A\rightarrow\text{Int}\right)\rightarrow B\right)\quad.$ \subparagraph{Solution} @@ -2049,8 +2049,8 @@ \subsubsection{Example \label{subsec:f-Example-functors-4}\ref{subsec:f-Example- \lstinline!Either[A, B]!. In other words, $A$ is ``wrapped'', i.e.~it is in a covariant position within the first part of the tuple. It remains to check the second part of the tuple, which is a higher-order -function of type $\left(A\Rightarrow\text{Int}\right)\Rightarrow B$. -This function consumes a function of type $A\Rightarrow\text{Int}$, +function of type $\left(A\rightarrow\text{Int}\right)\rightarrow B$. +This function consumes a function of type $A\rightarrow\text{Int}$, which in turn consumes a value of type $A$. Consumers of $A$ are contravariant in $A$, but it turns out that a ``consumer of a consumer of $A$'' is covariant in $A$. So we will be able to implement \lstinline!fmap! @@ -2058,7 +2058,7 @@ \subsubsection{Example \label{subsec:f-Example-functors-4}\ref{subsec:f-Example- the type parameter $B$ to $Z$ for clarity, we write the type signature for \lstinline!fmap! like this, \[ -\text{fmap}^{A,C,Z}:\left(A\Rightarrow C\right)\Rightarrow\left(A+Z\right)\times\left(\left(A\Rightarrow\text{Int}\right)\Rightarrow Z\right)\Rightarrow\left(C+Z\right)\times\left(\left(C\Rightarrow\text{Int}\right)\Rightarrow Z\right)\quad. +\text{fmap}^{A,C,Z}:\left(A\rightarrow C\right)\rightarrow\left(A+Z\right)\times\left(\left(A\rightarrow\text{Int}\right)\rightarrow Z\right)\rightarrow\left(C+Z\right)\times\left(\left(C\rightarrow\text{Int}\right)\rightarrow Z\right)\quad. \] We need to transform each part of the tuple separately. Transforming $A+Z$ into $C+Z$ is straightforward via the function @@ -2076,17 +2076,17 @@ \subsubsection{Example \label{subsec:f-Example-functors-4}\ref{subsec:f-Example- case Right(z) => Right(z) } \end{lstlisting} -To derive code transforming $\left(A\Rightarrow\text{Int}\right)\Rightarrow Z$ -into $\left(C\Rightarrow\text{Int}\right)\Rightarrow Z$, we use typed +To derive code transforming $\left(A\rightarrow\text{Int}\right)\rightarrow Z$ +into $\left(C\rightarrow\text{Int}\right)\rightarrow Z$, we use typed holes: \begin{align*} - & f^{:A\Rightarrow C}\Rightarrow g^{:\left(A\Rightarrow\text{Int}\right)\Rightarrow Z}\Rightarrow\gunderline{\text{???}^{:\left(C\Rightarrow\text{Int}\right)\Rightarrow Z}}\\ -{\color{greenunder}\text{nameless function}:}\quad & =f^{:A\Rightarrow C}\Rightarrow g^{:\left(A\Rightarrow\text{Int}\right)\Rightarrow Z}\Rightarrow p^{:C\Rightarrow\text{Int}}\Rightarrow\gunderline{\text{???}^{:Z}}\\ -{\color{greenunder}\text{get a }Z\text{ by applying }g:}\quad & =f\Rightarrow g\Rightarrow p\Rightarrow g(\gunderline{\text{???}^{:A\Rightarrow\text{Int}}})\\ -{\color{greenunder}\text{nameless function}:}\quad & =f\Rightarrow g\Rightarrow p\Rightarrow g(a^{:A}\Rightarrow\gunderline{\text{???}^{:\text{Int}}})\\ -{\color{greenunder}\text{get an Int by applying }p:}\quad & =f\Rightarrow g\Rightarrow p\Rightarrow g(a\Rightarrow p(\gunderline{\text{???}^{:C}}))\\ -{\color{greenunder}\text{get a }C\text{ by applying }f:}\quad & =f\Rightarrow g\Rightarrow p\Rightarrow g(a\Rightarrow p(f(\gunderline{\text{???}^{:A}})))\\ -{\color{greenunder}\text{use argument }a^{:A}:}\quad & =f\Rightarrow g\Rightarrow p\Rightarrow g(a\Rightarrow p(f(a))\quad. + & f^{:A\rightarrow C}\rightarrow g^{:\left(A\rightarrow\text{Int}\right)\rightarrow Z}\rightarrow\gunderline{\text{???}^{:\left(C\rightarrow\text{Int}\right)\rightarrow Z}}\\ +{\color{greenunder}\text{nameless function}:}\quad & =f^{:A\rightarrow C}\rightarrow g^{:\left(A\rightarrow\text{Int}\right)\rightarrow Z}\rightarrow p^{:C\rightarrow\text{Int}}\rightarrow\gunderline{\text{???}^{:Z}}\\ +{\color{greenunder}\text{get a }Z\text{ by applying }g:}\quad & =f\rightarrow g\rightarrow p\rightarrow g(\gunderline{\text{???}^{:A\rightarrow\text{Int}}})\\ +{\color{greenunder}\text{nameless function}:}\quad & =f\rightarrow g\rightarrow p\rightarrow g(a^{:A}\rightarrow\gunderline{\text{???}^{:\text{Int}}})\\ +{\color{greenunder}\text{get an Int by applying }p:}\quad & =f\rightarrow g\rightarrow p\rightarrow g(a\rightarrow p(\gunderline{\text{???}^{:C}}))\\ +{\color{greenunder}\text{get a }C\text{ by applying }f:}\quad & =f\rightarrow g\rightarrow p\rightarrow g(a\rightarrow p(f(\gunderline{\text{???}^{:A}})))\\ +{\color{greenunder}\text{use argument }a^{:A}:}\quad & =f\rightarrow g\rightarrow p\rightarrow g(a\rightarrow p(f(a))\quad. \end{align*} In the resulting Scala code for \lstinline!fmap!, we write out some types for clarity: @@ -2142,11 +2142,11 @@ \subsubsection{Example \label{subsec:f-Example-functors-6}\ref{subsec:f-Example- The type notation puts together all parts of the disjunctive type: \[ -\text{Coi}^{A,B}\triangleq A\times B\times(B\Rightarrow\text{Int})+A\times B\times\text{Int}+(\text{String}\Rightarrow A)\times(B\Rightarrow A)\quad. +\text{Coi}^{A,B}\triangleq A\times B\times(B\rightarrow\text{Int})+A\times B\times\text{Int}+(\text{String}\rightarrow A)\times(B\rightarrow A)\quad. \] Now find which types are wrapped and which are consumed in this type expression. We find that the type parameter $A$ is wrapped and never -consumed, but $B$ is both wrapped and consumed (in $B\Rightarrow A$). +consumed, but $B$ is both wrapped and consumed (in $B\rightarrow A$). So, the type constructor \lstinline!Coi! is covariant in $A$ but neither covariant nor contravariant in $B$. We can check this by compiling the corresponding Scala code with variance annotations: @@ -2193,13 +2193,13 @@ \subsubsection{Exercise \label{subsec:f-Exercise-functors-1}\ref{subsec:f-Exerci \textbf{(a)} $\text{Data}^{A}\triangleq\left(\bbnum 1+A\right)\times\left(\bbnum 1+A\right)\times\text{String}\quad.$ -\textbf{(b)} $\text{Data}^{A}\triangleq(A\Rightarrow\text{Bool})\Rightarrow\left(A\times\left(\text{Int}+A\right)\right)\quad.$ +\textbf{(b)} $\text{Data}^{A}\triangleq(A\rightarrow\text{Bool})\rightarrow\left(A\times\left(\text{Int}+A\right)\right)\quad.$ -\textbf{(c)} $\text{Data}^{A,B}\triangleq(A\Rightarrow\text{Bool})\times\left((A+B)\Rightarrow\text{Int}\right)\quad.$ +\textbf{(c)} $\text{Data}^{A,B}\triangleq(A\rightarrow\text{Bool})\times\left((A+B)\rightarrow\text{Int}\right)\quad.$ -\textbf{(d)} $\text{Data}^{A}\triangleq(\bbnum 1+(A\Rightarrow\text{Bool}))\Rightarrow(\bbnum 1+(A\Rightarrow\text{Int}))\Rightarrow\text{Int}\quad.$ +\textbf{(d)} $\text{Data}^{A}\triangleq(\bbnum 1+(A\rightarrow\text{Bool}))\rightarrow(\bbnum 1+(A\rightarrow\text{Int}))\rightarrow\text{Int}\quad.$ -\textbf{(e)} $\text{Data}^{B}\triangleq(B+(\text{Int}\Rightarrow B))\times(B+(\text{String}\Rightarrow B))\quad.$ +\textbf{(e)} $\text{Data}^{B}\triangleq(B+(\text{Int}\rightarrow B))\times(B+(\text{String}\rightarrow B))\quad.$ \subsubsection{Exercise \label{subsec:f-Exercise-functors-2}\ref{subsec:f-Exercise-functors-2}} @@ -2222,7 +2222,7 @@ \section{Laws and structure\label{sec:f-Laws-and-structure}} is a functor or perhaps a contrafunctor? For example, consider the type constructor $Z^{A,R}$ defined by \begin{equation} -Z^{A,R}\triangleq\left(\left(A\Rightarrow A\Rightarrow R\right)\Rightarrow R\right)\times A+\left(\bbnum 1+R\Rightarrow A+\text{Int}\right)+A\times A\times\text{Int}\times\text{Int}\quad.\label{eq:f-example-complicated-z} +Z^{A,R}\triangleq\left(\left(A\rightarrow A\rightarrow R\right)\rightarrow R\right)\times A+\left(\bbnum 1+R\rightarrow A+\text{Int}\right)+A\times A\times\text{Int}\times\text{Int}\quad.\label{eq:f-example-complicated-z} \end{equation} Is $Z^{A,R}$ a functor with respect to $A$, or perhaps with respect to $R$? To answer these questions, we will systematically build up @@ -2237,8 +2237,8 @@ \subsection{Reformulations of laws} in terms of the curried function \lstinline!map!, the structure of the laws becomes less clear: \begin{align*} - & \text{map}_{L}(x^{:L^{A}})(\text{id}^{:A\Rightarrow A})=x\quad,\\ - & \text{map}_{L}(x^{:L^{A}})(f^{:A\Rightarrow B}\bef g^{:B\Rightarrow C})=\text{map}_{L}\big(\text{map}_{L}(x)(f)\big)(g)\quad. + & \text{map}_{L}(x^{:L^{A}})(\text{id}^{:A\rightarrow A})=x\quad,\\ + & \text{map}_{L}(x^{:L^{A}})(f^{:A\rightarrow B}\bef g^{:B\rightarrow C})=\text{map}_{L}\big(\text{map}_{L}(x)(f)\big)(g)\quad. \end{align*} However, the laws again look clearer when using the infix method \lstinline!.map!: @@ -2273,7 +2273,7 @@ \subsection{Reformulations of laws} (pronounced ``lifted to $L$'') defined, for any function $f$, by \[ -(f^{:A\Rightarrow B})^{\uparrow L}:L^{A}\Rightarrow L^{B}\quad,\quad\quad f^{\uparrow L}\triangleq\text{fmap}_{L}(f)\quad. +(f^{:A\rightarrow B})^{\uparrow L}:L^{A}\rightarrow L^{B}\quad,\quad\quad f^{\uparrow L}\triangleq\text{fmap}_{L}(f)\quad. \] Now we can write \begin{align*} @@ -2335,7 +2335,7 @@ \subsection{Bifunctors\label{subsec:Bifunctors}} We see that the type constructor $F^{\bullet,B}$ is a functor, with the corresponding \lstinline!fmap! function \[ -\text{fmap}_{F^{\bullet,B}}(f^{:A\Rightarrow C})\triangleq a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\Rightarrow f(a)\times b_{1}\times b_{2}\quad. +\text{fmap}_{F^{\bullet,B}}(f^{:A\rightarrow C})\triangleq a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\rightarrow f(a)\times b_{1}\times b_{2}\quad. \] Instead of saying that $F^{\bullet,B}$ is a functor, we can also say more verbosely that $F^{A,B}$ is a functor with respect to $A$. @@ -2343,7 +2343,7 @@ \subsection{Bifunctors\label{subsec:Bifunctors}} If we now fix the type parameter $A$, we find that the type constructor $F^{A,\bullet}$ is a functor, with the \lstinline!fmap! function \[ -\text{fmap}_{F^{A,\bullet}}(g^{:B\Rightarrow D})\triangleq a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\Rightarrow a\times g(b_{1})\times g(b_{2})\quad. +\text{fmap}_{F^{A,\bullet}}(g^{:B\rightarrow D})\triangleq a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\rightarrow a\times g(b_{1})\times g(b_{2})\quad. \] Since the bifunctor $F^{\bullet,\bullet}$ is a functor with respect @@ -2351,33 +2351,33 @@ \subsection{Bifunctors\label{subsec:Bifunctors}} $F^{A,B}$ to a value of type $F^{C,D}$ by applying the two \lstinline!fmap! functions one after another. It is convenient to denote this transformation by a single operation called \lstinline!bimap! that uses two functions -$f^{:A\Rightarrow C}$ and $g^{:B\Rightarrow D}$ as arguments: +$f^{:A\rightarrow C}$ and $g^{:B\rightarrow D}$ as arguments: \begin{align} -\text{bimap}_{F}(f^{:A\Rightarrow C})(g^{:B\Rightarrow D}) & :F^{A,B}\Rightarrow F^{C,D}\quad,\nonumber \\ -\text{bimap}_{F}(f^{:A\Rightarrow C})(g^{:B\Rightarrow D}) & \triangleq\text{fmap}_{F^{\bullet,B}}(f^{:A\Rightarrow C})\bef\text{fmap}_{F^{C,\bullet}}(g^{:B\Rightarrow D})\quad.\label{eq:f-definition-of-bimap} +\text{bimap}_{F}(f^{:A\rightarrow C})(g^{:B\rightarrow D}) & :F^{A,B}\rightarrow F^{C,D}\quad,\nonumber \\ +\text{bimap}_{F}(f^{:A\rightarrow C})(g^{:B\rightarrow D}) & \triangleq\text{fmap}_{F^{\bullet,B}}(f^{:A\rightarrow C})\bef\text{fmap}_{F^{C,\bullet}}(g^{:B\rightarrow D})\quad.\label{eq:f-definition-of-bimap} \end{align} In the condensed notation, this is written as \[ -\text{bimap}_{F}(f^{:A\Rightarrow C})(g^{:B\Rightarrow D})\triangleq f^{\uparrow F^{\bullet,B}}\bef g^{\uparrow F^{C,\bullet}}\quad, +\text{bimap}_{F}(f^{:A\rightarrow C})(g^{:B\rightarrow D})\triangleq f^{\uparrow F^{\bullet,B}}\bef g^{\uparrow F^{C,\bullet}}\quad, \] but in this case the longer notation in Eq.~(\ref{eq:f-definition-of-bimap}) is easier to reason about. What if we apply the two \lstinline!fmap! functions in the opposite order? Since these functions work with different type parameters, -it is reasonable to expect that the transformation $F^{A,B}\Rightarrow F^{C,D}$ +it is reasonable to expect that the transformation $F^{A,B}\rightarrow F^{C,D}$ should be independent of the order of application: \begin{equation} -\text{fmap}_{F^{\bullet,B}}(f^{:A\Rightarrow C})\bef\text{fmap}_{F^{C,\bullet}}(g^{:B\Rightarrow D})=\text{fmap}_{F^{A,\bullet}}(g^{:B\Rightarrow D})\bef\text{fmap}_{F^{\bullet,D}}(f^{:A\Rightarrow C})\quad.\label{eq:f-fmap-fmap-bifunctor-commutativity} +\text{fmap}_{F^{\bullet,B}}(f^{:A\rightarrow C})\bef\text{fmap}_{F^{C,\bullet}}(g^{:B\rightarrow D})=\text{fmap}_{F^{A,\bullet}}(g^{:B\rightarrow D})\bef\text{fmap}_{F^{\bullet,D}}(f^{:A\rightarrow C})\quad.\label{eq:f-fmap-fmap-bifunctor-commutativity} \end{equation} This equation is illustrated by the type diagram below. \begin{wrapfigure}{l}{0.5\columnwidth}% \vspace{-1.5\baselineskip} \[ -\xymatrix{\xyScaleY{2.0pc}\xyScaleX{5.0pc} & F^{C,B}\ar[rd]\sp(0.6){\ ~~\text{fmap}_{F^{C,\bullet}}(g^{:B\Rightarrow D})}\\ -F^{A,B}\ar[ru]\sp(0.4){\text{fmap}_{F^{\bullet,B}}(f^{:A\Rightarrow C})~~~}\ar[rd]\sb(0.5){\text{fmap}_{F^{A,\bullet}}(g^{:B\Rightarrow D})~~\ }\ar[rr]\sb(0.5){\text{bimap}_{F}(f^{:A\Rightarrow C})(g^{:B\Rightarrow D})\ } & & F^{C,D}\\ - & F^{A,D}\ar[ru]\sb(0.6){~~~~\text{fmap}_{F^{\bullet,D}}(f^{:A\Rightarrow C})} +\xymatrix{\xyScaleY{2.0pc}\xyScaleX{5.0pc} & F^{C,B}\ar[rd]\sp(0.6){\ ~~\text{fmap}_{F^{C,\bullet}}(g^{:B\rightarrow D})}\\ +F^{A,B}\ar[ru]\sp(0.4){\text{fmap}_{F^{\bullet,B}}(f^{:A\rightarrow C})~~~}\ar[rd]\sb(0.5){\text{fmap}_{F^{A,\bullet}}(g^{:B\rightarrow D})~~\ }\ar[rr]\sb(0.5){\text{bimap}_{F}(f^{:A\rightarrow C})(g^{:B\rightarrow D})\ } & & F^{C,D}\\ + & F^{A,D}\ar[ru]\sb(0.6){~~~~\text{fmap}_{F^{\bullet,D}}(f^{:A\rightarrow C})} } \] @@ -2390,26 +2390,26 @@ \subsection{Bifunctors\label{subsec:Bifunctors}} Let us verify the commutativity law for the bifunctor $F^{A,B}\triangleq A\times A\times B$: \begin{align*} -{\color{greenunder}\text{left-hand side}:}\quad & \text{fmap}_{F^{\bullet,B}}(f^{:A\Rightarrow C})\bef\text{fmap}_{F^{C,\bullet}}(g^{:B\Rightarrow D})\\ -{\color{greenunder}\text{definitions of }\text{fmap}:}\quad & =(a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\Rightarrow f(a)\times b_{1}\times b_{2})\bef(c^{:C}\times b_{1}^{:B}\times b_{2}^{:B}\Rightarrow c\times g(b_{1})\times g(b_{2}))\\ -{\color{greenunder}\text{compute composition}:}\quad & =a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\Rightarrow f(a)\times g(b_{1})\times g(b_{2})\quad,\\ -{\color{greenunder}\text{right-hand side}:}\quad & \text{fmap}_{F^{A,\bullet}}(g^{:B\Rightarrow D})\bef\text{fmap}_{F^{\bullet,D}}(f^{:A\Rightarrow C})\\ -{\color{greenunder}\text{definitions of }\text{fmap}:}\quad & =(a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\Rightarrow a\times g(b_{1})\times g(b_{2}))\bef(a^{:A}\times d_{1}^{:D}\times d_{2}^{:D}\Rightarrow f(a)\times d_{1}\times d_{2})\\ -{\color{greenunder}\text{compute composition}:}\quad & =a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\Rightarrow f(a)\times g(b_{1})\times g(b_{2})\quad. +{\color{greenunder}\text{left-hand side}:}\quad & \text{fmap}_{F^{\bullet,B}}(f^{:A\rightarrow C})\bef\text{fmap}_{F^{C,\bullet}}(g^{:B\rightarrow D})\\ +{\color{greenunder}\text{definitions of }\text{fmap}:}\quad & =(a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\rightarrow f(a)\times b_{1}\times b_{2})\bef(c^{:C}\times b_{1}^{:B}\times b_{2}^{:B}\rightarrow c\times g(b_{1})\times g(b_{2}))\\ +{\color{greenunder}\text{compute composition}:}\quad & =a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\rightarrow f(a)\times g(b_{1})\times g(b_{2})\quad,\\ +{\color{greenunder}\text{right-hand side}:}\quad & \text{fmap}_{F^{A,\bullet}}(g^{:B\rightarrow D})\bef\text{fmap}_{F^{\bullet,D}}(f^{:A\rightarrow C})\\ +{\color{greenunder}\text{definitions of }\text{fmap}:}\quad & =(a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\rightarrow a\times g(b_{1})\times g(b_{2}))\bef(a^{:A}\times d_{1}^{:D}\times d_{2}^{:D}\rightarrow f(a)\times d_{1}\times d_{2})\\ +{\color{greenunder}\text{compute composition}:}\quad & =a^{:A}\times b_{1}^{:B}\times b_{2}^{:B}\rightarrow f(a)\times g(b_{1})\times g(b_{2})\quad. \end{align*} Both sides of the law are equal. The commutativity law~(\ref{eq:f-fmap-fmap-bifunctor-commutativity}) leads to the composition law for \lstinline!bimap!, \begin{equation} -\text{bimap}_{F}(f_{1}^{:A\Rightarrow C})(g_{1}^{:B\Rightarrow D})\bef\text{bimap}_{F}(f_{2}^{:C\Rightarrow E})(g_{2}^{:D\Rightarrow G})=\text{bimap}_{F}(f_{1}\bef f_{2})(g_{1}\bef g_{2})\quad.\label{eq:f-bimap-composition-law} +\text{bimap}_{F}(f_{1}^{:A\rightarrow C})(g_{1}^{:B\rightarrow D})\bef\text{bimap}_{F}(f_{2}^{:C\rightarrow E})(g_{2}^{:D\rightarrow G})=\text{bimap}_{F}(f_{1}\bef f_{2})(g_{1}\bef g_{2})\quad.\label{eq:f-bimap-composition-law} \end{equation} The following type diagram shows the relationships between various \lstinline!bimap! and \lstinline!fmap! functions: \[ -\xymatrix{\xyScaleY{3.0pc}\xyScaleX{12.0pc}F^{A,B}\ar[rd]\sp(0.6){~~~\text{bimap}_{F}(f_{1})(g_{1})}\ar[r]\sp(0.4){\text{fmap}_{F^{\bullet,B}}(f_{1}^{:A\Rightarrow C})}\ar[d]\sp(0.5){\text{fmap}_{F^{A,\bullet}}(g_{1}^{:B\Rightarrow D})} & F^{C,B}\ar[rd]\sp(0.6){~~~\text{bimap}_{F}(f_{2})(g_{1})}\ar[r]\sp(0.4){~\text{fmap}_{F^{\bullet,B}}(f_{2}^{:C\Rightarrow E})}\ar[d]\sp(0.5){\text{fmap}_{F^{C,\bullet}}(g_{1}^{:B\Rightarrow D})~~~} & F^{E,B}\ar[d]\sp(0.5){\text{fmap}_{F^{E,\bullet}}(g_{1}^{:B\Rightarrow D})}\\ -F^{A,D}\ar[rd]\sp(0.6){~~~\text{bimap}_{F}(f_{1})(g_{2})}\ar[r]\sp(0.4){\text{fmap}_{F^{\bullet,D}}(f_{1}^{:A\Rightarrow C})}\ar[d]\sp(0.5){\text{fmap}_{F^{A,\bullet}}(g_{2}^{:D\Rightarrow G})} & F^{C,D}\ar[rd]\sp(0.6){~~~\text{bimap}_{F}(f_{2})(g_{2})}\ar[r]\sp(0.4){~\text{fmap}_{F^{\bullet,D}}(f_{2}^{:C\Rightarrow E})}\ar[d]\sp(0.5){\text{fmap}_{F^{C,\bullet}}(g_{2}^{:D\Rightarrow G})~~~} & F^{E,D}\ar[d]\sp(0.5){\text{fmap}_{F^{E,\bullet}}(g_{2}^{:D\Rightarrow G})}\\ -F^{A,G}\ar[r]\sp(0.4){~\text{fmap}_{F^{\bullet,G}}(f_{1}^{:A\Rightarrow C})} & F^{C,G}\ar[r]\sp(0.4){~\text{fmap}_{F^{\bullet,G}}(f_{2}^{:C\Rightarrow E})} & F^{E,G} +\xymatrix{\xyScaleY{3.0pc}\xyScaleX{12.0pc}F^{A,B}\ar[rd]\sp(0.6){~~~\text{bimap}_{F}(f_{1})(g_{1})}\ar[r]\sp(0.4){\text{fmap}_{F^{\bullet,B}}(f_{1}^{:A\rightarrow C})}\ar[d]\sp(0.5){\text{fmap}_{F^{A,\bullet}}(g_{1}^{:B\rightarrow D})} & F^{C,B}\ar[rd]\sp(0.6){~~~\text{bimap}_{F}(f_{2})(g_{1})}\ar[r]\sp(0.4){~\text{fmap}_{F^{\bullet,B}}(f_{2}^{:C\rightarrow E})}\ar[d]\sp(0.5){\text{fmap}_{F^{C,\bullet}}(g_{1}^{:B\rightarrow D})~~~} & F^{E,B}\ar[d]\sp(0.5){\text{fmap}_{F^{E,\bullet}}(g_{1}^{:B\rightarrow D})}\\ +F^{A,D}\ar[rd]\sp(0.6){~~~\text{bimap}_{F}(f_{1})(g_{2})}\ar[r]\sp(0.4){\text{fmap}_{F^{\bullet,D}}(f_{1}^{:A\rightarrow C})}\ar[d]\sp(0.5){\text{fmap}_{F^{A,\bullet}}(g_{2}^{:D\rightarrow G})} & F^{C,D}\ar[rd]\sp(0.6){~~~\text{bimap}_{F}(f_{2})(g_{2})}\ar[r]\sp(0.4){~\text{fmap}_{F^{\bullet,D}}(f_{2}^{:C\rightarrow E})}\ar[d]\sp(0.5){\text{fmap}_{F^{C,\bullet}}(g_{2}^{:D\rightarrow G})~~~} & F^{E,D}\ar[d]\sp(0.5){\text{fmap}_{F^{E,\bullet}}(g_{2}^{:D\rightarrow G})}\\ +F^{A,G}\ar[r]\sp(0.4){~\text{fmap}_{F^{\bullet,G}}(f_{1}^{:A\rightarrow C})} & F^{C,G}\ar[r]\sp(0.4){~\text{fmap}_{F^{\bullet,G}}(f_{2}^{:C\rightarrow E})} & F^{E,G} } \] @@ -2426,20 +2426,20 @@ \subsection{Bifunctors\label{subsec:Bifunctors}} from the composition law~(\ref{eq:f-bimap-composition-law}). We write the composition law with specially chosen functions: \begin{equation} -\text{bimap}_{F}(f^{:A\Rightarrow C})(g^{:B\Rightarrow D})=\text{bimap}_{F}(\text{id}^{:A\Rightarrow A})(g^{:B\Rightarrow D})\bef\text{bimap}_{F}(f^{:A\Rightarrow C})(\text{id}^{:D\Rightarrow D})\quad.\label{eq:f-bimap-id-f-g-id} +\text{bimap}_{F}(f^{:A\rightarrow C})(g^{:B\rightarrow D})=\text{bimap}_{F}(\text{id}^{:A\rightarrow A})(g^{:B\rightarrow D})\bef\text{bimap}_{F}(f^{:A\rightarrow C})(\text{id}^{:D\rightarrow D})\quad.\label{eq:f-bimap-id-f-g-id} \end{equation} Using Eq.~(\ref{eq:f-definition-of-bimap}), we find \begin{align*} -{\color{greenunder}\text{expect }\text{fmap}_{F^{A,\bullet}}(g)\bef\text{fmap}_{F^{\bullet,D}}(f):}\quad & \text{fmap}_{F^{\bullet,B}}(f^{:A\Rightarrow C})\bef\text{fmap}_{F^{C,\bullet}}(g^{:B\Rightarrow D})\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:f-definition-of-bimap})}:}\quad & =\text{bimap}_{F}(f^{:A\Rightarrow C})(g^{:B\Rightarrow D})\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:f-bimap-id-f-g-id})}:}\quad & =\text{bimap}_{F}(\text{id}^{:A\Rightarrow A})(g^{:B\Rightarrow D})\bef\text{bimap}_{F}(f^{:A\Rightarrow C})(\text{id}^{:D\Rightarrow D})\\ +{\color{greenunder}\text{expect }\text{fmap}_{F^{A,\bullet}}(g)\bef\text{fmap}_{F^{\bullet,D}}(f):}\quad & \text{fmap}_{F^{\bullet,B}}(f^{:A\rightarrow C})\bef\text{fmap}_{F^{C,\bullet}}(g^{:B\rightarrow D})\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:f-definition-of-bimap})}:}\quad & =\text{bimap}_{F}(f^{:A\rightarrow C})(g^{:B\rightarrow D})\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:f-bimap-id-f-g-id})}:}\quad & =\text{bimap}_{F}(\text{id}^{:A\rightarrow A})(g^{:B\rightarrow D})\bef\text{bimap}_{F}(f^{:A\rightarrow C})(\text{id}^{:D\rightarrow D})\\ {\color{greenunder}\text{use Eq.~(\ref{eq:f-definition-of-bimap})}:}\quad & =\gunderline{\text{fmap}_{F^{\bullet,B}}(\text{id})}\bef\text{fmap}_{F^{A,\bullet}}(g)\bef\text{fmap}_{F^{\bullet,D}}(f)\bef\gunderline{\text{fmap}_{F^{C,\bullet}}(\text{id})}\\ {\color{greenunder}\text{identity laws for }F:}\quad & =\text{fmap}_{F^{A,\bullet}}(g)\bef\text{fmap}_{F^{\bullet,D}}(f)\quad. \end{align*} The identity law for \lstinline!bimap! holds as well, \begin{align*} -{\color{greenunder}\text{expect to equal }\text{id}:}\quad & \text{bimap}_{F}(\text{id}^{:A\Rightarrow A})(\text{id}^{:B\Rightarrow B})\\ +{\color{greenunder}\text{expect to equal }\text{id}:}\quad & \text{bimap}_{F}(\text{id}^{:A\rightarrow A})(\text{id}^{:B\rightarrow B})\\ {\color{greenunder}\text{use Eq.~(\ref{eq:f-definition-of-bimap})}:}\quad & =\gunderline{\text{fmap}_{F^{\bullet,B}}(\text{id})}\bef\gunderline{\text{fmap}_{F^{C,\bullet}}(\text{id})}\\ {\color{greenunder}\text{identity laws for }F:}\quad & =\text{id}\bef\text{id}=\text{id}\quad. \end{align*} @@ -2484,7 +2484,7 @@ \subsection{Type constructions for functors\label{subsec:f-Functor-constructions \hline {\footnotesize{}disjunctive type} & {\footnotesize{}$L^{A}\triangleq P^{A}+Q^{A}$} & {\footnotesize{}the functor co-product; $P$ and $Q$ must be functors}\tabularnewline \hline -{\footnotesize{}function type} & {\footnotesize{}$L^{A}\triangleq C^{A}\Rightarrow P^{A}$} & {\footnotesize{}the exponential functor; $P$ is a functor and $C$ +{\footnotesize{}function type} & {\footnotesize{}$L^{A}\triangleq C^{A}\rightarrow P^{A}$} & {\footnotesize{}the exponential functor; $P$ is a functor and $C$ a contrafunctor}\tabularnewline \hline {\footnotesize{}primitive type} & {\footnotesize{}$L^{A}\triangleq Z$} & {\footnotesize{}the constant functor; $Z$ is a fixed type}\tabularnewline @@ -2516,11 +2516,11 @@ \subsubsection{Statement \label{subsec:f-Statement-identity-functor}\ref{subsec: The \lstinline!fmap! function is defined by \begin{align*} - & \text{fmap}_{\text{Id}}:\left(A\Rightarrow B\right)\Rightarrow\text{Id}^{A}\Rightarrow\text{Id}^{B}\cong\left(A\Rightarrow B\right)\Rightarrow A\Rightarrow B\quad,\\ - & \text{fmap}_{\text{Id}}\triangleq(f^{:A\Rightarrow B}\Rightarrow f)=\text{id}^{:(A\Rightarrow B)\Rightarrow A\Rightarrow B}\quad. + & \text{fmap}_{\text{Id}}:\left(A\rightarrow B\right)\rightarrow\text{Id}^{A}\rightarrow\text{Id}^{B}\cong\left(A\rightarrow B\right)\rightarrow A\rightarrow B\quad,\\ + & \text{fmap}_{\text{Id}}\triangleq(f^{:A\rightarrow B}\rightarrow f)=\text{id}^{:(A\rightarrow B)\rightarrow A\rightarrow B}\quad. \end{align*} The identity function is the only fully parametric implementation -of the type signature $\left(A\Rightarrow B\right)\Rightarrow A\Rightarrow B$. +of the type signature $\left(A\rightarrow B\right)\rightarrow A\rightarrow B$. Since the code of \lstinline!fmap! is the identity function, the laws are satisfied automatically: \begin{align*} @@ -2539,11 +2539,11 @@ \subsubsection{Statement \label{subsec:f-Statement-constant-functor}\ref{subsec: The \lstinline!fmap! function is defined by \begin{align*} -\text{fmap}_{\text{Const}} & :\left(A\Rightarrow B\right)\Rightarrow\text{Const}^{Z,A}\Rightarrow\text{Const}^{Z,B}\cong\left(A\Rightarrow B\right)\Rightarrow Z\Rightarrow Z\quad,\\ -\text{fmap}_{\text{Const}}(f^{:A\Rightarrow B}) & \triangleq(z^{:Z}\Rightarrow z)=\text{id}^{:Z\Rightarrow Z}\quad. +\text{fmap}_{\text{Const}} & :\left(A\rightarrow B\right)\rightarrow\text{Const}^{Z,A}\rightarrow\text{Const}^{Z,B}\cong\left(A\rightarrow B\right)\rightarrow Z\rightarrow Z\quad,\\ +\text{fmap}_{\text{Const}}(f^{:A\rightarrow B}) & \triangleq(z^{:Z}\rightarrow z)=\text{id}^{:Z\rightarrow Z}\quad. \end{align*} It is a constant function that ignores $f$ and returns the identity -$\text{id}^{:Z\Rightarrow Z}$. The laws are satisfied: +$\text{id}^{:Z\rightarrow Z}$. The laws are satisfied: \begin{align*} {\color{greenunder}\text{identity law}:}\quad & \text{fmap}_{\text{Const}}(\text{id})=\text{id}\quad,\\ {\color{greenunder}\text{composition law}:}\quad & \text{\ensuremath{\text{fmap}_{\text{Const}}}}(f\bef g)=\text{id}=\text{fmap}_{\text{Const}}(f)\bef\text{fmap}_{\text{Const}}(g)=\text{id}\bef\text{id}\quad. @@ -2587,7 +2587,7 @@ \subsubsection{Statement \label{subsec:functor-Statement-functor-product}\ref{su \noindent The corresponding code notation is \[ -\negthickspace\negthickspace f^{\uparrow P}\triangleq l^{:L^{A}}\times m^{:M^{A}}\Rightarrow f^{\uparrow L}(l)\times f^{\uparrow M}(m)\quad. +\negthickspace\negthickspace f^{\uparrow P}\triangleq l^{:L^{A}}\times m^{:M^{A}}\rightarrow f^{\uparrow L}(l)\times f^{\uparrow M}(m)\quad. \] Writing this code using the pipe ($\triangleright$) operation makes it somewhat closer to the Scala syntax: @@ -2597,8 +2597,8 @@ \subsubsection{Statement \label{subsec:functor-Statement-functor-product}\ref{su An alternative notation uses the \index{function product}\textbf{function product} symbol $\boxtimes$ defined by \begin{align*} - & p^{:A\Rightarrow B}\boxtimes q^{:C\Rightarrow D}:A\times C\Rightarrow B\times D\quad,\\ - & p\boxtimes q\triangleq a\times c\Rightarrow p(a)\times q(c)\quad,\\ + & p^{:A\rightarrow B}\boxtimes q^{:C\rightarrow D}:A\times C\rightarrow B\times D\quad,\\ + & p\boxtimes q\triangleq a\times c\rightarrow p(a)\times q(c)\quad,\\ & (a\times c)\triangleright\left(p\boxtimes q\right)=\left(a\triangleright p\right)\times\left(b\triangleright q\right)\quad. \end{align*} In this notation, the lifting for $P$ is defined more concisely: @@ -2678,7 +2678,7 @@ \subsubsection{Statement \label{subsec:functor-Statement-functor-coproduct}\ref{ of $P^{\bullet}$ and $Q^{\bullet}$. The code notation for the \lstinline!fmap! function is \[ -\text{fmap}_{L}(f^{:A\Rightarrow B})=f^{\uparrow L}\triangleq\begin{array}{|c||cc|} +\text{fmap}_{L}(f^{:A\rightarrow B})=f^{\uparrow L}\triangleq\begin{array}{|c||cc|} & P^{B} & Q^{B}\\ \hline P^{A} & f^{\uparrow P} & \bbnum 0\\ Q^{A} & \bbnum 0 & f^{\uparrow Q} @@ -2751,12 +2751,12 @@ \subsubsection{Statement \label{subsec:functor-Statement-functor-coproduct}\ref{ \subsubsection{Statement \label{subsec:functor-Statement-functor-exponential}\ref{subsec:functor-Statement-functor-exponential}} -If $C$ is a contrafunctor and $P$ is a functor then $L^{A}\triangleq C^{A}\Rightarrow P^{A}$ +If $C$ is a contrafunctor and $P$ is a functor then $L^{A}\triangleq C^{A}\rightarrow P^{A}$ is a functor, called an \index{exponential functor}\textbf{exponential functor}, with \lstinline!fmap! defined by \begin{align} - & \text{fmap}_{L}^{A,B}(f^{:A\Rightarrow B}):(C^{A}\Rightarrow P^{A})\Rightarrow C^{B}\Rightarrow P^{B}\quad,\nonumber \\ - & \text{fmap}_{L}(f^{:A\Rightarrow B})=f^{\uparrow L}\triangleq h^{:C^{A}\Rightarrow P^{A}}\Rightarrow f^{\downarrow C}\bef h\bef f^{\uparrow P}\quad.\label{eq:f-functor-exponential-def-of-fmap} + & \text{fmap}_{L}^{A,B}(f^{:A\rightarrow B}):(C^{A}\rightarrow P^{A})\rightarrow C^{B}\rightarrow P^{B}\quad,\nonumber \\ + & \text{fmap}_{L}(f^{:A\rightarrow B})=f^{\uparrow L}\triangleq h^{:C^{A}\rightarrow P^{A}}\rightarrow f^{\downarrow C}\bef h\bef f^{\uparrow P}\quad.\label{eq:f-functor-exponential-def-of-fmap} \end{align} The corresponding Scala code is \begin{lstlisting} @@ -2766,8 +2766,8 @@ \subsubsection{Statement \label{subsec:functor-Statement-functor-exponential}\re \end{lstlisting} A type diagram for $\text{fmap}_{L}$ can be drawn as \[ -\xymatrix{\xyScaleY{1.5pc}\xyScaleX{2.5pc} & C^{A}\ar[r]\sp(0.5){h} & P^{A}\ar[rd]\sp(0.6){\ \text{fmap}_{P}(f^{:A\Rightarrow B})\ }\\ -C^{B}\ar[ru]\sp(0.4){\text{cmap}_{C}(f^{:A\Rightarrow B})\ ~~}\ar[rrr]\sb(0.5){\text{fmap}_{L}(f^{:A\Rightarrow B})(h^{:C^{A}\Rightarrow P^{A}})\ } & & & P^{B} +\xymatrix{\xyScaleY{1.5pc}\xyScaleX{2.5pc} & C^{A}\ar[r]\sp(0.5){h} & P^{A}\ar[rd]\sp(0.6){\ \text{fmap}_{P}(f^{:A\rightarrow B})\ }\\ +C^{B}\ar[ru]\sp(0.4){\text{cmap}_{C}(f^{:A\rightarrow B})\ ~~}\ar[rrr]\sb(0.5){\text{fmap}_{L}(f^{:A\rightarrow B})(h^{:C^{A}\rightarrow P^{A}})\ } & & & P^{B} } \] @@ -2804,25 +2804,25 @@ \subsubsection{Statement \label{subsec:functor-Statement-functor-exponential}\re functions $f$, $g$). Examples of functors obtained via the exponential\index{exponential functor} -functor construction are $L^{A}\triangleq Z\Rightarrow A$ (with the +functor construction are $L^{A}\triangleq Z\rightarrow A$ (with the contrafunctor $C^{A}$ chosen as the constant contrafunctor $Z$, -where $Z$ is a fixed type) and $L^{A}\triangleq\left(A\Rightarrow Z\right)\Rightarrow A$ -(with the contrafunctor $C^{A}\triangleq A\Rightarrow Z$). Statement~\ref{subsec:functor-Statement-functor-exponential} +where $Z$ is a fixed type) and $L^{A}\triangleq\left(A\rightarrow Z\right)\rightarrow A$ +(with the contrafunctor $C^{A}\triangleq A\rightarrow Z$). Statement~\ref{subsec:functor-Statement-functor-exponential} generalizes those examples to arbitrary contrafunctors $C^{A}$ used as arguments of function types. -In a similar way, one can prove that $P^{A}\Rightarrow C^{A}$ is +In a similar way, one can prove that $P^{A}\rightarrow C^{A}$ is a contrafunctor (Exercise~\ref{subsec:functor-Exercise-functor-laws}). Together with the results of Statements~\ref{subsec:functor-Statement-functor-product}\textendash \ref{subsec:functor-Statement-functor-exponential}, this establishes the rules of reasoning about covariance and contravariance of type parameters in arbitrary type expressions. Every function arrow flips the variance from covariant to contravariant and back. For instance, the identity functor $L^{A}\triangleq A$ is covariant in $A$, while -$A\Rightarrow Z$ is contravariant in $A$, and $\left(A\Rightarrow Z\right)\Rightarrow Z$ -is again covariant in $A$. As we have seen, $A\Rightarrow A\Rightarrow Z$ +$A\rightarrow Z$ is contravariant in $A$, and $\left(A\rightarrow Z\right)\rightarrow Z$ +is again covariant in $A$. As we have seen, $A\rightarrow A\rightarrow Z$ is contravariant in $A$, so any number of curried arrows count as -one in this consideration (and, in any case, $A\Rightarrow A\Rightarrow Z\cong A\times A\Rightarrow Z$). -Products and disjunctions do not change variance, so $\left(A\Rightarrow Z_{1}\right)\times\left(A\Rightarrow Z_{2}\right)+\left(A\Rightarrow Z_{3}\right)$ +one in this consideration (and, in any case, $A\rightarrow A\rightarrow Z\cong A\times A\rightarrow Z$). +Products and disjunctions do not change variance, so $\left(A\rightarrow Z_{1}\right)\times\left(A\rightarrow Z_{2}\right)+\left(A\rightarrow Z_{3}\right)$ is still contravariant in $A$. We will see more examples of such reasoning below (Section~\ref{subsec:Solved-examples:-How-to-recognize-functors}). @@ -2844,7 +2844,7 @@ \subsubsection{Statement \label{subsec:functor-Statement-functor-exponential}\re scala> p.map(_.map(x => x + 10)) res0: List[Option[Int]] = List(Some(11), None, Some(12), None, Some(13)) \end{lstlisting} -The code \lstinline!p.map(_.map(f))! lifts an $f^{:A\Rightarrow B}$ +The code \lstinline!p.map(_.map(f))! lifts an $f^{:A\rightarrow B}$ into a function of type \lstinline!List[Option[A]] => List[Option[B]]!. In this way, we may perform the \lstinline!.map! operation on the composite data type \lstinline!List[Option[_]]!. @@ -2865,7 +2865,7 @@ \subsubsection{Statement \label{subsec:functor-Statement-functor-composition-1}\ In the code notation, $\text{fmap}_{L}$ is written equivalently as \begin{align} - & \text{fmap}_{L}:f^{:A\Rightarrow B}\Rightarrow P^{Q^{A}}\Rightarrow P^{Q^{B}}\quad,\nonumber \\ + & \text{fmap}_{L}:f^{:A\rightarrow B}\rightarrow P^{Q^{A}}\rightarrow P^{Q^{B}}\quad,\nonumber \\ \text{fmap}_{L}(f)\triangleq\text{fmap}_{P}(\text{fmap}_{Q}(f))\quad,\quad\quad & \text{fmap}_{L}\triangleq\text{fmap}_{Q}\bef\text{fmap}_{P}\quad,\nonumber \\ {\color{greenunder}\text{in a shorter notation}:}\quad & f^{\uparrow L}\triangleq(f^{\uparrow Q})^{\uparrow P}\triangleq f^{\uparrow Q\uparrow P}\quad.\label{eq:def-functor-composition-fmap} \end{align} @@ -2978,7 +2978,7 @@ \subsubsection{Statement \label{subsec:functor-Statement-functor-recursive-1}\re The \lstinline!fmap! method for $L$ is a recursive function implemented as \begin{equation} -\text{fmap}_{L}(f^{:A\Rightarrow B})\triangleq\text{bimap}_{S}(f)(\text{fmap}_{L}(f))\quad.\label{eq:def-recursive-functor-fmap} +\text{fmap}_{L}(f^{:A\rightarrow B})\triangleq\text{bimap}_{S}(f)(\text{fmap}_{L}(f))\quad.\label{eq:def-recursive-functor-fmap} \end{equation} The corresponding Scala code is \begin{lstlisting} @@ -3079,7 +3079,7 @@ \subsection{Type constructions for contrafunctors\label{subsec:f-Contrafunctor-c {\footnotesize{}disjunctive type} & {\footnotesize{}$C^{A}\triangleq P^{A}+Q^{A}$} & {\footnotesize{}the co-product contrafunctor; $P$ and $Q$ must be contrafunctors}\tabularnewline \hline -{\footnotesize{}function type} & {\footnotesize{}$C^{A}\triangleq L^{A}\Rightarrow H^{A}$} & {\footnotesize{}the exponential contrafunctor; $L$ is a functor and +{\footnotesize{}function type} & {\footnotesize{}$C^{A}\triangleq L^{A}\rightarrow H^{A}$} & {\footnotesize{}the exponential contrafunctor; $L$ is a functor and $H$ a contrafunctor}\tabularnewline \hline {\footnotesize{}primitive type} & {\footnotesize{}$C^{A}\triangleq Z$} & {\footnotesize{}the constant contrafunctor; $Z$ is a fixed type}\tabularnewline @@ -3101,7 +3101,7 @@ \subsubsection{Statement \label{subsec:functor-Statement-contrafunctor-constant} If $Z$ is any fixed type, the constant type constructor $C^{A}\triangleq Z$ is a contrafunctor (the \textbf{constant contrafunctor}\index{constant contrafunctor}) -whose \lstinline!cmap! returns an identity function of type $Z\Rightarrow Z$: +whose \lstinline!cmap! returns an identity function of type $Z\rightarrow Z$: \begin{lstlisting} type Const[Z, A] = Z def cmap[Z, A, B](f: B => A): Const[Z, A] => Const[Z, B] = identity[Z] @@ -3132,7 +3132,7 @@ \subsubsection{Statement \label{subsec:functor-Statement-contrafunctor-compositi Convert the Scala implementation of \lstinline!cmap!$_{L}$ into the code notation: \[ -\text{cmap}_{L}(f^{:B\Rightarrow A})\triangleq\text{fmap}_{P}(\text{cmap}_{Q}(f))\quad. +\text{cmap}_{L}(f^{:B\rightarrow A})\triangleq\text{fmap}_{P}(\text{cmap}_{Q}(f))\quad. \] It is easier to reason about this function if we rewrite it as \[ @@ -3150,7 +3150,7 @@ \subsubsection{Statement \label{subsec:functor-Statement-contrafunctor-compositi (but still a functor in $R$). An example of such a type constructor is \begin{equation} -S^{A,R}\triangleq\left(A\Rightarrow\text{Int}\right)+R\times R\quad.\label{eq:f-example-contra-bifunctor} +S^{A,R}\triangleq\left(A\rightarrow\text{Int}\right)+R\times R\quad.\label{eq:f-example-contra-bifunctor} \end{equation} The type constructor $S^{\bullet,\bullet}$ is not a bifunctor because it is contravariant in its first type parameter; so we cannot define @@ -3160,8 +3160,8 @@ \subsubsection{Statement \label{subsec:functor-Statement-contrafunctor-compositi def xmap[A, B, Q, R](f: B => A)(g: Q => R): S[A, Q] => S[B, R] \end{lstlisting} \begin{align*} - & \text{xmap}_{S}:\left(B\Rightarrow A\right)\Rightarrow\left(Q\Rightarrow R\right)\Rightarrow S^{A,Q}\Rightarrow S^{B,R}\quad,\\ - & \text{xmap}_{S}(f^{:B\Rightarrow A})(g^{:Q\Rightarrow R})\triangleq\text{fmap}_{S^{A,\bullet}}(g)\bef\text{cmap}_{S^{\bullet,R}}(f)\quad. + & \text{xmap}_{S}:\left(B\rightarrow A\right)\rightarrow\left(Q\rightarrow R\right)\rightarrow S^{A,Q}\rightarrow S^{B,R}\quad,\\ + & \text{xmap}_{S}(f^{:B\rightarrow A})(g^{:Q\rightarrow R})\triangleq\text{fmap}_{S^{A,\bullet}}(g)\bef\text{cmap}_{S^{\bullet,R}}(f)\quad. \end{align*} The function \lstinline!xmap! obeys the laws of identity and composition: \begin{align} @@ -3179,10 +3179,10 @@ \subsubsection{Statement \label{subsec:functor-Statement-contrafunctor-compositi If we define a type constructor $L^{\bullet}$ using the recursive equation \[ -L^{A}\triangleq S^{A,L^{A}}\triangleq\left(A\Rightarrow\text{Int}\right)+L^{A}\times L^{A}\quad, +L^{A}\triangleq S^{A,L^{A}}\triangleq\left(A\rightarrow\text{Int}\right)+L^{A}\times L^{A}\quad, \] we obtain a contrafunctor in the shape of a binary tree whose leaves -are functions of type $A\Rightarrow\text{Int}$. The next statement +are functions of type $A\rightarrow\text{Int}$. The next statement shows that recursive type equations of this kind always define contrafunctors. \subsubsection{Statement \label{subsec:functor-Statement-contrafunctor-recursive-1}\ref{subsec:functor-Statement-contrafunctor-recursive-1}} @@ -3196,8 +3196,8 @@ \subsubsection{Statement \label{subsec:functor-Statement-contrafunctor-recursive Given the functions \lstinline!cmap!$_{S^{\bullet,R}}$ and \lstinline!fmap!$_{S^{A,\bullet}}$ for $S$, we implement \lstinline!cmap!$_{C}$ as \begin{align*} -\text{cmap}_{C}(f^{:B\Rightarrow A}) & :C^{A}\Rightarrow C^{B}\cong S^{A,C^{A}}\Rightarrow S^{B,C^{B}}\quad,\\ -\text{cmap}_{C}(f^{:B\Rightarrow A}) & \triangleq\text{xmap}_{S}(f)(\overline{\text{cmap}_{C}}(f))\quad. +\text{cmap}_{C}(f^{:B\rightarrow A}) & :C^{A}\rightarrow C^{B}\cong S^{A,C^{A}}\rightarrow S^{B,C^{B}}\quad,\\ +\text{cmap}_{C}(f^{:B\rightarrow A}) & \triangleq\text{xmap}_{S}(f)(\overline{\text{cmap}_{C}}(f))\quad. \end{align*} The corresponding Scala code can be written as \begin{lstlisting} @@ -3227,7 +3227,7 @@ \subsubsection{Statement \label{subsec:functor-Statement-contrafunctor-recursive \end{align*} To verify the composition law: \begin{align*} -{\color{greenunder}\text{expect to equal }(g^{\downarrow C}\bef f^{\downarrow C}):}\quad & (f^{:D\Rightarrow B}\bef g^{:B\Rightarrow A})^{\downarrow C}=\text{xmap}_{S}(f\bef g)(\gunderline{\overline{\text{cmap}_{C}}(f\bef g)})\\ +{\color{greenunder}\text{expect to equal }(g^{\downarrow C}\bef f^{\downarrow C}):}\quad & (f^{:D\rightarrow B}\bef g^{:B\rightarrow A})^{\downarrow C}=\text{xmap}_{S}(f\bef g)(\gunderline{\overline{\text{cmap}_{C}}(f\bef g)})\\ {\color{greenunder}\text{inductive assumption}:}\quad & =\text{xmap}_{S}(f\bef g)(\overline{\text{cmap}_{C}}(g)\bef\overline{\text{cmap}_{C}}(f)))\\ {\color{greenunder}\text{composition laws for }\text{xmap}_{S}:}\quad & =\text{xmap}_{S}(g)(\overline{\text{cmap}_{C}}(g))\bef\text{xmap}_{S}(f)(\overline{\text{cmap}_{C}}(f))\\ {\color{greenunder}\text{definition of }^{\downarrow C}:}\quad & =g^{\downarrow C}\bef f^{\downarrow C}\quad. @@ -3258,38 +3258,38 @@ \subsection{Solved examples: How to recognize functors and contrafunctors\label{ expression $A\times B+\left(A+\bbnum 1+B\right)\times A\times C$ is covariant in each of the type parameters $A$, $B$, $C$. \item Type parameters to the right of a function arrow are in a covariant -position. For example, $\text{Int}\Rightarrow A$ is covariant in +position. For example, $\text{Int}\rightarrow A$ is covariant in $A$. \item Each time a type parameter is placed to the left of an \emph{uncurried} -function arrow $\Rightarrow$, the variance is reversed: covariant +function arrow $\rightarrow$, the variance is reversed: covariant becomes contravariant and vice versa. For example, \begin{align*} {\color{greenunder}\text{this is covariant in }A:}\quad & \bbnum 1+A\times A\quad,\\ -{\color{greenunder}\text{this is contravariant in }A:}\quad & \left(\bbnum 1+A\times A\right)\Rightarrow\text{Int}\quad,\\ -{\color{greenunder}\text{this is covariant in }A:}\quad & \left(\left(\bbnum 1+A\times A\right)\Rightarrow\text{Int}\right)\Rightarrow\text{Int}\quad,\\ -{\color{greenunder}\text{this is contravariant in }A:}\quad & \left(\left(\left(\bbnum 1+A\times A\right)\Rightarrow\text{Int}\right)\Rightarrow\text{Int}\right)\Rightarrow\text{Int}\quad. +{\color{greenunder}\text{this is contravariant in }A:}\quad & \left(\bbnum 1+A\times A\right)\rightarrow\text{Int}\quad,\\ +{\color{greenunder}\text{this is covariant in }A:}\quad & \left(\left(\bbnum 1+A\times A\right)\rightarrow\text{Int}\right)\rightarrow\text{Int}\quad,\\ +{\color{greenunder}\text{this is contravariant in }A:}\quad & \left(\left(\left(\bbnum 1+A\times A\right)\rightarrow\text{Int}\right)\rightarrow\text{Int}\right)\rightarrow\text{Int}\quad. \end{align*} -\item Repeated curried function arrows work as one arrow: $A\Rightarrow\text{Int}$ -is contravariant in $A$, and $A\Rightarrow A\Rightarrow A\Rightarrow\text{Int}$ -is still contravariant in $A$. This is so because the type $A\Rightarrow A\Rightarrow A\Rightarrow\text{Int}$ -is equivalent to $A\times A\times A\Rightarrow\text{Int}$, which -is of the form $F^{A}\Rightarrow\text{Int}$ with a type constructor +\item Repeated curried function arrows work as one arrow: $A\rightarrow\text{Int}$ +is contravariant in $A$, and $A\rightarrow A\rightarrow A\rightarrow\text{Int}$ +is still contravariant in $A$. This is so because the type $A\rightarrow A\rightarrow A\rightarrow\text{Int}$ +is equivalent to $A\times A\times A\rightarrow\text{Int}$, which +is of the form $F^{A}\rightarrow\text{Int}$ with a type constructor $F^{A}\triangleq A\times A\times A$. Exercise~\ref{subsec:functor-Exercise-contrafunctor-exponential} -will show that $F^{A}\Rightarrow\text{Int}$ is contravariant in $A$. +will show that $F^{A}\rightarrow\text{Int}$ is contravariant in $A$. \item Nested type constructors combine their variances: e.g.~if we know -that $F^{A}$ is contravariant in $A$ then $F^{A\Rightarrow\text{Int}}$ +that $F^{A}$ is contravariant in $A$ then $F^{A\rightarrow\text{Int}}$ is covariant in $A$, while $F^{A\times A\times A}$ is contravariant in $A$. \end{itemize} For any exponential-polynomial type expression, such as Eq.~(\ref{eq:f-example-complicated-z}), \[ -Z^{A,R}\triangleq\left(\left(A\Rightarrow A\Rightarrow R\right)\Rightarrow R\right)\times A+\left(\bbnum 1+R\Rightarrow A+\text{Int}\right)+A\times A\times\text{Int}\times\text{Int}\quad, +Z^{A,R}\triangleq\left(\left(A\rightarrow A\rightarrow R\right)\rightarrow R\right)\times A+\left(\bbnum 1+R\rightarrow A+\text{Int}\right)+A\times A\times\text{Int}\times\text{Int}\quad, \] we can mark the position of each type parameter as either covariant ($+$) or contravariant ($-$), according to the number of nested function arrows: \[ -\big(\big(\underset{+}{A}\Rightarrow\underset{+}{A}\Rightarrow\underset{-}{R}\big)\Rightarrow\underset{+}{R}\big)\times\underset{+}{A}+\big(\bbnum 1+\underset{-}{R}\Rightarrow\underset{+}{A}+\text{Int}\big)+\underset{+}{A}\times\underset{+}{A}\times\text{Int}\times\text{Int}\quad. +\big(\big(\underset{+}{A}\rightarrow\underset{+}{A}\rightarrow\underset{-}{R}\big)\rightarrow\underset{+}{R}\big)\times\underset{+}{A}+\big(\bbnum 1+\underset{-}{R}\rightarrow\underset{+}{A}+\text{Int}\big)+\underset{+}{A}\times\underset{+}{A}\times\text{Int}\times\text{Int}\quad. \] We find that $A$ is always in covariant positions, while $R$ is sometimes in covariant and sometimes in contravariant positions. So, @@ -3302,7 +3302,7 @@ \subsection{Solved examples: How to recognize functors and contrafunctors\label{ the techniques explained in this and the previous chapters: starting from the type signature \[ -\text{map}_{Z}:Z^{A,R}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow Z^{B,R}\quad, +\text{map}_{Z}:Z^{A,R}\rightarrow\left(A\rightarrow B\right)\rightarrow Z^{B,R}\quad, \] we could derive a fully parametric, information-preserving implementation of \lstinline!map!. We could then look for equational proofs of the @@ -3332,13 +3332,13 @@ \subsubsection{Example \label{subsec:f-Example-recognize-type-variance-1}\ref{su The type notation is \[ -G^{A,Z}\triangleq(\text{Int}+A)\times(\bbnum 1+(Z\Rightarrow\text{Int}\Rightarrow Z\Rightarrow\text{Int}\times A))\quad. +G^{A,Z}\triangleq(\text{Int}+A)\times(\bbnum 1+(Z\rightarrow\text{Int}\rightarrow Z\rightarrow\text{Int}\times A))\quad. \] Mark the covariant and the contravariant positions in this type expression: \[ -(\text{Int}+\underset{+}{A})\times(\bbnum 1+(\underset{-}{Z}\Rightarrow\text{Int}\Rightarrow\underset{-}{Z}\Rightarrow\text{Int}\times\underset{+}{A}))\quad. +(\text{Int}+\underset{+}{A})\times(\bbnum 1+(\underset{-}{Z}\rightarrow\text{Int}\rightarrow\underset{-}{Z}\rightarrow\text{Int}\times\underset{+}{A}))\quad. \] -All $Z$ positions in the sub-expression $Z\Rightarrow\text{Int}\Rightarrow Z\Rightarrow\text{Int}\times A$ +All $Z$ positions in the sub-expression $Z\rightarrow\text{Int}\rightarrow Z\rightarrow\text{Int}\times A$ are contravariant since the function arrows are curried rather than nested. We see that $A$ is always in covariant positions ($+$) while $Z$ is always in contravariant positions ($-$). It follows that @@ -3358,7 +3358,7 @@ \subsubsection{Example \label{subsec:f-Example-recognize-type-variance-1-1}\ref{ the ``product functor'' construction (Statement~\ref{subsec:functor-Statement-functor-product}), \begin{align*} & G^{A,Z}\cong G_{1}^{A}\times G_{2}^{A,Z}\quad,\\ -\text{where } & G_{1}^{A}\triangleq\text{Int}+A\quad\text{ and }\quad G_{2}^{A,Z}\triangleq\bbnum 1+(Z\Rightarrow\text{Int}\Rightarrow Z\Rightarrow\text{Int}\times A)\quad. +\text{where } & G_{1}^{A}\triangleq\text{Int}+A\quad\text{ and }\quad G_{2}^{A,Z}\triangleq\bbnum 1+(Z\rightarrow\text{Int}\rightarrow Z\rightarrow\text{Int}\times A)\quad. \end{align*} We continue with $G_{1}^{A}$, which is a co-product of $\text{Int}$ (a constant functor) and $A$ (the identity functor). The constant @@ -3368,7 +3368,7 @@ \subsubsection{Example \label{subsec:f-Example-recognize-type-variance-1-1}\ref{ produces a \lstinline!map! implementation for $G_{1}^{A}$ together with a proof that it satisfies the functor laws: \[ -\text{fmap}_{G_{1}}(f^{:A\Rightarrow B})=f^{\uparrow G_{1}}\triangleq\begin{array}{|c||cc|} +\text{fmap}_{G_{1}}(f^{:A\rightarrow B})=f^{\uparrow G_{1}}\triangleq\begin{array}{|c||cc|} & \text{Int} & B\\ \hline \text{Int} & \text{id} & \bbnum 0\\ A & \bbnum 0 & f @@ -3381,11 +3381,11 @@ \subsubsection{Example \label{subsec:f-Example-recognize-type-variance-1-1}\ref{ constructions. Write down the functor constructions needed at each step as we decompose $G_{2}^{A,Z}$: \begin{align*} - & G_{2}^{A,Z}\triangleq\bbnum 1+(Z\Rightarrow\text{Int}\Rightarrow Z\Rightarrow\text{Int}\times A)\quad.\\ -{\color{greenunder}\text{co-product functor}:}\quad & G_{2}^{A,Z}\cong\bbnum 1+G_{3}^{A,Z}\quad\text{ where }G_{3}^{A,Z}\triangleq Z\Rightarrow\text{Int}\Rightarrow Z\Rightarrow\text{Int}\times A\quad.\\ -{\color{greenunder}\text{exponential functor}:}\quad & G_{3}^{A,Z}\cong Z\Rightarrow G_{4}^{A,Z}\quad\text{ where }G_{4}^{A,Z}\triangleq\text{Int}\Rightarrow Z\Rightarrow\text{Int}\times A\quad.\\ -{\color{greenunder}\text{exponential functor}:}\quad & G_{4}^{A,Z}\cong\text{Int}\Rightarrow G_{5}^{A,Z}\quad\text{ where }G_{5}^{A,Z}\triangleq Z\Rightarrow\text{Int}\times A\quad.\\ -{\color{greenunder}\text{exponential functor}:}\quad & G_{5}^{A,Z}\cong Z\Rightarrow G_{6}^{A}\quad\text{ where }G_{6}^{A}\triangleq\text{Int}\times A\quad.\\ + & G_{2}^{A,Z}\triangleq\bbnum 1+(Z\rightarrow\text{Int}\rightarrow Z\rightarrow\text{Int}\times A)\quad.\\ +{\color{greenunder}\text{co-product functor}:}\quad & G_{2}^{A,Z}\cong\bbnum 1+G_{3}^{A,Z}\quad\text{ where }G_{3}^{A,Z}\triangleq Z\rightarrow\text{Int}\rightarrow Z\rightarrow\text{Int}\times A\quad.\\ +{\color{greenunder}\text{exponential functor}:}\quad & G_{3}^{A,Z}\cong Z\rightarrow G_{4}^{A,Z}\quad\text{ where }G_{4}^{A,Z}\triangleq\text{Int}\rightarrow Z\rightarrow\text{Int}\times A\quad.\\ +{\color{greenunder}\text{exponential functor}:}\quad & G_{4}^{A,Z}\cong\text{Int}\rightarrow G_{5}^{A,Z}\quad\text{ where }G_{5}^{A,Z}\triangleq Z\rightarrow\text{Int}\times A\quad.\\ +{\color{greenunder}\text{exponential functor}:}\quad & G_{5}^{A,Z}\cong Z\rightarrow G_{6}^{A}\quad\text{ where }G_{6}^{A}\triangleq\text{Int}\times A\quad.\\ {\color{greenunder}\text{product functor}:}\quad & G_{6}^{A}\cong\text{Int}\times A\cong\text{Const}^{\text{Int},A}\times\text{Id}^{A}\quad. \end{align*} Each of the type constructors $G_{1}$, ..., $G_{6}$ is a functor @@ -3409,12 +3409,12 @@ \subsubsection{Example \label{subsec:f-Example-recognize-type-variance-1-1}\ref{ \text{id} & \bbnum 0\\ \bbnum 0 & f^{\uparrow G_{3}} \end{array}\quad.\\ -{\color{greenunder}\text{exponential functor}:}\quad & G_{3}^{A,Z}\triangleq Z\Rightarrow G_{4}^{A,Z}\quad,\quad\quad g_{3}\triangleright f^{\uparrow G_{3}}=g_{3}\bef f^{\uparrow G_{4}}=(z^{:Z}\Rightarrow g_{3}(z)\triangleright f^{\uparrow G_{4}})\quad. +{\color{greenunder}\text{exponential functor}:}\quad & G_{3}^{A,Z}\triangleq Z\rightarrow G_{4}^{A,Z}\quad,\quad\quad g_{3}\triangleright f^{\uparrow G_{3}}=g_{3}\bef f^{\uparrow G_{4}}=(z^{:Z}\rightarrow g_{3}(z)\triangleright f^{\uparrow G_{4}})\quad. \end{align*} Applying the exponential functor construction three times, we finally obtain \begin{align*} - & G_{3}^{A,Z}\triangleq Z\Rightarrow\text{Int}\Rightarrow Z\Rightarrow G_{6}^{A}\quad,\quad\quad g_{3}\triangleright f^{\uparrow G_{3}}=z_{1}^{:Z}\Rightarrow n^{:\text{Int}}\Rightarrow z_{2}^{:Z}\Rightarrow g_{3}(z_{1})(n)(z_{2})\triangleright f^{\uparrow G_{6}}\quad.\\ + & G_{3}^{A,Z}\triangleq Z\rightarrow\text{Int}\rightarrow Z\rightarrow G_{6}^{A}\quad,\quad\quad g_{3}\triangleright f^{\uparrow G_{3}}=z_{1}^{:Z}\rightarrow n^{:\text{Int}}\rightarrow z_{2}^{:Z}\rightarrow g_{3}(z_{1})(n)(z_{2})\triangleright f^{\uparrow G_{6}}\quad.\\ & G_{6}^{A}\triangleq\text{Int}\times A\quad,\quad\quad(i\times a)\triangleright f^{\uparrow G_{6}}=i\times f(a)\quad. \end{align*} We can now write the corresponding Scala code for \lstinline!fmap!$_{G}$: @@ -3451,7 +3451,7 @@ \subsection{Exercises: Functor and contrafunctor constructions \index{exercises} \subsubsection{Exercise \label{subsec:functor-Exercise-contrafunctor-exponential}\ref{subsec:functor-Exercise-contrafunctor-exponential}} If $H^{A}$ is a contrafunctor and $L^{A}$ is a functor, show that -$C\triangleq L^{A}\Rightarrow H^{A}$ is a contrafunctor with the +$C\triangleq L^{A}\rightarrow H^{A}$ is a contrafunctor with the \lstinline!cmap! method defined by the following code: \begin{lstlisting} def cmap[A, B](f: B => A)(c: L[A] => H[A]): L[B] => H[B] = { @@ -3488,7 +3488,7 @@ \subsubsection{Exercise \label{subsec:f-Exercise-recursive-functor-2}\ref{subsec \subsubsection{Exercise \label{subsec:functor-Exercise-functor-constructions-0}\ref{subsec:functor-Exercise-functor-constructions-0}} -Show that $L^{A}\triangleq F^{A}\Rightarrow G^{A}$ is, in general, +Show that $L^{A}\triangleq F^{A}\rightarrow G^{A}$ is, in general, neither a functor nor a contrafunctor when both $F^{A}$ and $G^{A}$ are functors or both are contrafunctors (an example of suitable $F^{A}$ and $G^{A}$ is sufficient). @@ -3512,13 +3512,13 @@ \subsubsection{Exercise \label{subsec:functor-Exercise-functor-constructions-2}\ or \lstinline!cmap! if appropriate. Answer this question with respect to each type parameter separately. -\textbf{(a)} $F^{A}\triangleq\text{Int}\times A\times A+(\text{String}\Rightarrow A)\times A\quad.$ +\textbf{(a)} $F^{A}\triangleq\text{Int}\times A\times A+(\text{String}\rightarrow A)\times A\quad.$ -\textbf{(b)} $G^{A,B}\triangleq\left(A\Rightarrow\text{Int}\Rightarrow\bbnum 1+B\right)+\left(A\Rightarrow\bbnum 1+A\Rightarrow\text{Int}\right)\quad.$ +\textbf{(b)} $G^{A,B}\triangleq\left(A\rightarrow\text{Int}\rightarrow\bbnum 1+B\right)+\left(A\rightarrow\bbnum 1+A\rightarrow\text{Int}\right)\quad.$ -\textbf{(c)} $H^{A,B,C}\triangleq\left(A\Rightarrow A\Rightarrow B\Rightarrow C\right)\times C+\left(B\Rightarrow A\right)\quad.$ +\textbf{(c)} $H^{A,B,C}\triangleq\left(A\rightarrow A\rightarrow B\rightarrow C\right)\times C+\left(B\rightarrow A\right)\quad.$ -\textbf{(d)} $P^{A,B}\triangleq\left(\left(\left(A\Rightarrow B\right)\Rightarrow A\right)\Rightarrow B\right)\Rightarrow A\quad.$ +\textbf{(d)} $P^{A,B}\triangleq\left(\left(\left(A\rightarrow B\right)\rightarrow A\right)\rightarrow B\right)\rightarrow A\quad.$ \subsubsection{Exercise \label{subsec:functor-Exercise-functor-constructions-3}\ref{subsec:functor-Exercise-functor-constructions-3}} @@ -3538,19 +3538,19 @@ \subsection{Profunctors\index{profunctors}\label{subsec:f-Profunctors}} and contravariant positions. An example of such a type constructor is \[ -P^{A}\triangleq A+\left(A\Rightarrow\text{Int}\right)\quad. +P^{A}\triangleq A+\left(A\rightarrow\text{Int}\right)\quad. \] It is not possible to define either a \lstinline!map! or a \lstinline!cmap! function for $P$: the required type signatures cannot be implemented. However, we \emph{can} implement a function called \lstinline!xmap!, with the type signature \[ -\text{xmap}_{P}:\left(B\Rightarrow A\right)\Rightarrow\left(A\Rightarrow B\right)\Rightarrow P^{A}\Rightarrow P^{B}\quad. +\text{xmap}_{P}:\left(B\rightarrow A\right)\rightarrow\left(A\rightarrow B\right)\rightarrow P^{A}\rightarrow P^{B}\quad. \] To see why, let us temporarily rename the contravariant occurrence of $A$ to $Z$ and define a new type constructor $\tilde{P}$ by \[ -\tilde{P}^{Z,A}\triangleq A+\left(Z\Rightarrow\text{Int}\right)\quad. +\tilde{P}^{Z,A}\triangleq A+\left(Z\rightarrow\text{Int}\right)\quad. \] The original type constructor $P^{A}$ is expressed as $P^{A}=\tilde{P}^{A,A}$. Now, $\tilde{P}^{Z,A}$ is covariant in $A$ and contravariant in @@ -3564,8 +3564,8 @@ \subsection{Profunctors\index{profunctors}\label{subsec:f-Profunctors}} will hold, since the laws of $\tilde{P}^{Z,A}$ hold for all type parameters: \begin{align*} -{\color{greenunder}P\text{'s identity law}:}\quad & \text{xmap}_{P}(\text{id}^{:A\Rightarrow A})(\text{id}^{:A\Rightarrow A})=\text{id}\quad,\\ -{\color{greenunder}P\text{'s composition law}:}\quad & \text{xmap}_{P}(f_{1}^{:B\Rightarrow A})(g_{1}^{:A\Rightarrow B})\bef\text{xmap}_{P}(f_{2}^{:C\Rightarrow B})(g_{2}^{:B\Rightarrow C})=\text{xmap}_{P}(f_{2}\bef f_{1})(g_{1}\bef g_{2})\quad. +{\color{greenunder}P\text{'s identity law}:}\quad & \text{xmap}_{P}(\text{id}^{:A\rightarrow A})(\text{id}^{:A\rightarrow A})=\text{id}\quad,\\ +{\color{greenunder}P\text{'s composition law}:}\quad & \text{xmap}_{P}(f_{1}^{:B\rightarrow A})(g_{1}^{:A\rightarrow B})\bef\text{xmap}_{P}(f_{2}^{:C\rightarrow B})(g_{2}^{:B\rightarrow C})=\text{xmap}_{P}(f_{2}\bef f_{1})(g_{1}\bef g_{2})\quad. \end{align*} A type constructor $P^{A}$ with these properties ($P^{A}\cong\tilde{P}^{A,A}$ @@ -3576,7 +3576,7 @@ \subsection{Profunctors\index{profunctors}\label{subsec:f-Profunctors}} Consider an exponential-polynomial type constructor $P^{A}$, no matter how complicated, such as \[ -P^{A}\triangleq\left(\bbnum 1+A\times A\Rightarrow A\right)\times A\Rightarrow\bbnum 1+\left(A\Rightarrow A+\text{Int}\right)\quad. +P^{A}\triangleq\left(\bbnum 1+A\times A\rightarrow A\right)\times A\rightarrow\bbnum 1+\left(A\rightarrow A+\text{Int}\right)\quad. \] Each copy of a type parameter will occur either in covariant or in a contravariant position because no other possibility is available @@ -3603,35 +3603,35 @@ \subsection{Subtyping with injective or surjective conversion functions} In some cases, $P$ is a subtype of $Q$ when the set of values of $P$ is a \emph{subset} of values of $Q$. In other words, the conversion -function $P\Rightarrow Q$ is injective and embeds all information +function $P\rightarrow Q$ is injective and embeds all information from a value of type $P$ into a value of type $Q$. This kind of subtyping works for parts of disjunctive types, such as \lstinline!Some[A] <: Option[A]! (in the type notation, $\bbnum 0+A<:\bbnum 1+A$). The set of all values of type \lstinline!Some[A]! is a subset of the set of values of type \lstinline!Option[A]!, and the conversion function is injective -because it is an identity function, $\bbnum 0+x^{:A}\Rightarrow\bbnum 0+x$, +because it is an identity function, $\bbnum 0+x^{:A}\rightarrow\bbnum 0+x$, that merely reassigns types. However, subtyping does not necessarily imply that the conversion function is injective. An example of a subtyping relation with a \emph{surjective} -conversion function is between the function types $P\triangleq\bbnum 1+A\Rightarrow\text{Int}$ -and $Q\triangleq\bbnum 0+A\Rightarrow\text{Int}$ (in Scala, \lstinline!P = Option[A] => Int! +conversion function is between the function types $P\triangleq\bbnum 1+A\rightarrow\text{Int}$ +and $Q\triangleq\bbnum 0+A\rightarrow\text{Int}$ (in Scala, \lstinline!P = Option[A] => Int! and \lstinline!Q = Some[A] => Int!). We have \lstinline!P <: Q! because $P\cong C^{\bbnum 1+A}$ and $Q\cong C^{\bbnum 0+A}$, where -$C^{X}\triangleq X\Rightarrow\text{Int}$ is a contrafunctor. The -conversion function $P\Rightarrow Q$ is an identity function that +$C^{X}\triangleq X\rightarrow\text{Int}$ is a contrafunctor. The +conversion function $P\rightarrow Q$ is an identity function that reassigns types, \begin{lstlisting} def p2q[A](p: Option[A] => Int): Some[A] => Int = { x: Some[A] => p(x) } \end{lstlisting} -In the code notation, $p\Rightarrow x\Rightarrow p(x)$ is easily -seen to be the same as $p\Rightarrow p$. +In the code notation, $p\rightarrow x\rightarrow p(x)$ is easily +seen to be the same as $p\rightarrow p$. Nevertheless, it is not true that all information from a value of type $P$ is preserved in a value of type $Q$: the type $P$ describes functions that also accept \lstinline!None! as an argument, while functions of type $Q$ do not. So, there is strictly more information -in the type $P$ than in $Q$. The conversion function $\text{p2q}:P\Rightarrow Q$ +in the type $P$ than in $Q$. The conversion function $\text{p2q}:P\rightarrow Q$ is surjective. We have now seen examples of either injective or surjective type conversions. @@ -3639,35 +3639,35 @@ \subsection{Subtyping with injective or surjective conversion functions} types $P_{1}\times P_{2}$ and $Q_{1}\times Q_{2}$. Since the product type is one of the functor constructions, the product $A\times B$ is covariant in both type parameters. It follows that $P_{1}\times P_{2}<:Q_{1}\times Q_{2}$. -If $r_{1}:P_{1}\Rightarrow Q_{1}$ is injective but $r_{2}:P_{2}\Rightarrow Q_{2}$ -is surjective, the function product $r_{1}\boxtimes r_{2}:P_{1}\times Q_{1}\Rightarrow P_{2}\times Q_{2}$ +If $r_{1}:P_{1}\rightarrow Q_{1}$ is injective but $r_{2}:P_{2}\rightarrow Q_{2}$ +is surjective, the function product $r_{1}\boxtimes r_{2}:P_{1}\times Q_{1}\rightarrow P_{2}\times Q_{2}$ is neither injective nor surjective. So, type conversion functions are not necessarily injective or surjective; they can also be anything ``in between''. An important property of functor liftings is that they preserve injectivity -and surjectivity: if a function $f^{:A\Rightarrow B}$ is injective, -it is lifted to an injective function $f^{\uparrow L}:L^{A}\Rightarrow L^{B}$; +and surjectivity: if a function $f^{:A\rightarrow B}$ is injective, +it is lifted to an injective function $f^{\uparrow L}:L^{A}\rightarrow L^{B}$; and similarly for surjective functions $f$. Let us prove this property for injective functions; the proof for surjective functions is quite similar. \subsubsection{Statement \label{subsec:f-Statement-functor-preserves-injective}\ref{subsec:f-Statement-functor-preserves-injective}} -If $L^{A}$ is a lawful functor and $f^{:A\Rightarrow B}$ is an injective +If $L^{A}$ is a lawful functor and $f^{:A\rightarrow B}$ is an injective function then $\text{fmap}_{L}(f)$ is also an injective function -of type $L^{A}\Rightarrow L^{B}$. +of type $L^{A}\rightarrow L^{B}$. \subparagraph{Proof} -We begin by noting that an injective function $f^{:A\Rightarrow B}$ +We begin by noting that an injective function $f^{:A\rightarrow B}$ must somehow embed all information from a value of type $A$ into a value of type $B$. The \textbf{image} of $f$ (the subset of all values of type $B$ that can be obtained as $f(a)$ for some $a^{:A}$) thus contains a distinct value of type $B$ for each distinct value of type $A$. So, there exists a function that maps any $b$ from the image of $f$ back to a value $a^{:A}$ it came from; call that -function $g^{:B\Rightarrow A}$. The function $g$ must satisfy +function $g^{:B\rightarrow A}$. The function $g$ must satisfy \[ \forall a^{:A}.\,g(f(a))=a\quad; \] diff --git a/sofp-src/sofp-higher-order-functions.lyx b/sofp-src/sofp-higher-order-functions.lyx index a68f519d7..6854e2ce1 100644 --- a/sofp-src/sofp-higher-order-functions.lyx +++ b/sofp-src/sofp-higher-order-functions.lyx @@ -109,9 +109,6 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} @@ -4292,7 +4289,7 @@ before ) and can be defined as \begin_inset Formula \begin{equation} -f\bef g\triangleq\left(x\Rightarrow g(f(x))\right)\quad.\label{eq:def-of-forward-composition} +f\bef g\triangleq\left(x\rightarrow g(f(x))\right)\quad.\label{eq:def-of-forward-composition} \end{equation} \end_inset @@ -4401,7 +4398,7 @@ after ) for this operation, we can write \begin_inset Formula \begin{equation} -f\circ g\triangleq\left(x\Rightarrow f(g(x))\right)\quad.\label{eq:def-of-backward-composition} +f\circ g\triangleq\left(x\rightarrow f(g(x))\right)\quad.\label{eq:def-of-backward-composition} \end{equation} \end_inset @@ -4736,7 +4733,7 @@ The laws must hold for an arbitrary function \end_inset has the type signature -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset , where @@ -4786,7 +4783,7 @@ noprefix "false" to the result: \begin_inset Formula \[ -\text{id}\bef f=\left(x\Rightarrow f(\text{id}(x))\right)\quad. +\text{id}\bef f=\left(x\rightarrow f(\text{id}(x))\right)\quad. \] \end_inset @@ -4796,7 +4793,7 @@ If \end_inset has type -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset , its argument must be of type @@ -4805,7 +4802,7 @@ If , or else the types will not match. Therefore, the identity function must have type -\begin_inset Formula $A\Rightarrow A$ +\begin_inset Formula $A\rightarrow A$ \end_inset , and the argument @@ -4818,11 +4815,11 @@ If . With these choices of the type parameters, the function -\begin_inset Formula $\left(x\Rightarrow f(\text{id}(x))\right)$ +\begin_inset Formula $\left(x\rightarrow f(\text{id}(x))\right)$ \end_inset will have type -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset , as it must since the right-hand side of the law is @@ -4837,7 +4834,7 @@ superscripts , \begin_inset Formula \[ -\text{id}^{A}\bef f^{:A\Rightarrow B}=\big(x^{:A}\Rightarrow f(\text{id}(x))\big)^{:A\Rightarrow B}\quad. +\text{id}^{A}\bef f^{:A\rightarrow B}=\big(x^{:A}\rightarrow f(\text{id}(x))\big)^{:A\rightarrow B}\quad. \] \end_inset @@ -4929,7 +4926,7 @@ A => A \end_inset or equivalently (but more verbosely) -\begin_inset Formula $\text{id}^{:A\Rightarrow A}$ +\begin_inset Formula $\text{id}^{:A\rightarrow A}$ \end_inset to denote that function. @@ -4943,13 +4940,13 @@ By definition of the identity function, we have , and so \begin_inset Formula \[ -\text{id}\bef f=\left(x\Rightarrow f(\text{id}(x))\right)=\left(x\Rightarrow f(x)\right)=f\quad. +\text{id}\bef f=\left(x\rightarrow f(\text{id}(x))\right)=\left(x\rightarrow f(x)\right)=f\quad. \] \end_inset The last step works since -\begin_inset Formula $x\Rightarrow f(x)$ +\begin_inset Formula $x\rightarrow f(x)$ \end_inset is a function taking an argument @@ -4965,7 +4962,7 @@ The last step works since \end_inset -\begin_inset Formula $x\Rightarrow f(x)$ +\begin_inset Formula $x\rightarrow f(x)$ \end_inset is the same function as @@ -4979,13 +4976,13 @@ The last step works since Now consider the right identity law: \begin_inset Formula \[ -f\bef\text{id}=\left(x\Rightarrow\text{id}(f(x))\right)\quad. +f\bef\text{id}=\left(x\rightarrow\text{id}(f(x))\right)\quad. \] \end_inset To make the types match, assume that -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset . @@ -4998,7 +4995,7 @@ To make the types match, assume that \end_inset , and the identity function must have type -\begin_inset Formula $B\Rightarrow B$ +\begin_inset Formula $B\rightarrow B$ \end_inset . @@ -5014,7 +5011,7 @@ To make the types match, assume that With these choices of type parameters, all types match: \begin_inset Formula \[ -f^{:A\Rightarrow B}\bef\text{id}^{B}=\big(x^{:A}\Rightarrow\text{id}(f(x))\big)^{:A\Rightarrow B}\quad. +f^{:A\rightarrow B}\bef\text{id}^{B}=\big(x^{:A}\rightarrow\text{id}(f(x))\big)^{:A\rightarrow B}\quad. \] \end_inset @@ -5026,7 +5023,7 @@ Since , we find that \begin_inset Formula \[ -f\bef\text{id}=\left(x\Rightarrow f(x)\right)=f\quad. +f\bef\text{id}=\left(x\rightarrow f(x)\right)=f\quad. \] \end_inset @@ -5063,7 +5060,7 @@ Let us verify that the types match here. \end_inset has type -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset for some type parameters @@ -5083,7 +5080,7 @@ Let us verify that the types match here. \end_inset ; so we can choose -\begin_inset Formula $g^{:B\Rightarrow C}$ +\begin_inset Formula $g^{:B\rightarrow C}$ \end_inset , where @@ -5096,7 +5093,7 @@ Let us verify that the types match here. \end_inset has type -\begin_inset Formula $A\Rightarrow C$ +\begin_inset Formula $A\rightarrow C$ \end_inset , so @@ -5104,7 +5101,7 @@ Let us verify that the types match here. \end_inset must have type -\begin_inset Formula $C\Rightarrow D$ +\begin_inset Formula $C\rightarrow D$ \end_inset for some type @@ -5113,15 +5110,15 @@ Let us verify that the types match here. . Assuming the types as -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset , -\begin_inset Formula $g^{:B\Rightarrow C}$ +\begin_inset Formula $g^{:B\rightarrow C}$ \end_inset , and -\begin_inset Formula $h^{:C\Rightarrow D}$ +\begin_inset Formula $h^{:C\rightarrow D}$ \end_inset , we find that the types in all the compositions @@ -5158,7 +5155,7 @@ noprefix "false" ) with type annotations, \begin_inset Formula \begin{equation} -(f^{:A\Rightarrow B}\bef g^{:B\Rightarrow C})\bef h^{:C\Rightarrow D}=f^{:A\Rightarrow B}\bef(g^{:B\Rightarrow C}\bef h^{:C\Rightarrow D})\quad.\label{eq:associativity-law-for-function-composition-with-types} +(f^{:A\rightarrow B}\bef g^{:B\rightarrow C})\bef h^{:C\rightarrow D}=f^{:A\rightarrow B}\bef(g^{:B\rightarrow C}\bef h^{:C\rightarrow D})\quad.\label{eq:associativity-law-for-function-composition-with-types} \end{equation} \end_inset @@ -5183,7 +5180,7 @@ noprefix "false" \end_inset ) are functions of type -\begin_inset Formula $A\Rightarrow D$ +\begin_inset Formula $A\rightarrow D$ \end_inset . @@ -5308,11 +5305,11 @@ f\bef g=g\circ f \end_inset for any functions -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset and -\begin_inset Formula $g^{:B\Rightarrow C}$ +\begin_inset Formula $g^{:B\rightarrow C}$ \end_inset . @@ -5333,7 +5330,7 @@ f\circ\text{id}=f\quad\quad,\quad\text{id}\circ f=f\quad. To match the types, we need to choose the type parameters as \begin_inset Formula \[ -f^{:A\Rightarrow B}\circ\text{id}^{:A\Rightarrow A}=f^{:A\Rightarrow B}\quad\quad,\quad\text{id}^{B\Rightarrow B}\circ f^{:A\Rightarrow B}=f^{:A\Rightarrow B}\quad. +f^{:A\rightarrow B}\circ\text{id}^{:A\rightarrow A}=f^{:A\rightarrow B}\quad\quad,\quad\text{id}^{B\rightarrow B}\circ f^{:A\rightarrow B}=f^{:A\rightarrow B}\quad. \] \end_inset @@ -5360,7 +5357,7 @@ noprefix "false" ) that \begin_inset Formula \[ -f\circ\text{id}=\left(x\Rightarrow f(\text{id}(x))\right)=\left(x\Rightarrow f(x)\right)=f\quad. +f\circ\text{id}=\left(x\rightarrow f(\text{id}(x))\right)=\left(x\rightarrow f(x)\right)=f\quad. \] \end_inset @@ -5368,7 +5365,7 @@ f\circ\text{id}=\left(x\Rightarrow f(\text{id}(x))\right)=\left(x\Rightarrow f(x Similarly for the right identity law, \begin_inset Formula \[ -\text{id}\circ f=\left(x\Rightarrow\text{id}\left(f\left(x\right)\right)\right)=\left(x\Rightarrow f\left(x\right)\right)=f\quad. +\text{id}\circ f=\left(x\rightarrow\text{id}\left(f\left(x\right)\right)\right)=\left(x\rightarrow f\left(x\right)\right)=f\quad. \] \end_inset @@ -5399,7 +5396,7 @@ The types are checked by assuming that \end_inset has the type -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset . @@ -5408,7 +5405,7 @@ The types are checked by assuming that \end_inset match only when -\begin_inset Formula $g^{:B\Rightarrow C}$ +\begin_inset Formula $g^{:B\rightarrow C}$ \end_inset , and then @@ -5416,7 +5413,7 @@ The types are checked by assuming that \end_inset is of type -\begin_inset Formula $A\Rightarrow C$ +\begin_inset Formula $A\rightarrow C$ \end_inset . @@ -5425,7 +5422,7 @@ The types are checked by assuming that \end_inset must be -\begin_inset Formula $h^{:C\Rightarrow D}$ +\begin_inset Formula $h^{:C\rightarrow D}$ \end_inset for the types in @@ -5436,7 +5433,7 @@ The types are checked by assuming that We can write the associativity law with type annotations as \begin_inset Formula \begin{equation} -h^{:C\Rightarrow D}\circ(g^{:B\Rightarrow C}\circ f^{A\Rightarrow B})=(h^{:C\Rightarrow D}\circ g^{:B\Rightarrow C})\circ f^{:A\Rightarrow B}\quad.\label{eq:assoc-law-for-composition-with-types-backward} +h^{:C\rightarrow D}\circ(g^{:B\rightarrow C}\circ f^{A\rightarrow B})=(h^{:C\rightarrow D}\circ g^{:B\rightarrow C})\circ f^{:A\rightarrow B}\quad.\label{eq:assoc-law-for-composition-with-types-backward} \end{equation} \end_inset @@ -5932,7 +5929,7 @@ In mathematics, functions are evaluated by substituting their argument values into their body. Nameless functions are evaluated in the same way. For example, applying the nameless function -\begin_inset Formula $x\Rightarrow x+10$ +\begin_inset Formula $x\rightarrow x+10$ \end_inset to an integer @@ -5963,7 +5960,7 @@ In mathematics, functions are evaluated by substituting their argument values The computation is written like this, \begin_inset Formula \[ -(x\Rightarrow x+10)(2)=2+10=12\quad. +(x\rightarrow x+10)(2)=2+10=12\quad. \] \end_inset @@ -6405,7 +6402,7 @@ To make calculations shorter, we will write code in a mathematical notation rather than in the Scala syntax. Type annotations are written with a colon in the superscript, for example: -\begin_inset Formula $x^{:\text{Int}}\Rightarrow x+10$ +\begin_inset Formula $x^{:\text{Int}}\rightarrow x+10$ \end_inset instead of the code @@ -6439,8 +6436,8 @@ status open can be written as \begin_inset Formula \begin{align*} - & (\gunderline{x^{:\text{Int}}\Rightarrow}\,y^{:\text{Int}}\Rightarrow\gunderline x-y)\left(20\right)\left(4\right)\\ -\text{apply function and substitute }x=20:\quad & =(\gunderline{y^{:\text{Int}}\Rightarrow}\,20-\gunderline y)\left(4\right)\\ + & (\gunderline{x^{:\text{Int}}\rightarrow}\,y^{:\text{Int}}\rightarrow\gunderline x-y)\left(20\right)\left(4\right)\\ +\text{apply function and substitute }x=20:\quad & =(\gunderline{y^{:\text{Int}}\rightarrow}\,20-\gunderline y)\left(4\right)\\ \text{apply function and substitute }y=4:\quad & =20-4=16\quad. \end{align*} @@ -6467,25 +6464,25 @@ values For instance, nameless functions can be arguments of other functions (nameless or not). Here is an example of applying a nameless function -\begin_inset Formula $f\Rightarrow f(2)$ +\begin_inset Formula $f\rightarrow f(2)$ \end_inset to a nameless function -\begin_inset Formula $x\Rightarrow x+4$ +\begin_inset Formula $x\rightarrow x+4$ \end_inset : \begin_inset Formula \begin{align*} - & (\gunderline f\Rightarrow\gunderline f(2))\left(x\Rightarrow x+4\right)\\ -\text{substitute }f=\left(x\Rightarrow x+4\right):\quad & =(\gunderline x\Rightarrow\gunderline x+4)(2)\\ + & (\gunderline f\rightarrow\gunderline f(2))\left(x\rightarrow x+4\right)\\ +\text{substitute }f=\left(x\rightarrow x+4\right):\quad & =(\gunderline x\rightarrow\gunderline x+4)(2)\\ \text{substitute }x=2:\quad & =2+4=6\quad. \end{align*} \end_inset In the nameless function -\begin_inset Formula $f\Rightarrow f(2)$ +\begin_inset Formula $f\rightarrow f(2)$ \end_inset , the argument @@ -6524,7 +6521,7 @@ In the nameless function \end_inset must have type -\begin_inset Formula $\text{Int}\Rightarrow\text{Int}$ +\begin_inset Formula $\text{Int}\rightarrow\text{Int}$ \end_inset , or else the types will not match. @@ -6580,7 +6577,7 @@ res2: Int = 6 \begin_layout Standard \noindent No type annotation is needed for -\begin_inset Formula $x\Rightarrow x+4$ +\begin_inset Formula $x\rightarrow x+4$ \end_inset since the Scala compiler already knows the type of @@ -6592,7 +6589,7 @@ No type annotation is needed for \end_inset in -\begin_inset Formula $x\Rightarrow x+4$ +\begin_inset Formula $x\rightarrow x+4$ \end_inset must have type @@ -6616,11 +6613,11 @@ To summarize the syntax conventions for curried nameless functions: \begin_layout Itemize Function expressions group everything to the right: -\begin_inset Formula $x\Rightarrow y\Rightarrow z\Rightarrow e$ +\begin_inset Formula $x\rightarrow y\rightarrow z\rightarrow e$ \end_inset means -\begin_inset Formula $x\Rightarrow\left(y\Rightarrow\left(z\Rightarrow e\right)\right)$ +\begin_inset Formula $x\rightarrow\left(y\rightarrow\left(z\rightarrow e\right)\right)$ \end_inset . @@ -6671,9 +6668,9 @@ Int . \begin_inset Formula \begin{align*} -\left(x\Rightarrow x*2\right)(10) & =10*2=20\quad.\\ -\left(p\Rightarrow z\Rightarrow z*p\right)\left(t\right) & =(z\Rightarrow z*t)\quad.\\ -\left(p\Rightarrow z\Rightarrow z*p\right)(t)(4) & =(z\Rightarrow z*t)(4)=4*t\quad. +\left(x\rightarrow x*2\right)(10) & =10*2=20\quad.\\ +\left(p\rightarrow z\rightarrow z*p\right)\left(t\right) & =(z\rightarrow z*t)\quad.\\ +\left(p\rightarrow z\rightarrow z*p\right)(t)(4) & =(z\rightarrow z*t)(4)=4*t\quad. \end{align*} \end_inset @@ -6683,7 +6680,7 @@ Some results of these computation are integer values such as \end_inset ; other results are nameless functions such as -\begin_inset Formula $z\Rightarrow z*t$ +\begin_inset Formula $z\rightarrow z*t$ \end_inset . @@ -6738,21 +6735,21 @@ res5: Int = 40 \begin_layout Standard In the following examples, some arguments are themselves functions. Consider an expression that uses the nameless function -\begin_inset Formula $\left(g\Rightarrow g(2)\right)$ +\begin_inset Formula $\left(g\rightarrow g(2)\right)$ \end_inset as an argument: \begin_inset Formula \begin{align} - & (\gunderline f\Rightarrow p\Rightarrow\gunderline f(p))\left(g\Rightarrow g(2)\right)\label{eq:higher-order-functions-derivation0}\\ -\text{substitute }f=\left(g\Rightarrow g(2)\right):\quad & =p\Rightarrow(\gunderline g\Rightarrow\gunderline g(2))\,(p)\nonumber \\ -\text{substitute }g=p:\quad & =p\Rightarrow p(2)\quad.\label{eq:higher-order-functions-derivation1} + & (\gunderline f\rightarrow p\rightarrow\gunderline f(p))\left(g\rightarrow g(2)\right)\label{eq:higher-order-functions-derivation0}\\ +\text{substitute }f=\left(g\rightarrow g(2)\right):\quad & =p\rightarrow(\gunderline g\rightarrow\gunderline g(2))\,(p)\nonumber \\ +\text{substitute }g=p:\quad & =p\rightarrow p(2)\quad.\label{eq:higher-order-functions-derivation1} \end{align} \end_inset The result of this expression is a function -\begin_inset Formula $p\Rightarrow p(2)$ +\begin_inset Formula $p\rightarrow p(2)$ \end_inset that will apply @@ -6773,7 +6770,7 @@ its \end_inset is the function -\begin_inset Formula $x\Rightarrow x+4$ +\begin_inset Formula $x\rightarrow x+4$ \end_inset . @@ -6794,9 +6791,9 @@ noprefix "false" ) to that function: \begin_inset Formula \begin{align*} - & \gunderline{\left(f\Rightarrow p\Rightarrow f(p)\right)\left(g\Rightarrow g(2)\right)}\left(x\Rightarrow x+4\right)\\ -\text{use Eq.~(\ref{eq:higher-order-functions-derivation1})}:\quad & =(\gunderline p\Rightarrow\gunderline p(2))\left(x\Rightarrow x+4\right)\\ -\text{substitute }p=\left(x\Rightarrow x+4\right):\quad & =(\gunderline x\Rightarrow\gunderline x+4)\left(2\right)\\ + & \gunderline{\left(f\rightarrow p\rightarrow f(p)\right)\left(g\rightarrow g(2)\right)}\left(x\rightarrow x+4\right)\\ +\text{use Eq.~(\ref{eq:higher-order-functions-derivation1})}:\quad & =(\gunderline p\rightarrow\gunderline p(2))\left(x\rightarrow x+4\right)\\ +\text{substitute }p=\left(x\rightarrow x+4\right):\quad & =(\gunderline x\rightarrow\gunderline x+4)\left(2\right)\\ \text{substitute }x=2:\quad & =2+4=6\quad. \end{align*} @@ -6821,15 +6818,15 @@ To verify this calculation in Scala, we need to add appropriate type annotations \begin_layout Standard We know that the function -\begin_inset Formula $f\Rightarrow p\Rightarrow f(p)$ +\begin_inset Formula $f\rightarrow p\rightarrow f(p)$ \end_inset is being applied to the arguments -\begin_inset Formula $f=\left(g\Rightarrow g(2)\right)$ +\begin_inset Formula $f=\left(g\rightarrow g(2)\right)$ \end_inset and -\begin_inset Formula $p=\left(x\Rightarrow x+4\right)$ +\begin_inset Formula $p=\left(x\rightarrow x+4\right)$ \end_inset . @@ -6838,7 +6835,7 @@ We know that the function \end_inset in -\begin_inset Formula $f\Rightarrow p\Rightarrow f(p)$ +\begin_inset Formula $f\rightarrow p\rightarrow f(p)$ \end_inset must be a function that takes @@ -6854,7 +6851,7 @@ The variable \end_inset in -\begin_inset Formula $x\Rightarrow x+4$ +\begin_inset Formula $x\rightarrow x+4$ \end_inset must be of type @@ -6879,11 +6876,11 @@ Int . Thus, the type of the expression -\begin_inset Formula $x\Rightarrow x+4$ +\begin_inset Formula $x\rightarrow x+4$ \end_inset is -\begin_inset Formula $\text{Int}\Rightarrow\text{Int}$ +\begin_inset Formula $\text{Int}\rightarrow\text{Int}$ \end_inset , and so must be the type of the argument @@ -6892,7 +6889,7 @@ Int . We write -\begin_inset Formula $p^{:\text{Int}\Rightarrow\text{Int}}$ +\begin_inset Formula $p^{:\text{Int}\rightarrow\text{Int}}$ \end_inset . @@ -6900,7 +6897,7 @@ Int \begin_layout Standard Finally, we need to make sure that the types match in the function -\begin_inset Formula $f\Rightarrow p\Rightarrow f(p)$ +\begin_inset Formula $f\rightarrow p\rightarrow f(p)$ \end_inset . @@ -6917,7 +6914,7 @@ Finally, we need to make sure that the types match in the function \end_inset , which is -\begin_inset Formula $\text{Int}\Rightarrow\text{Int}$ +\begin_inset Formula $\text{Int}\rightarrow\text{Int}$ \end_inset . @@ -6926,7 +6923,7 @@ Finally, we need to make sure that the types match in the function \end_inset 's type must be -\begin_inset Formula $\left(\text{Int}\Rightarrow\text{Int}\right)\Rightarrow A$ +\begin_inset Formula $\left(\text{Int}\rightarrow\text{Int}\right)\rightarrow A$ \end_inset for some type @@ -6935,7 +6932,7 @@ Finally, we need to make sure that the types match in the function . Since in our example -\begin_inset Formula $f=\left(g\Rightarrow g(2)\right)$ +\begin_inset Formula $f=\left(g\rightarrow g(2)\right)$ \end_inset , types match only if @@ -6943,7 +6940,7 @@ Finally, we need to make sure that the types match in the function \end_inset has type -\begin_inset Formula $\text{Int}\Rightarrow\text{Int}$ +\begin_inset Formula $\text{Int}\rightarrow\text{Int}$ \end_inset . @@ -6965,7 +6962,7 @@ Finally, we need to make sure that the types match in the function \end_inset is -\begin_inset Formula $\left(\text{Int}\Rightarrow\text{Int}\right)\Rightarrow\text{Int}$ +\begin_inset Formula $\left(\text{Int}\rightarrow\text{Int}\right)\rightarrow\text{Int}$ \end_inset . @@ -7259,8 +7256,8 @@ id Write the code of these functions in a short notation: \begin_inset Formula \begin{align*} -\text{const}^{C,X} & \triangleq(c^{:C}\Rightarrow\_^{:X}\Rightarrow c)\quad,\\ -\text{id}^{A} & \triangleq(a^{:A}\Rightarrow a)\quad. +\text{const}^{C,X} & \triangleq(c^{:C}\rightarrow\_^{:X}\rightarrow c)\quad,\\ +\text{id}^{A} & \triangleq(a^{:A}\rightarrow a)\quad. \end{align*} \end_inset @@ -7328,7 +7325,7 @@ first \end_inset is -\begin_inset Formula $A\Rightarrow A$ +\begin_inset Formula $A\rightarrow A$ \end_inset , where @@ -7345,13 +7342,13 @@ first \end_inset must be equal to -\begin_inset Formula $A\Rightarrow A$ +\begin_inset Formula $A\rightarrow A$ \end_inset : \begin_inset Formula \[ -C=A\Rightarrow A\quad. +C=A\rightarrow A\quad. \] \end_inset @@ -7394,18 +7391,18 @@ id \end_inset is of type -\begin_inset Formula $X\Rightarrow C$ +\begin_inset Formula $X\rightarrow C$ \end_inset , which equals -\begin_inset Formula $X\Rightarrow A\Rightarrow A$ +\begin_inset Formula $X\rightarrow A\rightarrow A$ \end_inset . In this way, we find \begin_inset Formula \[ -\text{const}^{A\Rightarrow A,X}(\text{id}^{A}):X\Rightarrow A\Rightarrow A\quad. +\text{const}^{A\rightarrow A,X}(\text{id}^{A}):X\rightarrow A\rightarrow A\quad. \] \end_inset @@ -7420,7 +7417,7 @@ The types can be arbitrary. The type -\begin_inset Formula $X\Rightarrow A\Rightarrow A$ +\begin_inset Formula $X\rightarrow A\rightarrow A$ \end_inset is the most general type for the expression @@ -7481,9 +7478,9 @@ id \begin_inset Formula \begin{align*} & \gunderline{\text{const}}\left(\text{id}\right)\\ -\text{definition of const}:\quad & =(\gunderline c\Rightarrow x\Rightarrow\gunderline c)(\text{id})\\ -\text{apply function, substitute }c=\text{id}:\quad & =(x\Rightarrow\gunderline{\text{id}})\\ -\text{definition of }\text{id}:\quad & =\left(x\Rightarrow a\Rightarrow a\right)\quad. +\text{definition of const}:\quad & =(\gunderline c\rightarrow x\rightarrow\gunderline c)(\text{id})\\ +\text{apply function, substitute }c=\text{id}:\quad & =(x\rightarrow\gunderline{\text{id}})\\ +\text{definition of }\text{id}:\quad & =\left(x\rightarrow a\rightarrow a\right)\quad. \end{align*} \end_inset @@ -7493,7 +7490,7 @@ id \begin_layout Standard The function -\begin_inset Formula $\left(x\Rightarrow a\Rightarrow a\right)$ +\begin_inset Formula $\left(x\rightarrow a\rightarrow a\right)$ \end_inset takes an argument @@ -7501,7 +7498,7 @@ The function \end_inset and returns the identity function -\begin_inset Formula $a^{:A}\Rightarrow a$ +\begin_inset Formula $a^{:A}\rightarrow a$ \end_inset . @@ -7512,7 +7509,7 @@ The function is ignored by this function, so we can rewrite it equivalently as \begin_inset Formula \[ -\text{const}\left(\text{id}\right)=(\_^{:X}\Rightarrow a^{:A}\Rightarrow a)\quad. +\text{const}\left(\text{id}\right)=(\_^{:X}\rightarrow a^{:A}\rightarrow a)\quad. \] \end_inset @@ -7897,7 +7894,7 @@ To determine the type signature and the possible type parameters , ..., we need to determine the most general type that matches the function body. The function body is the expression -\begin_inset Formula $x\Rightarrow f(f(x))$ +\begin_inset Formula $x\rightarrow f(f(x))$ \end_inset . @@ -7918,7 +7915,7 @@ To determine the type signature and the possible type parameters \end_inset to have type -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset for some type @@ -7948,7 +7945,7 @@ To determine the type signature and the possible type parameters \end_inset ; but we already assumed -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset . @@ -7962,15 +7959,15 @@ To determine the type signature and the possible type parameters \end_inset implies -\begin_inset Formula $f^{:A\Rightarrow A}$ +\begin_inset Formula $f^{:A\rightarrow A}$ \end_inset , and the expression -\begin_inset Formula $x\Rightarrow f(f(x))$ +\begin_inset Formula $x\rightarrow f(f(x))$ \end_inset has type -\begin_inset Formula $A\Rightarrow A$ +\begin_inset Formula $A\rightarrow A$ \end_inset . @@ -8035,7 +8032,7 @@ This fully parametric function has only one independent type parameter, , and can be equivalently written in the code notation as \begin_inset Formula \begin{equation} -\text{twice}^{A}\triangleq f^{:A\Rightarrow A}\Rightarrow x^{:A}\Rightarrow f(f(x))=(f^{:A\Rightarrow A}\Rightarrow f\bef f)\quad.\label{eq:hof-def-of-twice-in-math-notation} +\text{twice}^{A}\triangleq f^{:A\rightarrow A}\rightarrow x^{:A}\rightarrow f(f(x))=(f^{:A\rightarrow A}\rightarrow f\bef f)\quad.\label{eq:hof-def-of-twice-in-math-notation} \end{equation} \end_inset @@ -8079,7 +8076,7 @@ noprefix "false" \end_inset and the type signature -\begin_inset Formula $\left(A\Rightarrow A\right)\Rightarrow A\Rightarrow A$ +\begin_inset Formula $\left(A\rightarrow A\right)\rightarrow A\rightarrow A$ \end_inset have been @@ -8091,7 +8088,7 @@ inferred \end_inset from the code -\begin_inset Formula $f\Rightarrow x\Rightarrow f(f(x))$ +\begin_inset Formula $f\rightarrow x\rightarrow f(f(x))$ \end_inset . @@ -8219,7 +8216,7 @@ twice[A] \end_inset of type -\begin_inset Formula $\left(A\Rightarrow A\right)\Rightarrow A\Rightarrow A$ +\begin_inset Formula $\left(A\rightarrow A\right)\rightarrow A\rightarrow A$ \end_inset can be applied to the argument @@ -8247,7 +8244,7 @@ twice[B] \end_inset has type -\begin_inset Formula $A\Rightarrow A$ +\begin_inset Formula $A\rightarrow A$ \end_inset . @@ -8264,28 +8261,28 @@ twice[B] \end_inset is of type -\begin_inset Formula $\left(B\Rightarrow B\right)\Rightarrow B\Rightarrow B$ +\begin_inset Formula $\left(B\rightarrow B\right)\rightarrow B\rightarrow B$ \end_inset . Since the symbol -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset groups to the right, we have \begin_inset Formula \[ -\left(B\Rightarrow B\right)\Rightarrow B\Rightarrow B=\left(B\Rightarrow B\right)\Rightarrow\left(B\Rightarrow B\right)\quad. +\left(B\rightarrow B\right)\rightarrow B\rightarrow B=\left(B\rightarrow B\right)\rightarrow\left(B\rightarrow B\right)\quad. \] \end_inset This can match with -\begin_inset Formula $A\Rightarrow A$ +\begin_inset Formula $A\rightarrow A$ \end_inset only if we set -\begin_inset Formula $A=\left(B\Rightarrow B\right)$ +\begin_inset Formula $A=\left(B\rightarrow B\right)$ \end_inset . @@ -8304,7 +8301,7 @@ twice(twice) is \begin_inset Formula \begin{equation} -\text{twice}^{B\Rightarrow B}(\text{twice}^{B}):\left(B\Rightarrow B\right)\Rightarrow B\Rightarrow B\quad.\label{eq:hof-twice-example-solved3} +\text{twice}^{B\rightarrow B}(\text{twice}^{B}):\left(B\rightarrow B\right)\rightarrow B\rightarrow B\quad.\label{eq:hof-twice-example-solved3} \end{equation} \end_inset @@ -8486,9 +8483,9 @@ twice(twice) \begin_inset Formula \begin{align*} & \text{twice}(\text{twice})=\text{twice}\bef\text{twice}\\ -\text{expand function composition}:\quad & =f\Rightarrow\text{twice}(\gunderline{\text{twice}}(f))\quad.\\ -\text{definition of }\text{twice}(f):\quad & =f\Rightarrow\gunderline{\text{twice}}(f\bef f)\\ -\text{definition of twice}:\quad & =f\Rightarrow f\bef f\bef f\bef f\quad. +\text{expand function composition}:\quad & =f\rightarrow\text{twice}(\gunderline{\text{twice}}(f))\quad.\\ +\text{definition of }\text{twice}(f):\quad & =f\rightarrow\gunderline{\text{twice}}(f\bef f)\\ +\text{definition of twice}:\quad & =f\rightarrow f\bef f\bef f\bef f\quad. \end{align*} \end_inset @@ -8511,19 +8508,19 @@ The last expression is hard to use: it is confusing that the argument names The calculation will be made clearer if we rename the arguments to remove shadowing of names. To avoid errors, we will start with -\begin_inset Formula $x\Rightarrow\text{twice}(\text{twice}(x))$ +\begin_inset Formula $x\rightarrow\text{twice}(\text{twice}(x))$ \end_inset and rename arguments one scope at a time: \begin_inset Formula \begin{align*} - & x\Rightarrow\text{twice}(\text{twice}(\gunderline x))\\ -\text{rename }x\text{ to }z:\quad & =z\Rightarrow\gunderline{\text{twice}}(\text{twice}(z))\\ -\text{definition of twice}:\quad & =z\Rightarrow\gunderline{\left(f\Rightarrow x\Rightarrow f(f(x))\right)}\left(\text{twice}(z)\right)\\ -\text{rename }f,x\text{ to }g,y:\quad & =z\Rightarrow(g\Rightarrow y\Rightarrow\gunderline g(\gunderline g(y)))\left(\text{twice}(z)\right)\\ -\text{substitute }g=\text{twice}(z):\quad & =z\Rightarrow y\Rightarrow\gunderline{\left(\text{twice}(z)\right)}\left(\text{twice}(z)(y)\right)\\ -\text{use }\text{twice}(z)=\left(x\Rightarrow z(z(x))\right):\quad & =z\Rightarrow y\Rightarrow\left(x\Rightarrow z(z(x))\right)(\gunderline{\text{twice}(z)(y)})\\ -\text{substitute }x=\text{twice}(z)(y)=z(z(y)):\quad & =z\Rightarrow y\Rightarrow z(z(z(z(y))))\quad. + & x\rightarrow\text{twice}(\text{twice}(\gunderline x))\\ +\text{rename }x\text{ to }z:\quad & =z\rightarrow\gunderline{\text{twice}}(\text{twice}(z))\\ +\text{definition of twice}:\quad & =z\rightarrow\gunderline{\left(f\rightarrow x\rightarrow f(f(x))\right)}\left(\text{twice}(z)\right)\\ +\text{rename }f,x\text{ to }g,y:\quad & =z\rightarrow(g\rightarrow y\rightarrow\gunderline g(\gunderline g(y)))\left(\text{twice}(z)\right)\\ +\text{substitute }g=\text{twice}(z):\quad & =z\rightarrow y\rightarrow\gunderline{\left(\text{twice}(z)\right)}\left(\text{twice}(z)(y)\right)\\ +\text{use }\text{twice}(z)=\left(x\rightarrow z(z(x))\right):\quad & =z\rightarrow y\rightarrow\left(x\rightarrow z(z(x))\right)(\gunderline{\text{twice}(z)(y)})\\ +\text{substitute }x=\text{twice}(z)(y)=z(z(y)):\quad & =z\rightarrow y\rightarrow z(z(z(z(y))))\quad. \end{align*} \end_inset @@ -8572,7 +8569,7 @@ noprefix "false" \end_inset and can be written as -\begin_inset Formula $\text{twice}^{\text{Int}\Rightarrow\text{Int}}(\text{twice}^{\text{Int}})$ +\begin_inset Formula $\text{twice}^{\text{Int}\rightarrow\text{Int}}(\text{twice}^{\text{Int}})$ \end_inset , or in Scala syntax, @@ -8679,7 +8676,7 @@ Solution \begin_layout Standard In the nameless function -\begin_inset Formula $f\Rightarrow f(2)$ +\begin_inset Formula $f\rightarrow f(2)$ \end_inset , the argument @@ -8708,11 +8705,11 @@ Int \end_inset has type -\begin_inset Formula $\text{Int}\Rightarrow\text{Int}$ +\begin_inset Formula $\text{Int}\rightarrow\text{Int}$ \end_inset or -\begin_inset Formula $\text{Int}\Rightarrow\text{String}$ +\begin_inset Formula $\text{Int}\rightarrow\text{String}$ \end_inset or similar. @@ -8721,7 +8718,7 @@ Int \end_inset has type -\begin_inset Formula $\text{Int}\Rightarrow A$ +\begin_inset Formula $\text{Int}\rightarrow A$ \end_inset , where @@ -8743,7 +8740,7 @@ a type parameter). . Since nameless function -\begin_inset Formula $f\Rightarrow f(2)$ +\begin_inset Formula $f\rightarrow f(2)$ \end_inset has an argument @@ -8751,7 +8748,7 @@ a type parameter). \end_inset of type -\begin_inset Formula $\text{Int}\Rightarrow A$ +\begin_inset Formula $\text{Int}\rightarrow A$ \end_inset and the result of type @@ -8763,7 +8760,7 @@ a type parameter). \end_inset must be -\begin_inset Formula $\left(\text{Int}\Rightarrow A\right)\Rightarrow A$ +\begin_inset Formula $\left(\text{Int}\rightarrow A\right)\rightarrow A$ \end_inset . @@ -9285,7 +9282,7 @@ A \begin_layout Plain Layout \size small -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset @@ -9346,7 +9343,7 @@ A => B \begin_layout Plain Layout \size small -\begin_inset Formula $x^{:\text{Int}}\Rightarrow f(x)$ +\begin_inset Formula $x^{:\text{Int}}\rightarrow f(x)$ \end_inset @@ -9460,7 +9457,7 @@ define a function with type parameters \end_inset , also -\begin_inset Formula $\text{id}^{:A\Rightarrow A}$ +\begin_inset Formula $\text{id}^{:A\rightarrow A}$ \end_inset @@ -9509,7 +9506,7 @@ the standard identity function \begin_layout Plain Layout \size small -\begin_inset Formula $A\Rightarrow B\Rightarrow C$ +\begin_inset Formula $A\rightarrow B\rightarrow C$ \end_inset @@ -10291,7 +10288,7 @@ add_x \end_inset to the equivalent type expression -\begin_inset Formula $\text{Int}\Rightarrow\text{Int}\Rightarrow\text{Int}$ +\begin_inset Formula $\text{Int}\rightarrow\text{Int}\rightarrow\text{Int}$ \end_inset . @@ -10393,7 +10390,7 @@ z \end_inset because we already specified the type -\begin_inset Formula $\text{Int}\Rightarrow\text{Int}\Rightarrow\text{Int}$ +\begin_inset Formula $\text{Int}\rightarrow\text{Int}\rightarrow\text{Int}$ \end_inset for the value @@ -10565,7 +10562,7 @@ Int \end_inset must have type -\begin_inset Formula $\text{Int}\Rightarrow\text{Int}$ +\begin_inset Formula $\text{Int}\rightarrow\text{Int}$ \end_inset . @@ -10989,17 +10986,17 @@ choice(x,p,f,g) \end_inset , which means that the most general types so far are -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset and -\begin_inset Formula $g^{:A\Rightarrow C}$ +\begin_inset Formula $g^{:A\rightarrow C}$ \end_inset , yielding the type signature \begin_inset Formula \[ -\text{choice}(x^{:A},p^{:A\Rightarrow\text{Boolean}},f^{:A\Rightarrow B},g^{:A\Rightarrow C})\quad. +\text{choice}(x^{:A},p^{:A\rightarrow\text{Boolean}},f^{:A\rightarrow B},g^{:A\rightarrow C})\quad. \] \end_inset @@ -11226,7 +11223,7 @@ Begin by assuming . In the sub-expression -\begin_inset Formula $g\Rightarrow g(f)$ +\begin_inset Formula $g\rightarrow g(f)$ \end_inset , the curried argument @@ -11243,7 +11240,7 @@ Begin by assuming . So we assign types as -\begin_inset Formula $f^{:A}\Rightarrow g^{:A\Rightarrow B}\Rightarrow g(f)$ +\begin_inset Formula $f^{:A}\rightarrow g^{:A\rightarrow B}\rightarrow g(f)$ \end_inset , where @@ -11375,7 +11372,7 @@ q[C, D] \end_inset , which is -\begin_inset Formula $C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D$ +\begin_inset Formula $C\rightarrow\left(C\rightarrow D\right)\rightarrow D$ \end_inset . @@ -11386,7 +11383,7 @@ q[C, D] as \begin_inset Formula \[ -A=C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D\quad. +A=C\rightarrow\left(C\rightarrow D\right)\rightarrow D\quad. \] \end_inset @@ -11406,8 +11403,8 @@ q(q) becomes \begin_inset Formula \begin{align*} -q^{A,B}(q^{C,D}) & :\left(\left(C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D\right)\Rightarrow B\right)\Rightarrow B\quad,\\ -\text{where}\quad & A=C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D\quad. +q^{A,B}(q^{C,D}) & :\left(\left(C\rightarrow\left(C\rightarrow D\right)\rightarrow D\right)\rightarrow B\right)\rightarrow B\quad,\\ +\text{where}\quad & A=C\rightarrow\left(C\rightarrow D\right)\rightarrow D\quad. \end{align*} \end_inset @@ -11450,7 +11447,7 @@ q(q(q)) \end_inset has type -\begin_inset Formula $\left(\left(C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D\right)\Rightarrow B\right)\Rightarrow B$ +\begin_inset Formula $\left(\left(C\rightarrow\left(C\rightarrow D\right)\rightarrow D\right)\rightarrow B\right)\rightarrow B$ \end_inset . @@ -11511,7 +11508,7 @@ q[E, F] This gives the constraint \begin_inset Formula \[ -E=\left(\left(C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D\right)\Rightarrow B\right)\Rightarrow B\quad. +E=\left(\left(C\rightarrow\left(C\rightarrow D\right)\rightarrow D\right)\rightarrow B\right)\rightarrow B\quad. \] \end_inset @@ -11530,7 +11527,7 @@ q(q(q)) \end_inset is -\begin_inset Formula $\left(E\Rightarrow F\right)\Rightarrow F$ +\begin_inset Formula $\left(E\rightarrow F\right)\rightarrow F$ \end_inset . @@ -11549,9 +11546,9 @@ q(q(q)) is \begin_inset Formula \begin{align*} -q^{E,F}(q^{A,B}(q^{C,D})) & :\left(\left(\left(\left(C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D\right)\Rightarrow B\right)\Rightarrow B\right)\Rightarrow F\right)\Rightarrow F\quad,\\ -\text{where}\quad & A=C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D\\ -\text{and}\quad & E=\left(\left(C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D\right)\Rightarrow B\right)\Rightarrow B\quad. +q^{E,F}(q^{A,B}(q^{C,D})) & :\left(\left(\left(\left(C\rightarrow\left(C\rightarrow D\right)\rightarrow D\right)\rightarrow B\right)\rightarrow B\right)\rightarrow F\right)\rightarrow F\quad,\\ +\text{where}\quad & A=C\rightarrow\left(C\rightarrow D\right)\rightarrow D\\ +\text{and}\quad & E=\left(\left(C\rightarrow\left(C\rightarrow D\right)\rightarrow D\right)\rightarrow B\right)\rightarrow B\quad. \end{align*} \end_inset @@ -11719,7 +11716,7 @@ noprefix "false" Infer types in the code expression \begin_inset Formula \[ -\left(f\Rightarrow g\Rightarrow g(f)\right)\left(f\Rightarrow g\Rightarrow g(f)\right)\left(f\Rightarrow f(10)\right) +\left(f\rightarrow g\rightarrow g(f)\right)\left(f\rightarrow g\rightarrow g(f)\right)\left(f\rightarrow f(10)\right) \] \end_inset @@ -11733,7 +11730,7 @@ Solution \begin_layout Standard The given expression is a curried function -\begin_inset Formula $f\Rightarrow g\Rightarrow g(f)$ +\begin_inset Formula $f\rightarrow g\rightarrow g(f)$ \end_inset applied to two curried arguments. @@ -11754,7 +11751,7 @@ Begin by renaming the shadowed variables ( ) to remove shadowing: \begin_inset Formula \begin{equation} -\left(f\Rightarrow g\Rightarrow g(f)\right)\left(x\Rightarrow y\Rightarrow y(x)\right)\left(h\Rightarrow h(10)\right)\quad.\label{eq:example-hof-curried-function-solved1} +\left(f\rightarrow g\rightarrow g(f)\right)\left(x\rightarrow y\rightarrow y(x)\right)\left(h\rightarrow h(10)\right)\quad.\label{eq:example-hof-curried-function-solved1} \end{equation} \end_inset @@ -11774,11 +11771,11 @@ noprefix "false" \end_inset , the sub-expression -\begin_inset Formula $f\Rightarrow g\Rightarrow g(f)$ +\begin_inset Formula $f\rightarrow g\rightarrow g(f)$ \end_inset is typed as -\begin_inset Formula $f^{:A}\Rightarrow g^{:A\Rightarrow B}\Rightarrow g(f)$ +\begin_inset Formula $f^{:A}\rightarrow g^{:A\rightarrow B}\rightarrow g(f)$ \end_inset , where @@ -11791,15 +11788,15 @@ noprefix "false" are some type parameters. The sub-expression -\begin_inset Formula $x\Rightarrow y\Rightarrow y(x)$ +\begin_inset Formula $x\rightarrow y\rightarrow y(x)$ \end_inset is the same function as -\begin_inset Formula $f\Rightarrow g\Rightarrow g(f)$ +\begin_inset Formula $f\rightarrow g\rightarrow g(f)$ \end_inset but with possibly different type parameters, say, -\begin_inset Formula $x^{:C}\Rightarrow y^{:C\Rightarrow D}\Rightarrow y(x)$ +\begin_inset Formula $x^{:C}\rightarrow y^{:C\rightarrow D}\rightarrow y(x)$ \end_inset . @@ -11828,11 +11825,11 @@ Finally, the variable \end_inset in the sub-expression -\begin_inset Formula $h\Rightarrow h(10)$ +\begin_inset Formula $h\rightarrow h(10)$ \end_inset must have type -\begin_inset Formula $\text{Int}\Rightarrow E$ +\begin_inset Formula $\text{Int}\rightarrow E$ \end_inset , where @@ -11841,11 +11838,11 @@ Finally, the variable is another type parameter. So, the sub-expression -\begin_inset Formula $h\Rightarrow h(10)$ +\begin_inset Formula $h\rightarrow h(10)$ \end_inset is a function of type -\begin_inset Formula $\left(\text{Int}\Rightarrow E\right)\Rightarrow E$ +\begin_inset Formula $\left(\text{Int}\rightarrow E\right)\rightarrow E$ \end_inset . @@ -11869,7 +11866,7 @@ noprefix "false" ): \begin_inset Formula \begin{equation} -(f^{:A}\Rightarrow g^{:A\Rightarrow B}\Rightarrow g(f))(x^{:C}\Rightarrow y^{:C\Rightarrow D}\Rightarrow y(x))(h^{:\text{Int}\Rightarrow E}\Rightarrow h(10)\quad.\label{eq:example-hof-curried-function-solved2} +(f^{:A}\rightarrow g^{:A\rightarrow B}\rightarrow g(f))(x^{:C}\rightarrow y^{:C\rightarrow D}\rightarrow y(x))(h^{:\text{Int}\rightarrow E}\rightarrow h(10)\quad.\label{eq:example-hof-curried-function-solved2} \end{equation} \end_inset @@ -11879,7 +11876,7 @@ It follows that \end_inset must have the same type as -\begin_inset Formula $x\Rightarrow y\Rightarrow y(x)$ +\begin_inset Formula $x\rightarrow y\rightarrow y(x)$ \end_inset , while @@ -11887,7 +11884,7 @@ It follows that \end_inset must have the same type as -\begin_inset Formula $h\Rightarrow h(10)$ +\begin_inset Formula $h\rightarrow h(10)$ \end_inset . @@ -11896,19 +11893,19 @@ It follows that \end_inset , which we know as -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset , will match the type of -\begin_inset Formula $h\Rightarrow h(10)$ +\begin_inset Formula $h\rightarrow h(10)$ \end_inset , which we know as -\begin_inset Formula $\left(\text{Int}\Rightarrow E\right)\Rightarrow E$ +\begin_inset Formula $\left(\text{Int}\rightarrow E\right)\rightarrow E$ \end_inset , only if -\begin_inset Formula $A=\left(\text{Int}\Rightarrow E\right)$ +\begin_inset Formula $A=\left(\text{Int}\rightarrow E\right)$ \end_inset and @@ -11921,7 +11918,7 @@ It follows that \end_inset has type -\begin_inset Formula $\text{Int}\Rightarrow E$ +\begin_inset Formula $\text{Int}\rightarrow E$ \end_inset . @@ -11930,11 +11927,11 @@ It follows that \end_inset must match the type of -\begin_inset Formula $x\Rightarrow y\Rightarrow y(x)$ +\begin_inset Formula $x\rightarrow y\rightarrow y(x)$ \end_inset , which is -\begin_inset Formula $C\Rightarrow(C\Rightarrow D)\Rightarrow D$ +\begin_inset Formula $C\rightarrow(C\rightarrow D)\rightarrow D$ \end_inset . @@ -11943,7 +11940,7 @@ It follows that \end_inset and -\begin_inset Formula $E=(C\Rightarrow D)\Rightarrow D=(\text{Int}\Rightarrow D)\Rightarrow D$ +\begin_inset Formula $E=(C\rightarrow D)\rightarrow D=(\text{Int}\rightarrow D)\rightarrow D$ \end_inset . @@ -12013,8 +12010,8 @@ arbitrary), while the type parameters are expressed as \begin_inset Formula \begin{align} -A & =\text{Int}\Rightarrow\left(\text{Int}\Rightarrow D\right)\Rightarrow D\quad,\label{eq:example-hof-curried-solved3}\\ -B & =E=\left(\text{Int}\Rightarrow D\right)\Rightarrow D\quad,\label{eq:example-hof-curried-solved4}\\ +A & =\text{Int}\rightarrow\left(\text{Int}\rightarrow D\right)\rightarrow D\quad,\label{eq:example-hof-curried-solved3}\\ +B & =E=\left(\text{Int}\rightarrow D\right)\rightarrow D\quad,\label{eq:example-hof-curried-solved4}\\ C & =\text{Int}\quad.\nonumber \end{align} @@ -12067,7 +12064,7 @@ noprefix "false" \end_inset ) has type -\begin_inset Formula $B=\left(\text{Int}\Rightarrow D\right)\Rightarrow D$ +\begin_inset Formula $B=\left(\text{Int}\rightarrow D\right)\rightarrow D$ \end_inset . @@ -12078,16 +12075,16 @@ Having established that types match, we can now omit the type annotations and rewrite the code: \begin_inset Formula \begin{align*} - & (f\Rightarrow g\Rightarrow\gunderline g(\gunderline f))\left(x\Rightarrow y\Rightarrow y(x)\right)\left(h\Rightarrow h(10)\right)\\ -\text{substitute }f,g:\quad & =(h\Rightarrow\gunderline h(10))\left(x\Rightarrow y\Rightarrow y(x)\right)\\ -\text{substitute }h:\quad & =(x\Rightarrow y\Rightarrow y(\gunderline x))(10)\\ -\text{substitute }x:\quad & =y\Rightarrow y(10)\quad. + & (f\rightarrow g\rightarrow\gunderline g(\gunderline f))\left(x\rightarrow y\rightarrow y(x)\right)\left(h\rightarrow h(10)\right)\\ +\text{substitute }f,g:\quad & =(h\rightarrow\gunderline h(10))\left(x\rightarrow y\rightarrow y(x)\right)\\ +\text{substitute }h:\quad & =(x\rightarrow y\rightarrow y(\gunderline x))(10)\\ +\text{substitute }x:\quad & =y\rightarrow y(10)\quad. \end{align*} \end_inset The type of this expression is -\begin_inset Formula $\left(\text{Int}\Rightarrow D\right)\Rightarrow D$ +\begin_inset Formula $\left(\text{Int}\rightarrow D\right)\rightarrow D$ \end_inset with a type parameter @@ -12104,12 +12101,12 @@ The type of this expression is \end_inset or -\begin_inset Formula $y\Rightarrow y(10)$ +\begin_inset Formula $y\rightarrow y(10)$ \end_inset any further. We conclude that -\begin_inset Formula $y^{:\text{Int}\Rightarrow D}\Rightarrow y(10)$ +\begin_inset Formula $y^{:\text{Int}\rightarrow D}\rightarrow y(10)$ \end_inset is the final simplified form of Eq. @@ -12131,7 +12128,7 @@ noprefix "false" \begin_layout Standard To test this, we first define the function -\begin_inset Formula $f\Rightarrow g\Rightarrow g(f)$ +\begin_inset Formula $f\rightarrow g\rightarrow g(f)$ \end_inset as in Example @@ -12161,11 +12158,11 @@ def q[A, B]: A => (A => B) => B = { f => g => g(f) } \end_inset We also define the function -\begin_inset Formula $h\Rightarrow h(10)$ +\begin_inset Formula $h\rightarrow h(10)$ \end_inset with a general type -\begin_inset Formula $\left(\text{Int}\Rightarrow E\right)\Rightarrow E$ +\begin_inset Formula $\left(\text{Int}\rightarrow E\right)\rightarrow E$ \end_inset , @@ -12272,7 +12269,7 @@ To verify that the function \end_inset indeed equals -\begin_inset Formula $y^{:\text{Int}\Rightarrow D}\Rightarrow y(10)$ +\begin_inset Formula $y^{:\text{Int}\rightarrow D}\rightarrow y(10)$ \end_inset , we apply @@ -12280,7 +12277,7 @@ To verify that the function \end_inset to some functions of type -\begin_inset Formula $\text{Int}\Rightarrow D$ +\begin_inset Formula $\text{Int}\rightarrow D$ \end_inset , say, for @@ -13037,11 +13034,11 @@ noprefix "false" \begin_layout Standard Apply the function -\begin_inset Formula $\left(x\Rightarrow\_\Rightarrow x\right)$ +\begin_inset Formula $\left(x\rightarrow\_\rightarrow x\right)$ \end_inset to the value -\begin_inset Formula $\left(z\Rightarrow z(q)\right)$ +\begin_inset Formula $\left(z\rightarrow z(q)\right)$ \end_inset where @@ -13087,7 +13084,7 @@ Infer types in the following expressions and test in Scala: (a) \series default -\begin_inset Formula $p\Rightarrow q\Rightarrow p(t\Rightarrow t(q))\quad.$ +\begin_inset Formula $p\rightarrow q\rightarrow p(t\rightarrow t(q))\quad.$ \end_inset @@ -13099,7 +13096,7 @@ Infer types in the following expressions and test in Scala: (b) \series default -\begin_inset Formula $p\Rightarrow q\Rightarrow q(x\Rightarrow x(p(q)))\quad.$ +\begin_inset Formula $p\rightarrow q\rightarrow q(x\rightarrow x(p(q)))\quad.$ \end_inset @@ -13136,7 +13133,7 @@ Show that the following expressions cannot be well-typed: (a) \series default -\begin_inset Formula $p\Rightarrow p(q\Rightarrow q(p))\quad.$ +\begin_inset Formula $p\rightarrow p(q\rightarrow q(p))\quad.$ \end_inset @@ -13148,7 +13145,7 @@ Show that the following expressions cannot be well-typed: (b) \series default -\begin_inset Formula $p\Rightarrow q\Rightarrow q(x\Rightarrow p(q(x)))\quad.$ +\begin_inset Formula $p\rightarrow q\rightarrow q(x\rightarrow p(q(x)))\quad.$ \end_inset @@ -13186,7 +13183,7 @@ Infer types and simplify the following code expressions by symbolic calculations (a) \series default -\begin_inset Formula $q\Rightarrow\left(x\Rightarrow y\Rightarrow z\Rightarrow x(z)(y(z))\right)\left(a\Rightarrow a\right)\left(b\Rightarrow b(q)\right)\quad.$ +\begin_inset Formula $q\rightarrow\left(x\rightarrow y\rightarrow z\rightarrow x(z)(y(z))\right)\left(a\rightarrow a\right)\left(b\rightarrow b(q)\right)\quad.$ \end_inset @@ -13198,7 +13195,7 @@ Infer types and simplify the following code expressions by symbolic calculations (b) \series default -\begin_inset Formula $\left(f\Rightarrow g\Rightarrow h\Rightarrow f(g(h))\right)(x\Rightarrow x)\quad.$ +\begin_inset Formula $\left(f\rightarrow g\rightarrow h\rightarrow f(g(h))\right)(x\rightarrow x)\quad.$ \end_inset @@ -13210,7 +13207,7 @@ Infer types and simplify the following code expressions by symbolic calculations (c) \series default -\begin_inset Formula $\left(x\Rightarrow y\Rightarrow x(y)\right)\left(x\Rightarrow y\Rightarrow x\right)\quad.$ +\begin_inset Formula $\left(x\rightarrow y\rightarrow x(y)\right)\left(x\rightarrow y\rightarrow x\right)\quad.$ \end_inset @@ -13222,7 +13219,7 @@ Infer types and simplify the following code expressions by symbolic calculations (d) \series default -\begin_inset Formula $\left(x\Rightarrow y\Rightarrow x(y)\right)\left(x\Rightarrow y\Rightarrow y\right)\quad.$ +\begin_inset Formula $\left(x\rightarrow y\rightarrow x(y)\right)\left(x\rightarrow y\rightarrow y\right)\quad.$ \end_inset @@ -13234,7 +13231,7 @@ Infer types and simplify the following code expressions by symbolic calculations (e) \series default -\begin_inset Formula $x\Rightarrow\left(f\Rightarrow y\Rightarrow f(y)(x)\right)\left(z\Rightarrow\_\Rightarrow z\right)\quad.$ +\begin_inset Formula $x\rightarrow\left(f\rightarrow y\rightarrow f(y)(x)\right)\left(z\rightarrow\_\rightarrow z\right)\quad.$ \end_inset @@ -13246,7 +13243,7 @@ Infer types and simplify the following code expressions by symbolic calculations (f) \series default -\begin_inset Formula $z\Rightarrow\left(x\Rightarrow y\Rightarrow x\right)\left(x\Rightarrow x(z)\right)(y\Rightarrow y(z))\quad.$ +\begin_inset Formula $z\rightarrow\left(x\rightarrow y\rightarrow x\right)\left(x\rightarrow x(z)\right)(y\rightarrow y(z))\quad.$ \end_inset @@ -13611,7 +13608,7 @@ Name shadowing and the scope of bound variables Bound variables are introduced in nameless functions whenever an argument is defined. For example, in the curried nameless function -\begin_inset Formula $x\Rightarrow y\Rightarrow x+y$ +\begin_inset Formula $x\rightarrow y\rightarrow x+y$ \end_inset , the bound variables are the curried arguments @@ -13628,7 +13625,7 @@ Bound variables are introduced in nameless functions whenever an argument \end_inset is only defined within the scope -\begin_inset Formula $\left(y\Rightarrow x+y\right)$ +\begin_inset Formula $\left(y\rightarrow x+y\right)$ \end_inset of the inner function; the variable @@ -13636,7 +13633,7 @@ Bound variables are introduced in nameless functions whenever an argument \end_inset is defined within the entire scope of -\begin_inset Formula $x\Rightarrow y\Rightarrow x+y$ +\begin_inset Formula $x\rightarrow y\rightarrow x+y$ \end_inset . @@ -13835,22 +13832,22 @@ name shadowing Consider the nameless function \begin_inset Formula \[ -x\Rightarrow x\Rightarrow x\quad, +x\rightarrow x\rightarrow x\quad, \] \end_inset and let us decipher this confusing syntax. The symbol -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset groups to the right, so -\begin_inset Formula $x\Rightarrow x\Rightarrow x$ +\begin_inset Formula $x\rightarrow x\rightarrow x$ \end_inset is the same as -\begin_inset Formula $x\Rightarrow\left(x\Rightarrow x\right)$ +\begin_inset Formula $x\rightarrow\left(x\rightarrow x\right)$ \end_inset . @@ -13859,22 +13856,22 @@ and let us decipher this confusing syntax. \end_inset and returns -\begin_inset Formula $x\Rightarrow x$ +\begin_inset Formula $x\rightarrow x$ \end_inset . Since the nameless function -\begin_inset Formula $\left(x\Rightarrow x\right)$ +\begin_inset Formula $\left(x\rightarrow x\right)$ \end_inset may be renamed to -\begin_inset Formula $\left(y\Rightarrow y\right)$ +\begin_inset Formula $\left(y\rightarrow y\right)$ \end_inset without changing its value, we can rewrite the code to \begin_inset Formula \[ -x\Rightarrow\left(y\Rightarrow y\right)\quad. +x\rightarrow\left(y\rightarrow y\right)\quad. \] \end_inset @@ -13887,16 +13884,16 @@ Having removed name shadowing, we can more easily understand this code and \end_inset and always returns the same value (the identity function -\begin_inset Formula $y\Rightarrow y$ +\begin_inset Formula $y\rightarrow y$ \end_inset ). So we can rewrite -\begin_inset Formula $\left(x\Rightarrow x\Rightarrow x\right)$ +\begin_inset Formula $\left(x\rightarrow x\rightarrow x\right)$ \end_inset as -\begin_inset Formula $\left(\_\Rightarrow y\Rightarrow y\right)$ +\begin_inset Formula $\left(\_\rightarrow y\rightarrow y\right)$ \end_inset , which is clearer. @@ -14044,11 +14041,11 @@ The conventions for nameless functions in the operator syntax become: \begin_layout Itemize Function expressions group to the right, so -\begin_inset Formula $x\Rightarrow y\Rightarrow z\Rightarrow e$ +\begin_inset Formula $x\rightarrow y\rightarrow z\rightarrow e$ \end_inset means -\begin_inset Formula $x\Rightarrow\left(y\Rightarrow\left(z\Rightarrow e\right)\right)$ +\begin_inset Formula $x\rightarrow\left(y\rightarrow\left(z\rightarrow e\right)\right)$ \end_inset . @@ -14116,11 +14113,11 @@ Function applications group stronger than infix operations, so \begin_layout Standard Thus, -\begin_inset Formula $x\Rightarrow y\Rightarrow a\,b\,c+p\,q$ +\begin_inset Formula $x\rightarrow y\rightarrow a\,b\,c+p\,q$ \end_inset means -\begin_inset Formula $x\Rightarrow\left(y\Rightarrow\left(\left(a\,b\right)\,c\right)+(p\,q)\right)$ +\begin_inset Formula $x\rightarrow\left(y\rightarrow\left(\left(a\,b\right)\,c\right)+(p\,q)\right)$ \end_inset . @@ -14130,11 +14127,11 @@ Thus, \end_inset to write -\begin_inset Formula $f(x\Rightarrow g\,h)$ +\begin_inset Formula $f(x\rightarrow g\,h)$ \end_inset instead of -\begin_inset Formula $f\,x\Rightarrow g\,h$ +\begin_inset Formula $f\,x\rightarrow g\,h$ \end_inset . @@ -15112,11 +15109,11 @@ In the inner scope, we need to compute a value of type \end_inset , -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset , and -\begin_inset Formula $g^{:B\Rightarrow C}$ +\begin_inset Formula $g^{:B\rightarrow C}$ \end_inset . diff --git a/sofp-src/sofp-higher-order-functions.tex b/sofp-src/sofp-higher-order-functions.tex index b2692b306..ba110a6bb 100644 --- a/sofp-src/sofp-higher-order-functions.tex +++ b/sofp-src/sofp-higher-order-functions.tex @@ -501,7 +501,7 @@ \subsection{Examples. Function composition\label{subsec:Examples-of-fully-parame The forward composition is denoted by $\bef$ (pronounced ``before'') and can be defined as \begin{equation} -f\bef g\triangleq\left(x\Rightarrow g(f(x))\right)\quad.\label{eq:def-of-forward-composition} +f\bef g\triangleq\left(x\rightarrow g(f(x))\right)\quad.\label{eq:def-of-forward-composition} \end{equation} The symbol $\triangleq$ means ``is defined as''. @@ -521,7 +521,7 @@ \subsection{Examples. Function composition\label{subsec:Examples-of-fully-parame is applied and then $f$ is applied to the result. Using the symbol $\circ$ (pronounced ``after'') for this operation, we can write \begin{equation} -f\circ g\triangleq\left(x\Rightarrow f(g(x))\right)\quad.\label{eq:def-of-backward-composition} +f\circ g\triangleq\left(x\rightarrow f(g(x))\right)\quad.\label{eq:def-of-backward-composition} \end{equation} In Scala, the backward composition is called \lstinline!compose! and used as \lstinline!f compose g!. This method may be implemented @@ -585,23 +585,23 @@ \subsection{Laws of function composition\label{subsec:Laws-of-function-compositi must be set for the laws to have consistently matching types. The laws must hold for an arbitrary function $f$. So we may assume -that $f$ has the type signature $A\Rightarrow B$, where $A$ and +that $f$ has the type signature $A\rightarrow B$, where $A$ and $B$ are arbitrary type parameters. Consider the left identity law. The function $\left(\text{id}\bef f\right)$ is, by definition~(\ref{eq:def-of-forward-composition}), a function that takes an argument $x$, applies $\text{id}$ to that $x$, and then applies $f$ to the result: \[ -\text{id}\bef f=\left(x\Rightarrow f(\text{id}(x))\right)\quad. +\text{id}\bef f=\left(x\rightarrow f(\text{id}(x))\right)\quad. \] -If $f$ has type $A\Rightarrow B$, its argument must be of type $A$, +If $f$ has type $A\rightarrow B$, its argument must be of type $A$, or else the types will not match. Therefore, the identity function -must have type $A\Rightarrow A$, and the argument $x$ must have +must have type $A\rightarrow A$, and the argument $x$ must have type $A$. With these choices of the type parameters, the function -$\left(x\Rightarrow f(\text{id}(x))\right)$ will have type $A\Rightarrow B$, +$\left(x\rightarrow f(\text{id}(x))\right)$ will have type $A\rightarrow B$, as it must since the right-hand side of the law is $f$. We add type annotations to the code as \emph{superscripts}, \[ -\text{id}^{A}\bef f^{:A\Rightarrow B}=\big(x^{:A}\Rightarrow f(\text{id}(x))\big)^{:A\Rightarrow B}\quad. +\text{id}^{A}\bef f^{:A\rightarrow B}=\big(x^{:A}\rightarrow f(\text{id}(x))\big)^{:A\rightarrow B}\quad. \] In the Scala syntax, this formula may be written as \begin{lstlisting} @@ -617,32 +617,32 @@ \subsection{Laws of function composition\label{subsec:Laws-of-function-compositi a colon, such as $\text{id}^{A}$, denote type parameters, as in Scala code \lstinline!identity[A]!. Since the function \lstinline!identity[A]! has type \lstinline!A => A!, we can write $\text{id}^{A}$ or equivalently -(but more verbosely) $\text{id}^{:A\Rightarrow A}$ to denote that +(but more verbosely) $\text{id}^{:A\rightarrow A}$ to denote that function. By definition of the identity function, we have $\text{id}(x)=x$, and so \[ -\text{id}\bef f=\left(x\Rightarrow f(\text{id}(x))\right)=\left(x\Rightarrow f(x)\right)=f\quad. +\text{id}\bef f=\left(x\rightarrow f(\text{id}(x))\right)=\left(x\rightarrow f(x)\right)=f\quad. \] -The last step works since $x\Rightarrow f(x)$ is a function taking -an argument $x$ and applying $f$ to that argument; i.e.~$x\Rightarrow f(x)$ +The last step works since $x\rightarrow f(x)$ is a function taking +an argument $x$ and applying $f$ to that argument; i.e.~$x\rightarrow f(x)$ is the same function as $f$. Now consider the right identity law: \[ -f\bef\text{id}=\left(x\Rightarrow\text{id}(f(x))\right)\quad. +f\bef\text{id}=\left(x\rightarrow\text{id}(f(x))\right)\quad. \] -To make the types match, assume that $f^{:A\Rightarrow B}$. Then +To make the types match, assume that $f^{:A\rightarrow B}$. Then $x$ must have type $A$, and the identity function must have type -$B\Rightarrow B$. The result of $\text{id}(f(x))$ will also have +$B\rightarrow B$. The result of $\text{id}(f(x))$ will also have type $B$. With these choices of type parameters, all types match: \[ -f^{:A\Rightarrow B}\bef\text{id}^{B}=\big(x^{:A}\Rightarrow\text{id}(f(x))\big)^{:A\Rightarrow B}\quad. +f^{:A\rightarrow B}\bef\text{id}^{B}=\big(x^{:A}\rightarrow\text{id}(f(x))\big)^{:A\rightarrow B}\quad. \] Since $\text{id}(f(x))=f(x)$, we find that \[ -f\bef\text{id}=\left(x\Rightarrow f(x)\right)=f\quad. +f\bef\text{id}=\left(x\rightarrow f(x)\right)=f\quad. \] In this way, we have demonstrated that both identity laws hold. @@ -652,22 +652,22 @@ \subsection{Laws of function composition\label{subsec:Laws-of-function-compositi \end{align} Let us verify that the types match here. The types of the functions $f$, $g$, and $h$ must be such that all the function compositions -exist. If $f$ has type $A\Rightarrow B$ for some type parameters +exist. If $f$ has type $A\rightarrow B$ for some type parameters $A$ and $B$, then the argument of $g$ must be of type $B$; so -we can choose $g^{:B\Rightarrow C}$, where $C$ is another type parameter. -The composition $f\bef g$ has type $A\Rightarrow C$, so $h$ must -have type $C\Rightarrow D$ for some type $D$. Assuming the types -as $f^{:A\Rightarrow B}$, $g^{:B\Rightarrow C}$, and $h^{:C\Rightarrow D}$, +we can choose $g^{:B\rightarrow C}$, where $C$ is another type parameter. +The composition $f\bef g$ has type $A\rightarrow C$, so $h$ must +have type $C\rightarrow D$ for some type $D$. Assuming the types +as $f^{:A\rightarrow B}$, $g^{:B\rightarrow C}$, and $h^{:C\rightarrow D}$, we find that the types in all the compositions $f\bef g$, $g\bef h$, $(f\bef g)\bef h$, and $f\bef(g\bef h)$ match. We can rewrite Eq.~(\ref{eq:associativity-of-function-composition}) with type annotations, \begin{equation} -(f^{:A\Rightarrow B}\bef g^{:B\Rightarrow C})\bef h^{:C\Rightarrow D}=f^{:A\Rightarrow B}\bef(g^{:B\Rightarrow C}\bef h^{:C\Rightarrow D})\quad.\label{eq:associativity-law-for-function-composition-with-types} +(f^{:A\rightarrow B}\bef g^{:B\rightarrow C})\bef h^{:C\rightarrow D}=f^{:A\rightarrow B}\bef(g^{:B\rightarrow C}\bef h^{:C\rightarrow D})\quad.\label{eq:associativity-law-for-function-composition-with-types} \end{equation} Having checked the types, we are ready to prove the associativity law. We note that both sides of the law~(\ref{eq:associativity-law-for-function-composition-with-types}) -are functions of type $A\Rightarrow D$. To prove that two functions +are functions of type $A\rightarrow D$. To prove that two functions are equal means to prove that they always return the same results when applied to the same arguments. So we need to apply both sides of Eq.~(\ref{eq:associativity-law-for-function-composition-with-types}) @@ -702,7 +702,7 @@ \subsection{Laws of function composition\label{subsec:Laws-of-function-compositi \[ f\bef g=g\circ f \] -for any functions $f^{:A\Rightarrow B}$ and $g^{:B\Rightarrow C}$. +for any functions $f^{:A\rightarrow B}$ and $g^{:B\rightarrow C}$. Let us see how to prove the composition laws in the backward notation. We will just need to reverse the order of function compositions in the proofs above. @@ -713,17 +713,17 @@ \subsection{Laws of function composition\label{subsec:Laws-of-function-compositi \] To match the types, we need to choose the type parameters as \[ -f^{:A\Rightarrow B}\circ\text{id}^{:A\Rightarrow A}=f^{:A\Rightarrow B}\quad\quad,\quad\text{id}^{B\Rightarrow B}\circ f^{:A\Rightarrow B}=f^{:A\Rightarrow B}\quad. +f^{:A\rightarrow B}\circ\text{id}^{:A\rightarrow A}=f^{:A\rightarrow B}\quad\quad,\quad\text{id}^{B\rightarrow B}\circ f^{:A\rightarrow B}=f^{:A\rightarrow B}\quad. \] We can apply both sides of the laws to an arbitrary value $x^{:A}$. For the left identity law, we find from definition~(\ref{eq:def-of-backward-composition}) that \[ -f\circ\text{id}=\left(x\Rightarrow f(\text{id}(x))\right)=\left(x\Rightarrow f(x)\right)=f\quad. +f\circ\text{id}=\left(x\rightarrow f(\text{id}(x))\right)=\left(x\rightarrow f(x)\right)=f\quad. \] Similarly for the right identity law, \[ -\text{id}\circ f=\left(x\Rightarrow\text{id}\left(f\left(x\right)\right)\right)=\left(x\Rightarrow f\left(x\right)\right)=f\quad. +\text{id}\circ f=\left(x\rightarrow\text{id}\left(f\left(x\right)\right)\right)=\left(x\rightarrow f\left(x\right)\right)=f\quad. \] The associativity law, \[ @@ -735,14 +735,14 @@ \subsection{Laws of function composition\label{subsec:Laws-of-function-compositi \left(h\circ\left(g\circ f\right)\right)(x) & =h\left(\left(g\circ f\right)(x)\right)=h\left(g\left(f\left(x\right)\right)\right)\quad,\\ \left(\left(h\circ g\right)\circ f\right)(x) & =\left(h\circ g\right)\left(f(x)\right)=h\left(g\left(f\left(x\right)\right)\right)\quad. \end{align*} -The types are checked by assuming that $f$ has the type $f^{:A\Rightarrow B}$. -The types in $g\circ f$ match only when $g^{:B\Rightarrow C}$, and -then $g\circ f$ is of type $A\Rightarrow C$. The type of $h$ must -be $h^{:C\Rightarrow D}$ for the types in $h\circ\left(g\circ f\right)$ +The types are checked by assuming that $f$ has the type $f^{:A\rightarrow B}$. +The types in $g\circ f$ match only when $g^{:B\rightarrow C}$, and +then $g\circ f$ is of type $A\rightarrow C$. The type of $h$ must +be $h^{:C\rightarrow D}$ for the types in $h\circ\left(g\circ f\right)$ to match. We can write the associativity law with type annotations as \begin{equation} -h^{:C\Rightarrow D}\circ(g^{:B\Rightarrow C}\circ f^{A\Rightarrow B})=(h^{:C\Rightarrow D}\circ g^{:B\Rightarrow C})\circ f^{:A\Rightarrow B}\quad.\label{eq:assoc-law-for-composition-with-types-backward} +h^{:C\rightarrow D}\circ(g^{:B\rightarrow C}\circ f^{A\rightarrow B})=(h^{:C\rightarrow D}\circ g^{:B\rightarrow C})\circ f^{:A\rightarrow B}\quad.\label{eq:assoc-law-for-composition-with-types-backward} \end{equation} The associativity law allows us to omit parentheses in the expression $h\circ g\circ f$. @@ -825,12 +825,12 @@ \subsection{Calculations with curried functions} In mathematics, functions are evaluated by substituting their argument values into their body. Nameless functions are evaluated in the same -way. For example, applying the nameless function $x\Rightarrow x+10$ +way. For example, applying the nameless function $x\rightarrow x+10$ to an integer $2$, we substitute $2$ instead of $x$ in \textquotedblleft $x+10$\textquotedblright{} and get \textquotedblleft $2+10$\textquotedblright , which we then evaluate to $12$. The computation is written like this, \[ -(x\Rightarrow x+10)(2)=2+10=12\quad. +(x\rightarrow x+10)(2)=2+10=12\quad. \] To run this computation in Scala, we need to add a type annotation: \begin{lstlisting} @@ -880,14 +880,14 @@ \subsection{Calculations with curried functions} To make calculations shorter, we will write code in a mathematical notation rather than in the Scala syntax. Type annotations are written -with a colon in the superscript, for example: $x^{:\text{Int}}\Rightarrow x+10$ +with a colon in the superscript, for example: $x^{:\text{Int}}\rightarrow x+10$ instead of the code \lstinline!((x:Int) => x + 10)!. The symbolic evaluation of the Scala code \lstinline!((x:Int) => (y:Int) => x - y)(20)(4)! can be written as \begin{align*} - & (\gunderline{x^{:\text{Int}}\Rightarrow}\,y^{:\text{Int}}\Rightarrow\gunderline x-y)\left(20\right)\left(4\right)\\ -{\color{greenunder}\text{apply function and substitute }x=20:}\quad & =(\gunderline{y^{:\text{Int}}\Rightarrow}\,20-\gunderline y)\left(4\right)\\ + & (\gunderline{x^{:\text{Int}}\rightarrow}\,y^{:\text{Int}}\rightarrow\gunderline x-y)\left(20\right)\left(4\right)\\ +{\color{greenunder}\text{apply function and substitute }x=20:}\quad & =(\gunderline{y^{:\text{Int}}\rightarrow}\,20-\gunderline y)\left(4\right)\\ {\color{greenunder}\text{apply function and substitute }y=4:}\quad & =20-4=16\quad. \end{align*} In the above step-by-step calculation, the colored underlines and @@ -901,18 +901,18 @@ \subsection{Calculations with curried functions} Nameless functions are \emph{values} and so can be used as part of larger expressions, just as any other values. For instance, nameless functions can be arguments of other functions (nameless or not). Here -is an example of applying a nameless function $f\Rightarrow f(2)$ -to a nameless function $x\Rightarrow x+4$: +is an example of applying a nameless function $f\rightarrow f(2)$ +to a nameless function $x\rightarrow x+4$: \begin{align*} - & (\gunderline f\Rightarrow\gunderline f(2))\left(x\Rightarrow x+4\right)\\ -{\color{greenunder}\text{substitute }f=\left(x\Rightarrow x+4\right):}\quad & =(\gunderline x\Rightarrow\gunderline x+4)(2)\\ + & (\gunderline f\rightarrow\gunderline f(2))\left(x\rightarrow x+4\right)\\ +{\color{greenunder}\text{substitute }f=\left(x\rightarrow x+4\right):}\quad & =(\gunderline x\rightarrow\gunderline x+4)(2)\\ {\color{greenunder}\text{substitute }x=2:}\quad & =2+4=6\quad. \end{align*} -In the nameless function $f\Rightarrow f(2)$, the argument $f$ has +In the nameless function $f\rightarrow f(2)$, the argument $f$ has to be itself a function, otherwise the expression $f(2)$ would make no sense. The argument $x$ of $f(x)$ must be an integer, or else we would not be able to compute $x+4$. The result of computing $f(2)$ -is $4$, an integer. We conclude that $f$ must have type $\text{Int}\Rightarrow\text{Int}$, +is $4$, an integer. We conclude that $f$ must have type $\text{Int}\rightarrow\text{Int}$, or else the types will not match. To verify this result in Scala, we need to specify a type annotation for $f$: @@ -925,14 +925,14 @@ \subsection{Calculations with curried functions} \vspace{-0.75\baselineskip} \end{wrapfigure}% -\noindent No type annotation is needed for $x\Rightarrow x+4$ since +\noindent No type annotation is needed for $x\rightarrow x+4$ since the Scala compiler already knows the type of $f$ and can figure out -that $x$ in $x\Rightarrow x+4$ must have type \lstinline!Int!. +that $x$ in $x\rightarrow x+4$ must have type \lstinline!Int!. To summarize the syntax conventions for curried nameless functions: \begin{itemize} -\item Function expressions group everything to the right: $x\Rightarrow y\Rightarrow z\Rightarrow e$ -means $x\Rightarrow\left(y\Rightarrow\left(z\Rightarrow e\right)\right)$. +\item Function expressions group everything to the right: $x\rightarrow y\rightarrow z\rightarrow e$ +means $x\rightarrow\left(y\rightarrow\left(z\rightarrow e\right)\right)$. \item Function applications group everything to the left, so $f(x)(y)(z)$ means $\big((f(x))(y)\big)(z)$. \item Function applications group stronger than infix operations, so $x+f(y)$ @@ -942,12 +942,12 @@ \subsection{Calculations with curried functions} Types are omitted for brevity; every non-function value is of type \texttt{}\lstinline!Int!. \begin{align*} -\left(x\Rightarrow x*2\right)(10) & =10*2=20\quad.\\ -\left(p\Rightarrow z\Rightarrow z*p\right)\left(t\right) & =(z\Rightarrow z*t)\quad.\\ -\left(p\Rightarrow z\Rightarrow z*p\right)(t)(4) & =(z\Rightarrow z*t)(4)=4*t\quad. +\left(x\rightarrow x*2\right)(10) & =10*2=20\quad.\\ +\left(p\rightarrow z\rightarrow z*p\right)\left(t\right) & =(z\rightarrow z*t)\quad.\\ +\left(p\rightarrow z\rightarrow z*p\right)(t)(4) & =(z\rightarrow z*t)(4)=4*t\quad. \end{align*} Some results of these computation are integer values such as $20$; -other results are nameless functions such as $z\Rightarrow z*t$. +other results are nameless functions such as $z\rightarrow z*t$. Verify this in Scala: \begin{lstlisting} scala> ((x:Int) => x*2)(10) @@ -961,21 +961,21 @@ \subsection{Calculations with curried functions} \end{lstlisting} In the following examples, some arguments are themselves functions. -Consider an expression that uses the nameless function $\left(g\Rightarrow g(2)\right)$ +Consider an expression that uses the nameless function $\left(g\rightarrow g(2)\right)$ as an argument: \begin{align} - & (\gunderline f\Rightarrow p\Rightarrow\gunderline f(p))\left(g\Rightarrow g(2)\right)\label{eq:higher-order-functions-derivation0}\\ -{\color{greenunder}\text{substitute }f=\left(g\Rightarrow g(2)\right):}\quad & =p\Rightarrow(\gunderline g\Rightarrow\gunderline g(2))\,(p)\nonumber \\ -{\color{greenunder}\text{substitute }g=p:}\quad & =p\Rightarrow p(2)\quad.\label{eq:higher-order-functions-derivation1} + & (\gunderline f\rightarrow p\rightarrow\gunderline f(p))\left(g\rightarrow g(2)\right)\label{eq:higher-order-functions-derivation0}\\ +{\color{greenunder}\text{substitute }f=\left(g\rightarrow g(2)\right):}\quad & =p\rightarrow(\gunderline g\rightarrow\gunderline g(2))\,(p)\nonumber \\ +{\color{greenunder}\text{substitute }g=p:}\quad & =p\rightarrow p(2)\quad.\label{eq:higher-order-functions-derivation1} \end{align} -The result of this expression is a function $p\Rightarrow p(2)$ that +The result of this expression is a function $p\rightarrow p(2)$ that will apply \emph{its} argument $p$ to the value $2$. A possible -value for $p$ is the function $x\Rightarrow x+4$. So, let us apply +value for $p$ is the function $x\rightarrow x+4$. So, let us apply Eq.~(\ref{eq:higher-order-functions-derivation0}) to that function: \begin{align*} - & \gunderline{\left(f\Rightarrow p\Rightarrow f(p)\right)\left(g\Rightarrow g(2)\right)}\left(x\Rightarrow x+4\right)\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:higher-order-functions-derivation1})}:}\quad & =(\gunderline p\Rightarrow\gunderline p(2))\left(x\Rightarrow x+4\right)\\ -{\color{greenunder}\text{substitute }p=\left(x\Rightarrow x+4\right):}\quad & =(\gunderline x\Rightarrow\gunderline x+4)\left(2\right)\\ + & \gunderline{\left(f\rightarrow p\rightarrow f(p)\right)\left(g\rightarrow g(2)\right)}\left(x\rightarrow x+4\right)\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:higher-order-functions-derivation1})}:}\quad & =(\gunderline p\rightarrow\gunderline p(2))\left(x\rightarrow x+4\right)\\ +{\color{greenunder}\text{substitute }p=\left(x\rightarrow x+4\right):}\quad & =(\gunderline x\rightarrow\gunderline x+4)\left(2\right)\\ {\color{greenunder}\text{substitute }x=2:}\quad & =2+4=6\quad. \end{align*} @@ -983,24 +983,24 @@ \subsection{Calculations with curried functions} annotations for $f$ and $p$. To figure out the types, we reason like this: -We know that the function $f\Rightarrow p\Rightarrow f(p)$ is being -applied to the arguments $f=\left(g\Rightarrow g(2)\right)$ and $p=\left(x\Rightarrow x+4\right)$. -So, the argument $f$ in $f\Rightarrow p\Rightarrow f(p)$ must be +We know that the function $f\rightarrow p\rightarrow f(p)$ is being +applied to the arguments $f=\left(g\rightarrow g(2)\right)$ and $p=\left(x\rightarrow x+4\right)$. +So, the argument $f$ in $f\rightarrow p\rightarrow f(p)$ must be a function that takes $p$ as an argument. -The variable $x$ in $x\Rightarrow x+4$ must be of type \lstinline!Int!, +The variable $x$ in $x\rightarrow x+4$ must be of type \lstinline!Int!, or else we cannot add $x$ to $4$. Thus, the type of the expression -$x\Rightarrow x+4$ is $\text{Int}\Rightarrow\text{Int}$, and so -must be the type of the argument $p$. We write $p^{:\text{Int}\Rightarrow\text{Int}}$. +$x\rightarrow x+4$ is $\text{Int}\rightarrow\text{Int}$, and so +must be the type of the argument $p$. We write $p^{:\text{Int}\rightarrow\text{Int}}$. Finally, we need to make sure that the types match in the function -$f\Rightarrow p\Rightarrow f(p)$. Types match in $f(p)$ if the type -of $f$'s argument is the same as the type of $p$, which is $\text{Int}\Rightarrow\text{Int}$. -So $f$'s type must be $\left(\text{Int}\Rightarrow\text{Int}\right)\Rightarrow A$ -for some type $A$. Since in our example $f=\left(g\Rightarrow g(2)\right)$, -types match only if $g$ has type $\text{Int}\Rightarrow\text{Int}$. +$f\rightarrow p\rightarrow f(p)$. Types match in $f(p)$ if the type +of $f$'s argument is the same as the type of $p$, which is $\text{Int}\rightarrow\text{Int}$. +So $f$'s type must be $\left(\text{Int}\rightarrow\text{Int}\right)\rightarrow A$ +for some type $A$. Since in our example $f=\left(g\rightarrow g(2)\right)$, +types match only if $g$ has type $\text{Int}\rightarrow\text{Int}$. But then $g(2)$ has type $\text{Int}$, and so we must have $A=\text{Int}$. -Thus, the type of $f$ is $\left(\text{Int}\Rightarrow\text{Int}\right)\Rightarrow\text{Int}$. +Thus, the type of $f$ is $\left(\text{Int}\rightarrow\text{Int}\right)\rightarrow\text{Int}$. We know enough to write the Scala code now: \begin{wrapfigure}{l}{0.69\columnwidth}% @@ -1046,27 +1046,27 @@ \subsubsection{Example \label{subsec:Example-hof-derive-types-1}\ref{subsec:Exam as values, since our goal is to apply \lstinline!const! to \lstinline!id!. Write the code of these functions in a short notation: \begin{align*} -\text{const}^{C,X} & \triangleq(c^{:C}\Rightarrow\_^{:X}\Rightarrow c)\quad,\\ -\text{id}^{A} & \triangleq(a^{:A}\Rightarrow a)\quad. +\text{const}^{C,X} & \triangleq(c^{:C}\rightarrow\_^{:X}\rightarrow c)\quad,\\ +\text{id}^{A} & \triangleq(a^{:A}\rightarrow a)\quad. \end{align*} The types will match in the expression \lstinline!const(id)! only if the argument of the function \lstinline!const! has the same type as the type of \lstinline!id!. Since ``$\text{const}$'' is a curried function, we need to look at its \emph{first} curried argument, which -is of type $C$. The type of $\text{id}$ is $A\Rightarrow A$, where +is of type $C$. The type of $\text{id}$ is $A\rightarrow A$, where $A$ is an arbitrary type so far. So, the type parameter $C$ in $\text{const}^{C,X}$ -must be equal to $A\Rightarrow A$: +must be equal to $A\rightarrow A$: \[ -C=A\Rightarrow A\quad. +C=A\rightarrow A\quad. \] The type parameter $X$ in $\text{const}^{C,X}$ is not constrained, so we keep it as $X$. The result of applying \lstinline!const! to -\lstinline!id! is of type $X\Rightarrow C$, which equals $X\Rightarrow A\Rightarrow A$. +\lstinline!id! is of type $X\rightarrow C$, which equals $X\rightarrow A\rightarrow A$. In this way, we find \[ -\text{const}^{A\Rightarrow A,X}(\text{id}^{A}):X\Rightarrow A\Rightarrow A\quad. +\text{const}^{A\rightarrow A,X}(\text{id}^{A}):X\rightarrow A\rightarrow A\quad. \] -The types $A$ and $X$ can be arbitrary. The type $X\Rightarrow A\Rightarrow A$ +The types $A$ and $X$ can be arbitrary. The type $X\rightarrow A\rightarrow A$ is the most general type for the expression \lstinline!const(id)! because we have not made any assumptions about the types except requiring that all functions must be always applied to arguments of the correct @@ -1077,17 +1077,17 @@ \subsubsection{Example \label{subsec:Example-hof-derive-types-1}\ref{subsec:Exam checked the types, we may omit all type annotations: \begin{align*} & \gunderline{\text{const}}\left(\text{id}\right)\\ -{\color{greenunder}\text{definition of const}:}\quad & =(\gunderline c\Rightarrow x\Rightarrow\gunderline c)(\text{id})\\ -{\color{greenunder}\text{apply function, substitute }c=\text{id}:}\quad & =(x\Rightarrow\gunderline{\text{id}})\\ -{\color{greenunder}\text{definition of }\text{id}:}\quad & =\left(x\Rightarrow a\Rightarrow a\right)\quad. +{\color{greenunder}\text{definition of const}:}\quad & =(\gunderline c\rightarrow x\rightarrow\gunderline c)(\text{id})\\ +{\color{greenunder}\text{apply function, substitute }c=\text{id}:}\quad & =(x\rightarrow\gunderline{\text{id}})\\ +{\color{greenunder}\text{definition of }\text{id}:}\quad & =\left(x\rightarrow a\rightarrow a\right)\quad. \end{align*} -The function $\left(x\Rightarrow a\Rightarrow a\right)$ takes an -argument $x^{:X}$ and returns the identity function $a^{:A}\Rightarrow a$. +The function $\left(x\rightarrow a\rightarrow a\right)$ takes an +argument $x^{:X}$ and returns the identity function $a^{:A}\rightarrow a$. It is clear that the argument $x$ is ignored by this function, so we can rewrite it equivalently as \[ -\text{const}\left(\text{id}\right)=(\_^{:X}\Rightarrow a^{:A}\Rightarrow a)\quad. +\text{const}\left(\text{id}\right)=(\_^{:X}\rightarrow a^{:A}\rightarrow a)\quad. \] @@ -1143,14 +1143,14 @@ \subsubsection{Example \label{subsec:Example-hof-derive-types-2}\ref{subsec:Exam \noindent To determine the type signature and the possible type parameters $A$, $B$, ..., we need to determine the most general type that matches -the function body. The function body is the expression $x\Rightarrow f(f(x))$. +the function body. The function body is the expression $x\rightarrow f(f(x))$. Assume that $x$ has type $A$; for types to match in the sub-expression -$f(x)$, we need $f$ to have type $A\Rightarrow B$ for some type +$f(x)$, we need $f$ to have type $A\rightarrow B$ for some type $B$. The sub-expression $f(x)$ will then have type $B$. For types to match in $f(f(x))$, the argument of $f$ must have type $B$; -but we already assumed $f^{:A\Rightarrow B}$. This is consistent -only if $A=B$. In this way, $x^{:A}$ implies $f^{:A\Rightarrow A}$, -and the expression $x\Rightarrow f(f(x))$ has type $A\Rightarrow A$. +but we already assumed $f^{:A\rightarrow B}$. This is consistent +only if $A=B$. In this way, $x^{:A}$ implies $f^{:A\rightarrow A}$, +and the expression $x\rightarrow f(f(x))$ has type $A\rightarrow A$. We can now write the type signature of \lstinline!twice!, \begin{wrapfigure}{l}{0.51\columnwidth}% @@ -1165,13 +1165,13 @@ \subsubsection{Example \label{subsec:Example-hof-derive-types-2}\ref{subsec:Exam type parameter, $A$, and can be equivalently written in the code notation as \begin{equation} -\text{twice}^{A}\triangleq f^{:A\Rightarrow A}\Rightarrow x^{:A}\Rightarrow f(f(x))=(f^{:A\Rightarrow A}\Rightarrow f\bef f)\quad.\label{eq:hof-def-of-twice-in-math-notation} +\text{twice}^{A}\triangleq f^{:A\rightarrow A}\rightarrow x^{:A}\rightarrow f(f(x))=(f^{:A\rightarrow A}\rightarrow f\bef f)\quad.\label{eq:hof-def-of-twice-in-math-notation} \end{equation} The procedure of deriving the most general type for a given code is called \textbf{type inference}\index{type inference}. In Example~\ref{subsec:Example-hof-derive-types-2}, -the presence of the type parameter $A$ and the type signature $\left(A\Rightarrow A\right)\Rightarrow A\Rightarrow A$ -have been ``inferred'' from the code $f\Rightarrow x\Rightarrow f(f(x))$. +the presence of the type parameter $A$ and the type signature $\left(A\rightarrow A\right)\rightarrow A\rightarrow A$ +have been ``inferred'' from the code $f\rightarrow x\rightarrow f(f(x))$. \subsubsection{Example \label{subsec:Example-hof-derive-types-3}\ref{subsec:Example-hof-derive-types-3}} @@ -1185,17 +1185,17 @@ \subsubsection{Example \label{subsec:Example-hof-derive-types-3}\ref{subsec:Exam Begin by figuring out the required type of \lstinline!twice(twice)!. We introduce unknown type parameters as \lstinline!twice[A](twice[B])!. -The function \lstinline!twice[A]! of type $\left(A\Rightarrow A\right)\Rightarrow A\Rightarrow A$ +The function \lstinline!twice[A]! of type $\left(A\rightarrow A\right)\rightarrow A\rightarrow A$ can be applied to the argument \lstinline!twice[B]! only if \lstinline!twice[B]! -has type $A\Rightarrow A$. But \lstinline!twice[B]! is of type $\left(B\Rightarrow B\right)\Rightarrow B\Rightarrow B$. -Since the symbol $\Rightarrow$ groups to the right, we have +has type $A\rightarrow A$. But \lstinline!twice[B]! is of type $\left(B\rightarrow B\right)\rightarrow B\rightarrow B$. +Since the symbol $\rightarrow$ groups to the right, we have \[ -\left(B\Rightarrow B\right)\Rightarrow B\Rightarrow B=\left(B\Rightarrow B\right)\Rightarrow\left(B\Rightarrow B\right)\quad. +\left(B\rightarrow B\right)\rightarrow B\rightarrow B=\left(B\rightarrow B\right)\rightarrow\left(B\rightarrow B\right)\quad. \] -This can match with $A\Rightarrow A$ only if we set $A=\left(B\Rightarrow B\right)$. +This can match with $A\rightarrow A$ only if we set $A=\left(B\rightarrow B\right)$. So the most general type of \lstinline!twice(twice)! is \begin{equation} -\text{twice}^{B\Rightarrow B}(\text{twice}^{B}):\left(B\Rightarrow B\right)\Rightarrow B\Rightarrow B\quad.\label{eq:hof-twice-example-solved3} +\text{twice}^{B\rightarrow B}(\text{twice}^{B}):\left(B\rightarrow B\right)\rightarrow B\rightarrow B\quad.\label{eq:hof-twice-example-solved3} \end{equation} After checking that types match, we may omit types from further calculations. @@ -1216,31 +1216,31 @@ \subsubsection{Example \label{subsec:Example-hof-derive-types-3}\ref{subsec:Exam into the expression \lstinline!twice(twice)!, we find \begin{align*} & \text{twice}(\text{twice})=\text{twice}\bef\text{twice}\\ -{\color{greenunder}\text{expand function composition}:}\quad & =f\Rightarrow\text{twice}(\gunderline{\text{twice}}(f))\quad.\\ -{\color{greenunder}\text{definition of }\text{twice}(f):}\quad & =f\Rightarrow\gunderline{\text{twice}}(f\bef f)\\ -{\color{greenunder}\text{definition of twice}:}\quad & =f\Rightarrow f\bef f\bef f\bef f\quad. +{\color{greenunder}\text{expand function composition}:}\quad & =f\rightarrow\text{twice}(\gunderline{\text{twice}}(f))\quad.\\ +{\color{greenunder}\text{definition of }\text{twice}(f):}\quad & =f\rightarrow\gunderline{\text{twice}}(f\bef f)\\ +{\color{greenunder}\text{definition of twice}:}\quad & =f\rightarrow f\bef f\bef f\bef f\quad. \end{align*} \begin{comment} The last expression is hard to use: it is confusing that the argument names $f$ and $x$ are repeated. The calculation will be made clearer if we rename the arguments to remove shadowing of names. To avoid -errors, we will start with $x\Rightarrow\text{twice}(\text{twice}(x))$ +errors, we will start with $x\rightarrow\text{twice}(\text{twice}(x))$ and rename arguments one scope at a time: \begin{align*} - & x\Rightarrow\text{twice}(\text{twice}(\gunderline x))\\ -{\color{greenunder}\text{rename }x\text{ to }z:}\quad & =z\Rightarrow\gunderline{\text{twice}}(\text{twice}(z))\\ -{\color{greenunder}\text{definition of twice}:}\quad & =z\Rightarrow\gunderline{\left(f\Rightarrow x\Rightarrow f(f(x))\right)}\left(\text{twice}(z)\right)\\ -{\color{greenunder}\text{rename }f,x\text{ to }g,y:}\quad & =z\Rightarrow(g\Rightarrow y\Rightarrow\gunderline g(\gunderline g(y)))\left(\text{twice}(z)\right)\\ -{\color{greenunder}\text{substitute }g=\text{twice}(z):}\quad & =z\Rightarrow y\Rightarrow\gunderline{\left(\text{twice}(z)\right)}\left(\text{twice}(z)(y)\right)\\ -{\color{greenunder}\text{use }\text{twice}(z)=\left(x\Rightarrow z(z(x))\right):}\quad & =z\Rightarrow y\Rightarrow\left(x\Rightarrow z(z(x))\right)(\gunderline{\text{twice}(z)(y)})\\ -{\color{greenunder}\text{substitute }x=\text{twice}(z)(y)=z(z(y)):}\quad & =z\Rightarrow y\Rightarrow z(z(z(z(y))))\quad. + & x\rightarrow\text{twice}(\text{twice}(\gunderline x))\\ +{\color{greenunder}\text{rename }x\text{ to }z:}\quad & =z\rightarrow\gunderline{\text{twice}}(\text{twice}(z))\\ +{\color{greenunder}\text{definition of twice}:}\quad & =z\rightarrow\gunderline{\left(f\rightarrow x\rightarrow f(f(x))\right)}\left(\text{twice}(z)\right)\\ +{\color{greenunder}\text{rename }f,x\text{ to }g,y:}\quad & =z\rightarrow(g\rightarrow y\rightarrow\gunderline g(\gunderline g(y)))\left(\text{twice}(z)\right)\\ +{\color{greenunder}\text{substitute }g=\text{twice}(z):}\quad & =z\rightarrow y\rightarrow\gunderline{\left(\text{twice}(z)\right)}\left(\text{twice}(z)(y)\right)\\ +{\color{greenunder}\text{use }\text{twice}(z)=\left(x\rightarrow z(z(x))\right):}\quad & =z\rightarrow y\rightarrow\left(x\rightarrow z(z(x))\right)(\gunderline{\text{twice}(z)(y)})\\ +{\color{greenunder}\text{substitute }x=\text{twice}(z)(y)=z(z(y)):}\quad & =z\rightarrow y\rightarrow z(z(z(z(y))))\quad. \end{align*} \end{comment} So \lstinline!twice(twice)! is a function that applies its (function-typed) argument \emph{four} times. The type parameters follow from Eq.~(\ref{eq:hof-twice-example-solved3}) -with $A=\text{Int}$ and can be written as $\text{twice}^{\text{Int}\Rightarrow\text{Int}}(\text{twice}^{\text{Int}})$, +with $A=\text{Int}$ and can be written as $\text{twice}^{\text{Int}\rightarrow\text{Int}}(\text{twice}^{\text{Int}})$, or in Scala syntax, \lstinline!twice[Int => Int](twice[Int])!. To test, we need to write at least one type parameter in the code, or else Scala cannot infer the types correctly: @@ -1263,16 +1263,16 @@ \subsubsection{Example \label{subsec:Example-hof-derive-types-4}\ref{subsec:Exam \subparagraph{Solution} -In the nameless function $f\Rightarrow f(2)$, the argument $f$ must +In the nameless function $f\rightarrow f(2)$, the argument $f$ must be itself a function with an argument of type \lstinline!Int!, otherwise the sub-expression $f(2)$ makes no sense. So, types will match if -$f$ has type $\text{Int}\Rightarrow\text{Int}$ or $\text{Int}\Rightarrow\text{String}$ -or similar. The most general case is when $f$ has type $\text{Int}\Rightarrow A$, +$f$ has type $\text{Int}\rightarrow\text{Int}$ or $\text{Int}\rightarrow\text{String}$ +or similar. The most general case is when $f$ has type $\text{Int}\rightarrow A$, where $A$ is an arbitrary type (i.e.~a type parameter). The type $A$ will then be the (so far unknown) type of the value $f(2)$. -Since nameless function $f\Rightarrow f(2)$ has an argument $f$ -of type $\text{Int}\Rightarrow A$ and the result of type $A$, we -find that the type of $p$ must be $\left(\text{Int}\Rightarrow A\right)\Rightarrow A$. +Since nameless function $f\rightarrow f(2)$ has an argument $f$ +of type $\text{Int}\rightarrow A$ and the result of type $A$, we +find that the type of $p$ must be $\left(\text{Int}\rightarrow A\right)\rightarrow A$. With this type assignment, all types match. The type parameter $A$ remains undetermined and is added to the type signature of the function \lstinline!p!. The code is @@ -1317,15 +1317,15 @@ \section{Summary} \hline {\small{}$x^{:A}$} & {\small{}}\lstinline!x:A! & {\small{}a value or an argument of type }\lstinline!A!\tabularnewline \hline -{\small{}$f^{:A\Rightarrow B}$} & {\small{}}\lstinline!f: A => B! & {\small{}a function of type }\lstinline!A => B!\tabularnewline +{\small{}$f^{:A\rightarrow B}$} & {\small{}}\lstinline!f: A => B! & {\small{}a function of type }\lstinline!A => B!\tabularnewline \hline -{\small{}$x^{:\text{Int}}\Rightarrow f(x)$} & {\small{}}\lstinline!{ x: Int => f(x)! & {\small{}nameless function with argument }\lstinline!x!\tabularnewline +{\small{}$x^{:\text{Int}}\rightarrow f(x)$} & {\small{}}\lstinline!{ x: Int => f(x)! & {\small{}nameless function with argument }\lstinline!x!\tabularnewline \hline {\small{}$f^{A,B}\triangleq...$} & {\small{}}\lstinline!def f[A, B] = ...! & {\small{}define a function with type parameters}\tabularnewline \hline -{\small{}$\text{id}^{A}$, also $\text{id}^{:A\Rightarrow A}$} & {\small{}}\lstinline!identity[A]! & {\small{}the standard identity function}\tabularnewline +{\small{}$\text{id}^{A}$, also $\text{id}^{:A\rightarrow A}$} & {\small{}}\lstinline!identity[A]! & {\small{}the standard identity function}\tabularnewline \hline -{\small{}$A\Rightarrow B\Rightarrow C$} & {\small{}}\lstinline!A => B => C! & {\small{}type of a curried function}\tabularnewline +{\small{}$A\rightarrow B\rightarrow C$} & {\small{}}\lstinline!A => B => C! & {\small{}type of a curried function}\tabularnewline \hline {\small{}$f\bef g$} & {\small{}}\lstinline!f andThen g! & {\small{}forward composition of functions}\tabularnewline \hline @@ -1435,7 +1435,7 @@ \subsubsection{Example \label{subsec:Example-hof-simple-2}\ref{subsec:Example-ho \end{lstlisting} To implement the same function as a \lstinline!val!, we first convert the type signature of \lstinline!add_x! to the equivalent type expression -$\text{Int}\Rightarrow\text{Int}\Rightarrow\text{Int}$. Now we can +$\text{Int}\rightarrow\text{Int}\rightarrow\text{Int}$. Now we can write the Scala code of a function \lstinline!add_x_v!: \begin{lstlisting} val add_x_v: Int => Int => Int = { x => z => z + x } @@ -1443,7 +1443,7 @@ \subsubsection{Example \label{subsec:Example-hof-simple-2}\ref{subsec:Example-ho The function \lstinline!add_x_v! is equal to \lstinline!add_x! except for using the \lstinline!val! syntax instead of \lstinline!def!. It is not necessary to specify the type of the arguments \lstinline!x! -and \lstinline!z! because we already specified the type $\text{Int}\Rightarrow\text{Int}\Rightarrow\text{Int}$ +and \lstinline!z! because we already specified the type $\text{Int}\rightarrow\text{Int}\rightarrow\text{Int}$ for the value \lstinline!add_x_v!. \subsubsection{Example \label{subsec:Example-hof-simple-3}\ref{subsec:Example-hof-simple-3}} @@ -1457,7 +1457,7 @@ \subsubsection{Example \label{subsec:Example-hof-simple-3}\ref{subsec:Example-ho First, determine the required type signature of \lstinline!prime_f!. The value $f(x)$ must have type \lstinline!Int!, or else we cannot -check whether it is prime. So, $f$ must have type $\text{Int}\Rightarrow\text{Int}$. +check whether it is prime. So, $f$ must have type $\text{Int}\rightarrow\text{Int}$. Since \lstinline!prime_f! should be a curried function, we need to put each argument into its own set of parentheses: \begin{lstlisting} @@ -1514,10 +1514,10 @@ \subsubsection{Example \label{subsec:Example-hof-simple-4}\ref{subsec:Example-ho sometimes \lstinline!false!. So, \lstinline!choice(x,p,f,g)! will sometimes return $f(x)$ and sometimes $g(x)$. It follows that type $A$ must be the argument type of both $f$ and $g$, which means -that the most general types so far are $f^{:A\Rightarrow B}$ and -$g^{:A\Rightarrow C}$, yielding the type signature +that the most general types so far are $f^{:A\rightarrow B}$ and +$g^{:A\rightarrow C}$, yielding the type signature \[ -\text{choice}(x^{:A},p^{:A\Rightarrow\text{Boolean}},f^{:A\Rightarrow B},g^{:A\Rightarrow C})\quad. +\text{choice}(x^{:A},p^{:A\rightarrow\text{Boolean}},f^{:A\rightarrow B},g^{:A\rightarrow C})\quad. \] What could be the return type of \lstinline!choice(x,p,f,g)!? If @@ -1547,9 +1547,9 @@ \subsubsection{Example \label{subsec:Example-hof-derive-types-5}\ref{subsec:Exam \subparagraph{Solution} Begin by assuming $f^{:A}$ with a type parameter $A$. In the sub-expression -$g\Rightarrow g(f)$, the curried argument $g$ must itself be a function, +$g\rightarrow g(f)$, the curried argument $g$ must itself be a function, because it is being applied to $f$ as $g(f)$. So we assign types -as $f^{:A}\Rightarrow g^{:A\Rightarrow B}\Rightarrow g(f)$, where +as $f^{:A}\rightarrow g^{:A\rightarrow B}\rightarrow g(f)$, where $A$ and $B$ are type parameters. Then the final returned value $g(f)$ has type $B$. Since there are no other constraints on the types, the types $A$ and $B$ remain arbitrary, so we add them to the type @@ -1566,36 +1566,36 @@ \subsubsection{Example \label{subsec:Example-hof-derive-types-5}\ref{subsec:Exam The type of the first curried argument of \lstinline!q[A, B]!, which is $A$, must match the entire type of \lstinline!q[C, D]!, which -is $C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D$. So we +is $C\rightarrow\left(C\rightarrow D\right)\rightarrow D$. So we must set the type parameter $A$ as \[ -A=C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D\quad. +A=C\rightarrow\left(C\rightarrow D\right)\rightarrow D\quad. \] The type of \lstinline!q(q)! becomes \begin{align*} -q^{A,B}(q^{C,D}) & :\left(\left(C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D\right)\Rightarrow B\right)\Rightarrow B\quad,\\ -\text{where}\quad & A=C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D\quad. +q^{A,B}(q^{C,D}) & :\left(\left(C\rightarrow\left(C\rightarrow D\right)\rightarrow D\right)\rightarrow B\right)\rightarrow B\quad,\\ +\text{where}\quad & A=C\rightarrow\left(C\rightarrow D\right)\rightarrow D\quad. \end{align*} There are no other constraints on the type parameters $B$, $C$, $D$. We use this result to infer the most general type for \lstinline!q(q(q))!. We may denote $r\triangleq q(q)$ for brevity; then, as we just found, -$r$ has type $\left(\left(C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D\right)\Rightarrow B\right)\Rightarrow B$. +$r$ has type $\left(\left(C\rightarrow\left(C\rightarrow D\right)\rightarrow D\right)\rightarrow B\right)\rightarrow B$. To infer types in the expression \lstinline!q(r)!, we introduce new type parameters $E$, $F$ and write \lstinline!q[E, F](r)!. The type of the argument of \lstinline!q[E, F]! is $E$, and this must be the same as the type of $r$. This gives the constraint \[ -E=\left(\left(C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D\right)\Rightarrow B\right)\Rightarrow B\quad. +E=\left(\left(C\rightarrow\left(C\rightarrow D\right)\rightarrow D\right)\rightarrow B\right)\rightarrow B\quad. \] Other than that, the type parameters are arbitrary. The type of the -expression \lstinline!q(q(q))! is $\left(E\Rightarrow F\right)\Rightarrow F$. +expression \lstinline!q(q(q))! is $\left(E\rightarrow F\right)\rightarrow F$. We conclude that the most general type of \lstinline!q(q(q))! is \begin{align*} -q^{E,F}(q^{A,B}(q^{C,D})) & :\left(\left(\left(\left(C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D\right)\Rightarrow B\right)\Rightarrow B\right)\Rightarrow F\right)\Rightarrow F\quad,\\ -\text{where}\quad & A=C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D\\ -\text{and}\quad & E=\left(\left(C\Rightarrow\left(C\Rightarrow D\right)\Rightarrow D\right)\Rightarrow B\right)\Rightarrow B\quad. +q^{E,F}(q^{A,B}(q^{C,D})) & :\left(\left(\left(\left(C\rightarrow\left(C\rightarrow D\right)\rightarrow D\right)\rightarrow B\right)\rightarrow B\right)\rightarrow F\right)\rightarrow F\quad,\\ +\text{where}\quad & A=C\rightarrow\left(C\rightarrow D\right)\rightarrow D\\ +\text{and}\quad & E=\left(\left(C\rightarrow\left(C\rightarrow D\right)\rightarrow D\right)\rightarrow B\right)\rightarrow B\quad. \end{align*} It is clear from this derivation that expressions such as \lstinline!q(q(q(q)))!, \lstinline!q(q(q(q(q))))!, etc., are well-typed. @@ -1619,13 +1619,13 @@ \subsubsection{Example \label{subsec:Example-hof-curried}\ref{subsec:Example-hof Infer types in the code expression \[ -\left(f\Rightarrow g\Rightarrow g(f)\right)\left(f\Rightarrow g\Rightarrow g(f)\right)\left(f\Rightarrow f(10)\right) +\left(f\rightarrow g\rightarrow g(f)\right)\left(f\rightarrow g\rightarrow g(f)\right)\left(f\rightarrow f(10)\right) \] and simplify the code by symbolic calculations. \subparagraph{Solution} -The given expression is a curried function $f\Rightarrow g\Rightarrow g(f)$ +The given expression is a curried function $f\rightarrow g\rightarrow g(f)$ applied to two curried arguments. The plan is to consider each of these sub-expressions in turn, assigning types for them using type parameters, and then to figure out how to set the type parameters @@ -1634,70 +1634,70 @@ \subsubsection{Example \label{subsec:Example-hof-curried}\ref{subsec:Example-hof Begin by renaming the shadowed variables ($f$ and $g$) to remove shadowing: \begin{equation} -\left(f\Rightarrow g\Rightarrow g(f)\right)\left(x\Rightarrow y\Rightarrow y(x)\right)\left(h\Rightarrow h(10)\right)\quad.\label{eq:example-hof-curried-function-solved1} +\left(f\rightarrow g\rightarrow g(f)\right)\left(x\rightarrow y\rightarrow y(x)\right)\left(h\rightarrow h(10)\right)\quad.\label{eq:example-hof-curried-function-solved1} \end{equation} As we have seen in Example~\ref{subsec:Example-hof-derive-types-5}, -the sub-expression $f\Rightarrow g\Rightarrow g(f)$ is typed as $f^{:A}\Rightarrow g^{:A\Rightarrow B}\Rightarrow g(f)$, -where $A$ and $B$ are some type parameters. The sub-expression $x\Rightarrow y\Rightarrow y(x)$ -is the same function as $f\Rightarrow g\Rightarrow g(f)$ but with -possibly different type parameters, say, $x^{:C}\Rightarrow y^{:C\Rightarrow D}\Rightarrow y(x)$. +the sub-expression $f\rightarrow g\rightarrow g(f)$ is typed as $f^{:A}\rightarrow g^{:A\rightarrow B}\rightarrow g(f)$, +where $A$ and $B$ are some type parameters. The sub-expression $x\rightarrow y\rightarrow y(x)$ +is the same function as $f\rightarrow g\rightarrow g(f)$ but with +possibly different type parameters, say, $x^{:C}\rightarrow y^{:C\rightarrow D}\rightarrow y(x)$. The types $A$, $B$, $C$, $D$ are so far unknown. -Finally, the variable $h$ in the sub-expression $h\Rightarrow h(10)$ -must have type $\text{Int}\Rightarrow E$, where $E$ is another type -parameter. So, the sub-expression $h\Rightarrow h(10)$ is a function -of type $\left(\text{Int}\Rightarrow E\right)\Rightarrow E$. +Finally, the variable $h$ in the sub-expression $h\rightarrow h(10)$ +must have type $\text{Int}\rightarrow E$, where $E$ is another type +parameter. So, the sub-expression $h\rightarrow h(10)$ is a function +of type $\left(\text{Int}\rightarrow E\right)\rightarrow E$. The types must match in the entire expression~(\ref{eq:example-hof-curried-function-solved1}): \begin{equation} -(f^{:A}\Rightarrow g^{:A\Rightarrow B}\Rightarrow g(f))(x^{:C}\Rightarrow y^{:C\Rightarrow D}\Rightarrow y(x))(h^{:\text{Int}\Rightarrow E}\Rightarrow h(10)\quad.\label{eq:example-hof-curried-function-solved2} +(f^{:A}\rightarrow g^{:A\rightarrow B}\rightarrow g(f))(x^{:C}\rightarrow y^{:C\rightarrow D}\rightarrow y(x))(h^{:\text{Int}\rightarrow E}\rightarrow h(10)\quad.\label{eq:example-hof-curried-function-solved2} \end{equation} -It follows that $f$ must have the same type as $x\Rightarrow y\Rightarrow y(x)$, -while $g$ must have the same type as $h\Rightarrow h(10)$. The type -of $g$, which we know as $A\Rightarrow B$, will match the type of -$h\Rightarrow h(10)$, which we know as $\left(\text{Int}\Rightarrow E\right)\Rightarrow E$, -only if $A=\left(\text{Int}\Rightarrow E\right)$ and $B=E$. It follows -that $f$ has type $\text{Int}\Rightarrow E$. At the same time, the -type of $f$ must match the type of $x\Rightarrow y\Rightarrow y(x)$, -which is $C\Rightarrow(C\Rightarrow D)\Rightarrow D$. This can work -only if $C=\text{Int}$ and $E=(C\Rightarrow D)\Rightarrow D=(\text{Int}\Rightarrow D)\Rightarrow D$. +It follows that $f$ must have the same type as $x\rightarrow y\rightarrow y(x)$, +while $g$ must have the same type as $h\rightarrow h(10)$. The type +of $g$, which we know as $A\rightarrow B$, will match the type of +$h\rightarrow h(10)$, which we know as $\left(\text{Int}\rightarrow E\right)\rightarrow E$, +only if $A=\left(\text{Int}\rightarrow E\right)$ and $B=E$. It follows +that $f$ has type $\text{Int}\rightarrow E$. At the same time, the +type of $f$ must match the type of $x\rightarrow y\rightarrow y(x)$, +which is $C\rightarrow(C\rightarrow D)\rightarrow D$. This can work +only if $C=\text{Int}$ and $E=(C\rightarrow D)\rightarrow D=(\text{Int}\rightarrow D)\rightarrow D$. In this way, we have found all the relationships between the type parameters $A$, $B$, $C$, $D$, $E$ in Eq.~(\ref{eq:example-hof-curried-function-solved2}). The type $D$ remains undetermined (i.e.~arbitrary), while the type parameters $A$, $B$, $C$, $E$ are expressed as \begin{align} -A & =\text{Int}\Rightarrow\left(\text{Int}\Rightarrow D\right)\Rightarrow D\quad,\label{eq:example-hof-curried-solved3}\\ -B & =E=\left(\text{Int}\Rightarrow D\right)\Rightarrow D\quad,\label{eq:example-hof-curried-solved4}\\ +A & =\text{Int}\rightarrow\left(\text{Int}\rightarrow D\right)\rightarrow D\quad,\label{eq:example-hof-curried-solved3}\\ +B & =E=\left(\text{Int}\rightarrow D\right)\rightarrow D\quad,\label{eq:example-hof-curried-solved4}\\ C & =\text{Int}\quad.\nonumber \end{align} The entire expression in Eq.~(\ref{eq:example-hof-curried-function-solved2}) is a saturated application of a curried function, and thus has the same type as the ``final'' result expression $g(f)$, which has type $B$. So, the entire expression in Eq.~(\ref{eq:example-hof-curried-function-solved2}) -has type $B=\left(\text{Int}\Rightarrow D\right)\Rightarrow D$. +has type $B=\left(\text{Int}\rightarrow D\right)\rightarrow D$. Having established that types match, we can now omit the type annotations and rewrite the code: \begin{align*} - & (f\Rightarrow g\Rightarrow\gunderline g(\gunderline f))\left(x\Rightarrow y\Rightarrow y(x)\right)\left(h\Rightarrow h(10)\right)\\ -{\color{greenunder}\text{substitute }f,g:}\quad & =(h\Rightarrow\gunderline h(10))\left(x\Rightarrow y\Rightarrow y(x)\right)\\ -{\color{greenunder}\text{substitute }h:}\quad & =(x\Rightarrow y\Rightarrow y(\gunderline x))(10)\\ -{\color{greenunder}\text{substitute }x:}\quad & =y\Rightarrow y(10)\quad. + & (f\rightarrow g\rightarrow\gunderline g(\gunderline f))\left(x\rightarrow y\rightarrow y(x)\right)\left(h\rightarrow h(10)\right)\\ +{\color{greenunder}\text{substitute }f,g:}\quad & =(h\rightarrow\gunderline h(10))\left(x\rightarrow y\rightarrow y(x)\right)\\ +{\color{greenunder}\text{substitute }h:}\quad & =(x\rightarrow y\rightarrow y(\gunderline x))(10)\\ +{\color{greenunder}\text{substitute }x:}\quad & =y\rightarrow y(10)\quad. \end{align*} -The type of this expression is $\left(\text{Int}\Rightarrow D\right)\Rightarrow D$ +The type of this expression is $\left(\text{Int}\rightarrow D\right)\rightarrow D$ with a type parameter $D$. Since the argument $y$ is an arbitrary -function, we cannot simplify $y(10)$ or $y\Rightarrow y(10)$ any -further. We conclude that $y^{:\text{Int}\Rightarrow D}\Rightarrow y(10)$ +function, we cannot simplify $y(10)$ or $y\rightarrow y(10)$ any +further. We conclude that $y^{:\text{Int}\rightarrow D}\rightarrow y(10)$ is the final simplified form of Eq.~(\ref{eq:example-hof-curried-function-solved1}). -To test this, we first define the function $f\Rightarrow g\Rightarrow g(f)$ +To test this, we first define the function $f\rightarrow g\rightarrow g(f)$ as in Example~\ref{subsec:Example-hof-derive-types-5}, \begin{lstlisting} def q[A, B]: A => (A => B) => B = { f => g => g(f) } \end{lstlisting} -We also define the function $h\Rightarrow h(10)$ with a general type -$\left(\text{Int}\Rightarrow E\right)\Rightarrow E$, +We also define the function $h\rightarrow h(10)$ with a general type +$\left(\text{Int}\rightarrow E\right)\rightarrow E$, \begin{lstlisting} def r[E]: (Int => E) => E = { h => h(10) } \end{lstlisting} @@ -1708,8 +1708,8 @@ \subsubsection{Example \label{subsec:Example-hof-curried}\ref{subsec:Example-hof scala> def s[D] = q[Int => (Int => D) => D, (Int => D) => D](q)(r) s: [D]=> (Int => D) => D \end{lstlisting} -To verify that the function $s^{D}$ indeed equals $y^{:\text{Int}\Rightarrow D}\Rightarrow y(10)$, -we apply $s^{D}$ to some functions of type $\text{Int}\Rightarrow D$, +To verify that the function $s^{D}$ indeed equals $y^{:\text{Int}\rightarrow D}\rightarrow y(10)$, +we apply $s^{D}$ to some functions of type $\text{Int}\rightarrow D$, say, for $D=\text{Boolean}$ or $D=\text{Int}$: \begin{lstlisting} scala> s(_ > 0) // Set D = Boolean and evaluate (10 > 0). @@ -1804,42 +1804,42 @@ \subsubsection{Exercise \label{subsec:Exercise-hof-simple-8-1}\ref{subsec:Exerci \subsubsection{Exercise \label{subsec:Exercise-hof-curried-1}\ref{subsec:Exercise-hof-curried-1}} -Apply the function $\left(x\Rightarrow\_\Rightarrow x\right)$ to -the value $\left(z\Rightarrow z(q)\right)$ where $q$ is a given +Apply the function $\left(x\rightarrow\_\rightarrow x\right)$ to +the value $\left(z\rightarrow z(q)\right)$ where $q$ is a given value of type $Q$. Infer types in these expressions. \subsubsection{Exercise \label{subsec:Exercise-hof-curried-3}\ref{subsec:Exercise-hof-curried-3}} Infer types in the following expressions and test in Scala: -\textbf{(a)} $p\Rightarrow q\Rightarrow p(t\Rightarrow t(q))\quad.$ +\textbf{(a)} $p\rightarrow q\rightarrow p(t\rightarrow t(q))\quad.$ -\textbf{(b)} $p\Rightarrow q\Rightarrow q(x\Rightarrow x(p(q)))\quad.$ +\textbf{(b)} $p\rightarrow q\rightarrow q(x\rightarrow x(p(q)))\quad.$ \subsubsection{Exercise \label{subsec:Exercise-hof-curried-4}\ref{subsec:Exercise-hof-curried-4}} Show that the following expressions cannot be well-typed: -\textbf{(a)} $p\Rightarrow p(q\Rightarrow q(p))\quad.$ +\textbf{(a)} $p\rightarrow p(q\rightarrow q(p))\quad.$ -\textbf{(b)} $p\Rightarrow q\Rightarrow q(x\Rightarrow p(q(x)))\quad.$ +\textbf{(b)} $p\rightarrow q\rightarrow q(x\rightarrow p(q(x)))\quad.$ \subsubsection{Exercise \label{subsec:Exercise-hof-curried-2}\ref{subsec:Exercise-hof-curried-2}} Infer types and simplify the following code expressions by symbolic calculations: -\textbf{(a)} $q\Rightarrow\left(x\Rightarrow y\Rightarrow z\Rightarrow x(z)(y(z))\right)\left(a\Rightarrow a\right)\left(b\Rightarrow b(q)\right)\quad.$ +\textbf{(a)} $q\rightarrow\left(x\rightarrow y\rightarrow z\rightarrow x(z)(y(z))\right)\left(a\rightarrow a\right)\left(b\rightarrow b(q)\right)\quad.$ -\textbf{(b)} $\left(f\Rightarrow g\Rightarrow h\Rightarrow f(g(h))\right)(x\Rightarrow x)\quad.$ +\textbf{(b)} $\left(f\rightarrow g\rightarrow h\rightarrow f(g(h))\right)(x\rightarrow x)\quad.$ -\textbf{(c)} $\left(x\Rightarrow y\Rightarrow x(y)\right)\left(x\Rightarrow y\Rightarrow x\right)\quad.$ +\textbf{(c)} $\left(x\rightarrow y\rightarrow x(y)\right)\left(x\rightarrow y\rightarrow x\right)\quad.$ -\textbf{(d)} $\left(x\Rightarrow y\Rightarrow x(y)\right)\left(x\Rightarrow y\Rightarrow y\right)\quad.$ +\textbf{(d)} $\left(x\rightarrow y\rightarrow x(y)\right)\left(x\rightarrow y\rightarrow y\right)\quad.$ -\textbf{(e)} $x\Rightarrow\left(f\Rightarrow y\Rightarrow f(y)(x)\right)\left(z\Rightarrow\_\Rightarrow z\right)\quad.$ +\textbf{(e)} $x\rightarrow\left(f\rightarrow y\rightarrow f(y)(x)\right)\left(z\rightarrow\_\rightarrow z\right)\quad.$ -\textbf{(f)} $z\Rightarrow\left(x\Rightarrow y\Rightarrow x\right)\left(x\Rightarrow x(z)\right)(y\Rightarrow y(z))\quad.$ +\textbf{(f)} $z\rightarrow\left(x\rightarrow y\rightarrow x\right)\left(x\rightarrow x(z)\right)(y\rightarrow y(z))\quad.$ \section{Discussion} @@ -1889,11 +1889,11 @@ \subsection{Higher-order functions} \subsection{Name shadowing and the scope of bound variables} Bound variables are introduced in nameless functions whenever an argument -is defined. For example, in the curried nameless function $x\Rightarrow y\Rightarrow x+y$, +is defined. For example, in the curried nameless function $x\rightarrow y\rightarrow x+y$, the bound variables are the curried arguments $x$ and $y$. The variable -$y$ is only defined within the scope $\left(y\Rightarrow x+y\right)$ +$y$ is only defined within the scope $\left(y\rightarrow x+y\right)$ of the inner function; the variable $x$ is defined within the entire -scope of $x\Rightarrow y\Rightarrow x+y$. +scope of $x\rightarrow y\rightarrow x+y$. Another way of introducing bound variables in Scala is to write a \lstinline!val! or a \lstinline!def! within curly braces: @@ -1940,22 +1940,22 @@ \subsection{Name shadowing and the scope of bound variables} programming, because it usually decreases the clarity of code and so invites errors. Consider the nameless function \[ -x\Rightarrow x\Rightarrow x\quad, +x\rightarrow x\rightarrow x\quad, \] -and let us decipher this confusing syntax. The symbol $\Rightarrow$ -groups to the right, so $x\Rightarrow x\Rightarrow x$ is the same -as $x\Rightarrow\left(x\Rightarrow x\right)$. It is a function that -takes $x$ and returns $x\Rightarrow x$. Since the nameless function -$\left(x\Rightarrow x\right)$ may be renamed to $\left(y\Rightarrow y\right)$ +and let us decipher this confusing syntax. The symbol $\rightarrow$ +groups to the right, so $x\rightarrow x\rightarrow x$ is the same +as $x\rightarrow\left(x\rightarrow x\right)$. It is a function that +takes $x$ and returns $x\rightarrow x$. Since the nameless function +$\left(x\rightarrow x\right)$ may be renamed to $\left(y\rightarrow y\right)$ without changing its value, we can rewrite the code to \[ -x\Rightarrow\left(y\Rightarrow y\right)\quad. +x\rightarrow\left(y\rightarrow y\right)\quad. \] Having removed name shadowing, we can more easily understand this code and reason about it. For instance, it becomes clear that this function ignores its argument $x$ and always returns the same value -(the identity function $y\Rightarrow y$). So we can rewrite $\left(x\Rightarrow x\Rightarrow x\right)$ -as $\left(\_\Rightarrow y\Rightarrow y\right)$, which is clearer. +(the identity function $y\rightarrow y$). So we can rewrite $\left(x\rightarrow x\rightarrow x\right)$ +as $\left(\_\rightarrow y\rightarrow y\right)$, which is clearer. \subsection{Operator syntax for function applications} @@ -1979,16 +1979,16 @@ \subsection{Operator syntax for function applications} The conventions for nameless functions in the operator syntax become: \begin{itemize} -\item Function expressions group to the right, so $x\Rightarrow y\Rightarrow z\Rightarrow e$ -means $x\Rightarrow\left(y\Rightarrow\left(z\Rightarrow e\right)\right)$. +\item Function expressions group to the right, so $x\rightarrow y\rightarrow z\rightarrow e$ +means $x\rightarrow\left(y\rightarrow\left(z\rightarrow e\right)\right)$. \item Function applications group to the left, so $f\,x\,y\,z$ means $\big((f\,x)\:y\big)\:z$. \item Function applications group stronger than infix operations, so $x+f\,y$ means $x+(f\,y)$, just as in mathematics ``$x+\cos y$'' groups ``$\cos y$'' stronger than the infix ``$+$'' operation. \end{itemize} -Thus, $x\Rightarrow y\Rightarrow a\,b\,c+p\,q$ means $x\Rightarrow\left(y\Rightarrow\left(\left(a\,b\right)\,c\right)+(p\,q)\right)$. +Thus, $x\rightarrow y\rightarrow a\,b\,c+p\,q$ means $x\rightarrow\left(y\rightarrow\left(\left(a\,b\right)\,c\right)+(p\,q)\right)$. When this notation becomes hard to read correctly, one needs to add -parentheses, e.g.\ to write $f(x\Rightarrow g\,h)$ instead of $f\,x\Rightarrow g\,h$. +parentheses, e.g.\ to write $f(x\rightarrow g\,h)$ instead of $f\,x\rightarrow g\,h$. This book will avoid using the ``operator syntax'' when reasoning about code. Scala does not support the parentheses-free operator syntax; @@ -2122,7 +2122,7 @@ \subsection{Deriving a function's code from its type signature\label{subsec:Deri } \end{lstlisting} In the inner scope, we need to compute a value of type $C$ from the -values $x^{:A}$, $f^{:A\Rightarrow B}$, and $g^{:B\Rightarrow C}$. +values $x^{:A}$, $f^{:A\rightarrow B}$, and $g^{:B\rightarrow C}$. Since the type $C$ is arbitrary, the only way of obtaining a value of type $C$ is by applying $g$ to an argument of type $B$. In turn, the only way of obtaining a value of type $B$ is to apply $f$ to diff --git a/sofp-src/sofp-induction.lyx b/sofp-src/sofp-induction.lyx index 1893a4241..1924c4507 100644 --- a/sofp-src/sofp-induction.lyx +++ b/sofp-src/sofp-induction.lyx @@ -109,15 +109,13 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} \def\mathunderline#1#2{\color{#1}\underline{{\color{black}#2}}\color{black}} % The LyX document will define a macro \gunderline{#1} that will use \mathunderline with the color `greenunder`. %\def\gunderline#1{\mathunderline{greenunder}{#1}} % This is now defined by LyX itself with GUI support. + \end_preamble \options open=any,numbers=noenddot,index=totoc,bibliography=totoc,listof=totoc,fontsize=10pt \use_default_options true diff --git a/sofp-src/sofp-irregular.lyx b/sofp-src/sofp-irregular.lyx index 6726d09ad..4b7047256 100644 --- a/sofp-src/sofp-irregular.lyx +++ b/sofp-src/sofp-irregular.lyx @@ -109,9 +109,6 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} diff --git a/sofp-src/sofp-monads.lyx b/sofp-src/sofp-monads.lyx index 388f1a650..cb62df2f6 100644 --- a/sofp-src/sofp-monads.lyx +++ b/sofp-src/sofp-monads.lyx @@ -109,15 +109,13 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} \def\mathunderline#1#2{\color{#1}\underline{{\color{black}#2}}\color{black}} % The LyX document will define a macro \gunderline{#1} that will use \mathunderline with the color `greenunder`. %\def\gunderline#1{\mathunderline{greenunder}{#1}} % This is now defined by LyX itself with GUI support. + \end_preamble \options open=any,numbers=noenddot,index=totoc,bibliography=totoc,listof=totoc,fontsize=10pt \use_default_options true @@ -393,7 +391,7 @@ status open \size footnotesize \color blue (1 to n).flatMap { i -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset @@ -405,7 +403,7 @@ status open \size footnotesize \color blue (1 to n).flatMap { j -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset @@ -417,7 +415,7 @@ status open \size footnotesize \color blue (1 to n).map { k -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset @@ -522,7 +520,7 @@ map() \size footnotesize \color blue (1 to n).map(j -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset ...).flatten @@ -534,7 +532,7 @@ map() \size footnotesize \color blue (1 to n).flatMap(j -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset ...) @@ -584,7 +582,7 @@ pure: \end_inset A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset F[A] @@ -645,7 +643,7 @@ consider \size footnotesize \color blue List(x1, x2, x3).flatMap(x -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset f(x)) @@ -665,7 +663,7 @@ assume that \size footnotesize \color blue f: X -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset List[Y] @@ -909,7 +907,7 @@ val result = { \size footnotesize \color blue (1 to m).flatMap { i -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset @@ -921,7 +919,7 @@ val result = { \size footnotesize \color blue (1 to n).flatMap { j -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset @@ -941,7 +939,7 @@ val result = { \size footnotesize \color blue (1 to p).map { k -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset @@ -1166,11 +1164,11 @@ Non-standard \end_inset containers: -\begin_inset Formula $F^{A}\equiv\text{String}\Rightarrow A$ +\begin_inset Formula $F^{A}\equiv\text{String}\rightarrow A$ \end_inset ; -\begin_inset Formula $F^{A}\equiv\left(A\Rightarrow\text{Int}\right)\Rightarrow\text{Int}$ +\begin_inset Formula $F^{A}\equiv\left(A\rightarrow\text{Int}\right)\rightarrow\text{Int}$ \end_inset @@ -1900,7 +1898,7 @@ f: \end_inset A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Tree[B] @@ -2133,7 +2131,7 @@ Reader \end_layout \begin_layout Standard -\begin_inset Formula $\text{Reader}^{A}\equiv E\Rightarrow A$ +\begin_inset Formula $\text{Reader}^{A}\equiv E\rightarrow A$ \end_inset where @@ -2164,7 +2162,7 @@ Eval \end_layout \begin_layout Standard -\begin_inset Formula $\text{Eval}^{A}\equiv A+\left(1\Rightarrow A\right)$ +\begin_inset Formula $\text{Eval}^{A}\equiv A+\left(1\rightarrow A\right)$ \end_inset @@ -2183,7 +2181,7 @@ Cont \end_layout \begin_layout Standard -\begin_inset Formula $\text{Cont}^{A}\equiv\left(A\Rightarrow R\right)\Rightarrow R$ +\begin_inset Formula $\text{Cont}^{A}\equiv\left(A\rightarrow R\right)\rightarrow R$ \end_inset where @@ -2214,7 +2212,7 @@ State \end_layout \begin_layout Standard -\begin_inset Formula $\text{State}^{A}\equiv S\Rightarrow A\times S$ +\begin_inset Formula $\text{State}^{A}\equiv S\rightarrow A\times S$ \end_inset where @@ -2285,7 +2283,7 @@ Writer \size default \color inherit : a computation -\begin_inset Formula $\left(A\Rightarrow B\right)$ +\begin_inset Formula $\left(A\rightarrow B\right)$ \end_inset and some info ( @@ -2296,15 +2294,15 @@ Writer \end_layout \begin_layout Standard -\begin_inset Formula $x^{A}\Rightarrow f(x):B$ +\begin_inset Formula $x^{A}\rightarrow f(x):B$ \end_inset and -\begin_inset Formula $x^{A}\Rightarrow g(x):W$ +\begin_inset Formula $x^{A}\rightarrow g(x):W$ \end_inset ; the type is -\begin_inset Formula $\left(A\Rightarrow B\right)\times\left(A\Rightarrow W\right)$ +\begin_inset Formula $\left(A\rightarrow B\right)\times\left(A\rightarrow W\right)$ \end_inset @@ -2312,7 +2310,7 @@ Writer \begin_layout Standard this function should have type -\begin_inset Formula $A\Rightarrow\text{Writer}^{B}$ +\begin_inset Formula $A\rightarrow\text{Writer}^{B}$ \end_inset , hence @@ -2363,7 +2361,7 @@ environment \end_layout \begin_layout Standard -\begin_inset Formula $x^{A}\Rightarrow f(r,x):B$ +\begin_inset Formula $x^{A}\rightarrow f(r,x):B$ \end_inset where @@ -2371,7 +2369,7 @@ environment \end_inset is fixed; the type is -\begin_inset Formula $A\times E\Rightarrow B$ +\begin_inset Formula $A\times E\rightarrow B$ \end_inset @@ -2379,11 +2377,11 @@ environment \begin_layout Standard this function should have type -\begin_inset Formula $A\Rightarrow\text{Reader}^{B}$ +\begin_inset Formula $A\rightarrow\text{Reader}^{B}$ \end_inset , hence -\begin_inset Formula $\text{Reader}^{B}\equiv E\Rightarrow B$ +\begin_inset Formula $\text{Reader}^{B}\equiv E\rightarrow B$ \end_inset @@ -2418,11 +2416,11 @@ Cont \end_layout \begin_layout Standard -\begin_inset Formula $x^{A}\Rightarrow f(cb):1$ +\begin_inset Formula $x^{A}\rightarrow f(cb):1$ \end_inset where -\begin_inset Formula $cb:B\Rightarrow1$ +\begin_inset Formula $cb:B\rightarrow1$ \end_inset (usually, callbacks return @@ -2440,7 +2438,7 @@ Unit the type is \size footnotesize -\begin_inset Formula $A\Rightarrow\left(B\Rightarrow1\right)\Rightarrow1$ +\begin_inset Formula $A\rightarrow\left(B\rightarrow1\right)\rightarrow1$ \end_inset @@ -2448,7 +2446,7 @@ the type is ; this function should have type \size footnotesize -\begin_inset Formula $A\Rightarrow\text{Cont}^{B}$ +\begin_inset Formula $A\rightarrow\text{Cont}^{B}$ \end_inset @@ -2456,7 +2454,7 @@ the type is , hence \size footnotesize -\begin_inset Formula $\text{Cont}^{B}\equiv\left(B\Rightarrow1\right)\Rightarrow1$ +\begin_inset Formula $\text{Cont}^{B}\equiv\left(B\rightarrow1\right)\rightarrow1$ \end_inset @@ -2466,7 +2464,7 @@ the type is generalize to \size footnotesize -\begin_inset Formula $\text{Cont}^{A}\equiv\left(A\Rightarrow R\right)\Rightarrow R$ +\begin_inset Formula $\text{Cont}^{A}\equiv\left(A\rightarrow R\right)\rightarrow R$ \end_inset @@ -2503,7 +2501,7 @@ State \end_layout \begin_layout Standard -\begin_inset Formula $x^{A}\Rightarrow f(x,s)$ +\begin_inset Formula $x^{A}\rightarrow f(x,s)$ \end_inset and @@ -2513,7 +2511,7 @@ State ; the type is \size footnotesize -\begin_inset Formula $\left(A\times S\Rightarrow B\right)\times\left(A\times S\Rightarrow S\right)$ +\begin_inset Formula $\left(A\times S\rightarrow B\right)\times\left(A\times S\rightarrow S\right)$ \end_inset @@ -2521,13 +2519,13 @@ State \begin_layout Standard this will be -\begin_inset Formula $A\Rightarrow\text{State}^{B}$ +\begin_inset Formula $A\rightarrow\text{State}^{B}$ \end_inset if \size footnotesize -\begin_inset Formula $\text{State}^{B}\equiv\left(S\Rightarrow B\right)\times\left(S\Rightarrow S\right)\equiv S\Rightarrow B\times S$ +\begin_inset Formula $\text{State}^{B}\equiv\left(S\rightarrow B\right)\times\left(S\rightarrow S\right)\equiv S\rightarrow B\times S$ \end_inset @@ -2687,7 +2685,7 @@ implement: \size footnotesize \color blue const: Int -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Future[Int] @@ -2699,7 +2697,7 @@ const: Int \size footnotesize \color blue add(x: Int): Int -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Future[Int] @@ -2711,7 +2709,7 @@ add(x: Int): Int \size footnotesize \color blue isEqual(x: Int): Int -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Future[Boolean] @@ -2776,7 +2774,7 @@ Given a semigroup \end_inset , make a semimonad out of -\begin_inset Formula $F^{A}\equiv E\Rightarrow A\times W$ +\begin_inset Formula $F^{A}\equiv E\rightarrow A\times W$ \end_inset @@ -2969,7 +2967,7 @@ y \size footnotesize \color blue .map(x -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset f(x)) @@ -3006,11 +3004,11 @@ z \size footnotesize \color blue cont1.flatMap(x -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset cont2(f(x))) = cont1.map(f).flatMap(y -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset cont2(y)) @@ -3155,7 +3153,7 @@ cont1.flatMap(cont2).map(f) \size footnotesize \color blue = cont1.flatMap(x -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset cont2(x).map(f)) @@ -3312,7 +3310,7 @@ z \end_inset cont.flatMap(x -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset p(x).flatMap(cont2)) = cont.flatMap(p).flatMap(cont2) @@ -3373,7 +3371,7 @@ semimonad has \size footnotesize -\begin_inset Formula $\text{flm}^{\left[A,B\right]}:\left(A\Rightarrow S^{B}\right)\Rightarrow S^{A}\Rightarrow S^{B}$ +\begin_inset Formula $\text{flm}^{\left[A,B\right]}:\left(A\rightarrow S^{B}\right)\rightarrow S^{A}\rightarrow S^{B}$ \end_inset @@ -3384,7 +3382,7 @@ semimonad \begin_layout Standard \size footnotesize -\begin_inset Formula $\text{flm}\,(f^{A\Rightarrow B}\bef g^{B\Rightarrow S^{C}})=\text{fmap}\,f\bef\text{flm}\,g$ +\begin_inset Formula $\text{flm}\,(f^{A\rightarrow B}\bef g^{B\rightarrow S^{C}})=\text{fmap}\,f\bef\text{flm}\,g$ \end_inset @@ -3402,8 +3400,8 @@ semimonad \begin_inset Formula \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & S^{B}\ar[rd]\sp(0.5){\ \text{flm}\,g^{B\Rightarrow S^{C}}}\\ -S^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\Rightarrow B}\ }\ar[rr]\sb(0.5){\text{flm}\,(f^{A\Rightarrow B}\bef\,g^{B\Rightarrow S^{C}})\,} & & S^{C} +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & S^{B}\ar[rd]\sp(0.5){\ \text{flm}\,g^{B\rightarrow S^{C}}}\\ +S^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\rightarrow B}\ }\ar[rr]\sb(0.5){\text{flm}\,(f^{A\rightarrow B}\bef\,g^{B\rightarrow S^{C}})\,} & & S^{C} } \] @@ -3415,7 +3413,7 @@ S^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\Rightarrow B}\ }\ar[rr]\sb(0.5){\text{flm \begin_layout Standard \size footnotesize -\begin_inset Formula $\text{flm}\,\big(f^{A\Rightarrow S^{B}}\bef\text{fmap}\,g^{B\Rightarrow C}\big)=\text{flm}\,f\bef\text{fmap}\,g$ +\begin_inset Formula $\text{flm}\,\big(f^{A\rightarrow S^{B}}\bef\text{fmap}\,g^{B\rightarrow C}\big)=\text{flm}\,f\bef\text{fmap}\,g$ \end_inset @@ -3433,8 +3431,8 @@ S^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\Rightarrow B}\ }\ar[rr]\sb(0.5){\text{flm \begin_inset Formula \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & S^{B}\ar[rd]\sp(0.5){\ \text{fmap}\,g^{B\Rightarrow C}}\\ -S^{A}\ar[ru]\sp(0.5){\text{flm}\,f^{A\Rightarrow S^{B}}\ }\ar[rr]\sb(0.5){\text{flm}\,(f^{A\Rightarrow S^{B}}\bef\,\text{fmap}\,g^{B\Rightarrow C})\,} & & S^{C} +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & S^{B}\ar[rd]\sp(0.5){\ \text{fmap}\,g^{B\rightarrow C}}\\ +S^{A}\ar[ru]\sp(0.5){\text{flm}\,f^{A\rightarrow S^{B}}\ }\ar[rr]\sb(0.5){\text{flm}\,(f^{A\rightarrow S^{B}}\bef\,\text{fmap}\,g^{B\rightarrow C})\,} & & S^{C} } \] @@ -3446,7 +3444,7 @@ S^{A}\ar[ru]\sp(0.5){\text{flm}\,f^{A\Rightarrow S^{B}}\ }\ar[rr]\sb(0.5){\text{ \begin_layout Standard \size footnotesize -\begin_inset Formula $\text{flm}\,\big(f^{A\Rightarrow S^{B}}\bef\text{flm}\,g^{B\Rightarrow S^{C}}\big)=\text{flm}\,f\bef\text{flm}\,g$ +\begin_inset Formula $\text{flm}\,\big(f^{A\rightarrow S^{B}}\bef\text{flm}\,g^{B\rightarrow S^{C}}\big)=\text{flm}\,f\bef\text{flm}\,g$ \end_inset @@ -3460,8 +3458,8 @@ S^{A}\ar[ru]\sp(0.5){\text{flm}\,f^{A\Rightarrow S^{B}}\ }\ar[rr]\sb(0.5){\text{ \begin_inset Formula \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & S^{B}\ar[rd]\sp(0.5){\ \text{flm}\,g^{B\Rightarrow S^{C}}}\\ -S^{A}\ar[ru]\sp(0.5){\text{flm}\,f^{A\Rightarrow S^{B}}\ }\ar[rr]\sb(0.5){\text{flm}\,\big(f^{A\Rightarrow S^{B}}\bef\,\text{flm}\,g^{B\Rightarrow S^{C}}\big)\,} & & S^{C} +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & S^{B}\ar[rd]\sp(0.5){\ \text{flm}\,g^{B\rightarrow S^{C}}}\\ +S^{A}\ar[ru]\sp(0.5){\text{flm}\,f^{A\rightarrow S^{B}}\ }\ar[rr]\sb(0.5){\text{flm}\,\big(f^{A\rightarrow S^{B}}\bef\,\text{flm}\,g^{B\rightarrow S^{C}}\big)\,} & & S^{C} } \] @@ -3546,8 +3544,8 @@ status open \size footnotesize \begin_inset Formula \begin{align*} -\text{ftn}^{\left[A\right]}:S^{S^{A}}\Rightarrow S^{A} & \equiv\text{flm}^{\left[S^{A},A\right]}(m^{S^{A}}\Rightarrow m)\\ -\text{flm}\,\big(f^{A\Rightarrow S^{B}}\big) & \equiv\text{fmap}\,f\bef\text{ftn} +\text{ftn}^{\left[A\right]}:S^{S^{A}}\rightarrow S^{A} & \equiv\text{flm}^{\left[S^{A},A\right]}(m^{S^{A}}\rightarrow m)\\ +\text{flm}\,\big(f^{A\rightarrow S^{B}}\big) & \equiv\text{fmap}\,f\bef\text{ftn} \end{align*} \end_inset @@ -3586,7 +3584,7 @@ status open \begin_inset Formula \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & S^{S^{B}}\ar[rd]\sp(0.5){\ \text{ftn}\ }\\ -S^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\Rightarrow S^{B}}\ }\ar[rr]\sb(0.5){\text{flm}\,\big(f^{A\Rightarrow S^{B}}\big)\,} & & S^{B} +S^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\rightarrow S^{B}}\ }\ar[rr]\sb(0.5){\text{flm}\,\big(f^{A\rightarrow S^{B}}\big)\,} & & S^{B} } \] @@ -3631,7 +3629,7 @@ flatten \begin_layout Standard \size footnotesize -\begin_inset Formula $\text{fmap}\big(\text{fmap}\,f^{A\Rightarrow B}\big)\bef\text{ftn}^{\left[B\right]}=\text{ftn}^{\left[A\right]}\bef\text{fmap}\,f$ +\begin_inset Formula $\text{fmap}\big(\text{fmap}\,f^{A\rightarrow B}\big)\bef\text{ftn}^{\left[B\right]}=\text{ftn}^{\left[A\right]}\bef\text{fmap}\,f$ \end_inset @@ -3642,8 +3640,8 @@ flatten \begin_inset Formula \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{5pc} & S^{S^{B}}\ar[rd]\sp(0.5){\ \text{ftn}^{\left[B\right]}}\\ -S^{S^{A}}\ar[ru]\sp(0.5){\text{fmap}\,\big(\text{fmap}\,f^{A\Rightarrow B}\big)\ \ }\ar[rd]\sb(0.5){\text{ftn}^{\left[A\right]}\,} & & S^{B}\\ - & S^{A}\ar[ru]\sb(0.5){\text{fmap}\,f^{A\Rightarrow B}} +S^{S^{A}}\ar[ru]\sp(0.5){\text{fmap}\,\big(\text{fmap}\,f^{A\rightarrow B}\big)\ \ }\ar[rd]\sb(0.5){\text{ftn}^{\left[A\right]}\,} & & S^{B}\\ + & S^{A}\ar[ru]\sb(0.5){\text{fmap}\,f^{A\rightarrow B}} } \] @@ -3755,7 +3753,7 @@ Is there a general pattern where two such functions are equivalent? Let \size footnotesize -\begin_inset Formula $\text{tr}:F^{G^{A}}\Rightarrow F^{A}$ +\begin_inset Formula $\text{tr}:F^{G^{A}}\rightarrow F^{A}$ \end_inset @@ -3775,7 +3773,7 @@ be a natural transformation ( Define \size footnotesize -\begin_inset Formula $\text{ftr}:\left(A\Rightarrow G^{B}\right)\Rightarrow F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $\text{ftr}:\left(A\rightarrow G^{B}\right)\rightarrow F^{A}\rightarrow F^{B}$ \end_inset @@ -3844,8 +3842,8 @@ status open \size footnotesize \begin_inset Formula \begin{align*} -\text{tr}:F^{G^{A}}\Rightarrow F^{A} & =\text{ftr}(m^{G^{A}}\Rightarrow m)\\ -\text{ftr}\,\big(f^{A\Rightarrow G^{B}}\big) & =\text{fmap}\,f\bef\text{tr} +\text{tr}:F^{G^{A}}\rightarrow F^{A} & =\text{ftr}(m^{G^{A}}\rightarrow m)\\ +\text{ftr}\,\big(f^{A\rightarrow G^{B}}\big) & =\text{fmap}\,f\bef\text{tr} \end{align*} \end_inset @@ -3884,7 +3882,7 @@ status open \begin_inset Formula \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{G^{B}}\ar[rd]\sp(0.5){\ \text{tr}\ }\\ -F^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\Rightarrow G^{B}}\ }\ar[rr]\sb(0.5){\text{ftr}\,\big(f^{A\Rightarrow G^{B}}\big)\,} & & F^{B} +F^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\rightarrow G^{B}}\ }\ar[rr]\sb(0.5){\text{ftr}\,\big(f^{A\rightarrow G^{B}}\big)\,} & & F^{B} } \] @@ -4067,7 +4065,7 @@ lifting \end_inset -\begin_inset Formula $q^{A\Rightarrow B}$ +\begin_inset Formula $q^{A\rightarrow B}$ \end_inset to @@ -4220,7 +4218,7 @@ Parametricity theorem pure, fully parametric \emph default code for a function of type -\begin_inset Formula $F^{A}\Rightarrow G^{A}$ +\begin_inset Formula $F^{A}\rightarrow G^{A}$ \end_inset will implement a natural transformation @@ -4315,7 +4313,7 @@ Option \end_inset ; -\begin_inset Formula $\text{ftn}:1+\left(1+A\right)\Rightarrow1+A$ +\begin_inset Formula $\text{ftn}:1+\left(1+A\right)\rightarrow1+A$ \end_inset @@ -4335,7 +4333,7 @@ Either \end_inset ; -\begin_inset Formula $\text{ftn}:Z+\left(Z+A\right)\Rightarrow Z+A$ +\begin_inset Formula $\text{ftn}:Z+\left(Z+A\right)\rightarrow Z+A$ \end_inset @@ -4355,7 +4353,7 @@ List \end_inset ; -\begin_inset Formula $\text{ftn}:\text{List}^{\text{List}^{A}}\Rightarrow\text{List}^{A}$ +\begin_inset Formula $\text{ftn}:\text{List}^{\text{List}^{A}}\rightarrow\text{List}^{A}$ \end_inset @@ -4367,7 +4365,7 @@ Writer monad: \end_inset ; -\begin_inset Formula $\text{ftn}:\left(A\times W\right)\times W\Rightarrow A\times W$ +\begin_inset Formula $\text{ftn}:\left(A\times W\right)\times W\rightarrow A\times W$ \end_inset @@ -4375,11 +4373,11 @@ Writer monad: \begin_layout Standard Reader monad: -\begin_inset Formula $F^{A}\equiv R\Rightarrow A$ +\begin_inset Formula $F^{A}\equiv R\rightarrow A$ \end_inset ; -\begin_inset Formula $\text{ftn}:\left(R\Rightarrow\left(R\Rightarrow A\right)\right)\Rightarrow R\Rightarrow A$ +\begin_inset Formula $\text{ftn}:\left(R\rightarrow\left(R\rightarrow A\right)\right)\rightarrow R\rightarrow A$ \end_inset @@ -4387,11 +4385,11 @@ Reader monad: \begin_layout Standard State: -\begin_inset Formula $F^{A}\equiv S\Rightarrow A\times S$ +\begin_inset Formula $F^{A}\equiv S\rightarrow A\times S$ \end_inset ; -\begin_inset Formula $\text{ftn}:\left(S\Rightarrow\left(S\Rightarrow A\times S\right)\times S\right)\Rightarrow S\Rightarrow A\times S$ +\begin_inset Formula $\text{ftn}:\left(S\rightarrow\left(S\rightarrow A\times S\right)\times S\right)\rightarrow S\rightarrow A\times S$ \end_inset @@ -4399,11 +4397,11 @@ State: \begin_layout Standard Continuation monad: -\begin_inset Formula $F^{A}\equiv\left(A\Rightarrow R\right)\Rightarrow R$ +\begin_inset Formula $F^{A}\equiv\left(A\rightarrow R\right)\rightarrow R$ \end_inset ; -\begin_inset Formula $\text{ftn}:\left(\left(\left(\left(A\Rightarrow R\right)\Rightarrow R\right)\Rightarrow R\right)\Rightarrow R\right)\Rightarrow\left(A\Rightarrow R\right)\Rightarrow R$ +\begin_inset Formula $\text{ftn}:\left(\left(\left(\left(A\rightarrow R\right)\rightarrow R\right)\rightarrow R\right)\rightarrow R\right)\rightarrow\left(A\rightarrow R\right)\rightarrow R$ \end_inset @@ -4553,7 +4551,7 @@ empty context available: \begin_inset Formula \[ -\text{pure}:A\Rightarrow M^{A} +\text{pure}:A\rightarrow M^{A} \] \end_inset @@ -4680,7 +4678,7 @@ z \size footnotesize \color blue pure(x).flatMap(y -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset cont(y)) = cont(x) @@ -4803,7 +4801,7 @@ y = x \end_inset cont.flatMap(x -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset pure(x)) @@ -4871,8 +4869,8 @@ pure \begin_inset Formula \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{5pc} & B\ar[rd]\sp(0.5){\ \text{pure}^{\left[B\right]}}\\ -A\ar[ru]\sp(0.5){f^{A\Rightarrow B}\ }\ar[rd]\sb(0.5){\text{pure}^{[A]}\,} & & S^{B}\\ - & S^{A}\ar[ru]\sb(0.5){\text{fmap}\,f^{A\Rightarrow B}} +A\ar[ru]\sp(0.5){f^{A\rightarrow B}\ }\ar[rd]\sb(0.5){\text{pure}^{[A]}\,} & & S^{B}\\ + & S^{A}\ar[ru]\sb(0.5){\text{fmap}\,f^{A\rightarrow B}} } \] @@ -4909,7 +4907,7 @@ S^{A}\ar[ru]\sp(0.5){\text{pure}^{[S^{A}]}\ }\ar[rr]\sb(0.5){\text{id}} & & S^{ \begin_layout Standard Right identity: -\begin_inset Formula $\text{flm}\left(\text{pure}\right)=\text{fmap}\left(\text{pure}\right)\bef\text{ftn}=\text{id}^{S^{A}\Rightarrow S^{A}}$ +\begin_inset Formula $\text{flm}\left(\text{pure}\right)=\text{fmap}\left(\text{pure}\right)\bef\text{ftn}=\text{id}^{S^{A}\rightarrow S^{A}}$ \end_inset @@ -4950,7 +4948,7 @@ fmapOpt \begin_layout Standard type signature of -\begin_inset Formula $\text{fmapOpt}:\left(A\Rightarrow1+B\right)\Rightarrow S^{A}\Rightarrow S^{B}$ +\begin_inset Formula $\text{fmapOpt}:\left(A\rightarrow1+B\right)\rightarrow S^{A}\rightarrow S^{B}$ \end_inset @@ -4958,7 +4956,7 @@ type signature of \begin_layout Standard and then we had to compose functions of types -\begin_inset Formula $A\Rightarrow1+B$ +\begin_inset Formula $A\rightarrow1+B$ \end_inset via @@ -4972,7 +4970,7 @@ and then we had to compose functions of types Here we have \size small -\begin_inset Formula $\text{flm}:\left(A\Rightarrow S^{B}\right)\Rightarrow S^{A}\Rightarrow S^{B}$ +\begin_inset Formula $\text{flm}:\left(A\rightarrow S^{B}\right)\rightarrow S^{A}\rightarrow S^{B}$ \end_inset @@ -5002,7 +5000,7 @@ twisted \end_inset type, -\begin_inset Formula $A\Rightarrow S^{B}$ +\begin_inset Formula $A\rightarrow S^{B}$ \end_inset ? @@ -5018,7 +5016,7 @@ Use Kleisli composition \series default : -\begin_inset Formula $f^{A\Rightarrow S^{B}}\diamond g^{B\Rightarrow S^{C}}\equiv f\bef\text{flm}\,g$ +\begin_inset Formula $f^{A\rightarrow S^{B}}\diamond g^{B\rightarrow S^{C}}\equiv f\bef\text{flm}\,g$ \end_inset @@ -5034,7 +5032,7 @@ Kleisli identity \end_inset of type -\begin_inset Formula $A\Rightarrow S^{A}$ +\begin_inset Formula $A\rightarrow S^{A}$ \end_inset as @@ -5078,11 +5076,11 @@ lifting \end_inset of -\begin_inset Formula $A\Rightarrow S^{B}$ +\begin_inset Formula $A\rightarrow S^{B}$ \end_inset to -\begin_inset Formula $S^{A}\Rightarrow S^{B}$ +\begin_inset Formula $S^{A}\rightarrow S^{B}$ \end_inset @@ -5282,7 +5280,7 @@ plain functions \begin_inset Text \begin_layout Plain Layout -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset @@ -5294,7 +5292,7 @@ plain functions \begin_inset Text \begin_layout Plain Layout -\begin_inset Formula $\text{id}:A\Rightarrow A$ +\begin_inset Formula $\text{id}:A\rightarrow A$ \end_inset @@ -5306,7 +5304,7 @@ plain functions \begin_inset Text \begin_layout Plain Layout -\begin_inset Formula $f^{A\Rightarrow B}\bef g^{B\Rightarrow C}$ +\begin_inset Formula $f^{A\rightarrow B}\bef g^{B\rightarrow C}$ \end_inset @@ -5333,7 +5331,7 @@ lifted to \begin_inset Text \begin_layout Plain Layout -\begin_inset Formula $F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $F^{A}\rightarrow F^{B}$ \end_inset @@ -5345,7 +5343,7 @@ lifted to \begin_inset Text \begin_layout Plain Layout -\begin_inset Formula $\text{id}:F^{A}\Rightarrow F^{A}$ +\begin_inset Formula $\text{id}:F^{A}\rightarrow F^{A}$ \end_inset @@ -5357,7 +5355,7 @@ lifted to \begin_inset Text \begin_layout Plain Layout -\begin_inset Formula $f^{F^{A}\Rightarrow F^{B}}\bef g^{F^{B}\Rightarrow F^{C}}$ +\begin_inset Formula $f^{F^{A}\rightarrow F^{B}}\bef g^{F^{B}\rightarrow F^{C}}$ \end_inset @@ -5384,7 +5382,7 @@ Kleisli over \begin_inset Text \begin_layout Plain Layout -\begin_inset Formula $A\Rightarrow F^{B}$ +\begin_inset Formula $A\rightarrow F^{B}$ \end_inset @@ -5396,7 +5394,7 @@ Kleisli over \begin_inset Text \begin_layout Plain Layout -\begin_inset Formula $\text{pure}:A\Rightarrow F^{A}$ +\begin_inset Formula $\text{pure}:A\rightarrow F^{A}$ \end_inset @@ -5408,7 +5406,7 @@ Kleisli over \begin_inset Text \begin_layout Plain Layout -\begin_inset Formula $f^{A\Rightarrow F^{B}}\diamond g^{B\Rightarrow F^{C}}$ +\begin_inset Formula $f^{A\rightarrow F^{B}}\diamond g^{B\rightarrow F^{C}}$ \end_inset @@ -5611,7 +5609,7 @@ flatMap \begin_layout Standard The Kleisli functions, -\begin_inset Formula $A\rightsquigarrow B\equiv A\Rightarrow S^{B}$ +\begin_inset Formula $A\rightsquigarrow B\equiv A\rightarrow S^{B}$ \end_inset , form a category iff @@ -5653,7 +5651,7 @@ flatMap through Kleisli: \size small -\begin_inset Formula $\text{flm}\,f^{A\Rightarrow S^{B}}\equiv\text{id}^{S^{A}\Rightarrow S^{A}}\diamond f$ +\begin_inset Formula $\text{flm}\,f^{A\rightarrow S^{B}}\equiv\text{id}^{S^{A}\rightarrow S^{A}}\diamond f$ \end_inset @@ -5679,7 +5677,7 @@ Require two additional laws that connect Left naturality: \size small -\begin_inset Formula $f^{A\Rightarrow B}\bef g^{B\Rightarrow S^{C}}=\left(f\bef\text{pure}\right)\diamond g$ +\begin_inset Formula $f^{A\rightarrow B}\bef g^{B\rightarrow S^{C}}=\left(f\bef\text{pure}\right)\diamond g$ \end_inset @@ -5689,7 +5687,7 @@ Left naturality: Right naturality: \size small -\begin_inset Formula $f^{A\Rightarrow S^{B}}\bef\text{fmap}\,g^{B\Rightarrow C}=f\diamond\left(g\bef\text{pure}\right)$ +\begin_inset Formula $f^{A\rightarrow S^{B}}\bef\text{fmap}\,g^{B\rightarrow C}=f\diamond\left(g\bef\text{pure}\right)$ \end_inset @@ -5705,7 +5703,7 @@ fmap \size default \color inherit through Kleisli: -\begin_inset Formula $\text{fmap}\,g^{A\Rightarrow B}\equiv\text{id}^{S^{A}\Rightarrow S^{A}}\diamond\left(g\bef\text{pure}\right)$ +\begin_inset Formula $\text{fmap}\,g^{A\rightarrow B}\equiv\text{id}^{S^{A}\rightarrow S^{A}}\diamond\left(g\bef\text{pure}\right)$ \end_inset @@ -5801,7 +5799,7 @@ flatten \size default \color inherit : -\begin_inset Formula $\text{ftn}=\text{id}^{S^{S^{A}}\Rightarrow S^{S^{A}}}\diamond\text{id}^{S^{A}\Rightarrow S^{A}}$ +\begin_inset Formula $\text{ftn}=\text{id}^{S^{S^{A}}\rightarrow S^{S^{A}}}\diamond\text{id}^{S^{A}\rightarrow S^{A}}$ \end_inset @@ -5914,7 +5912,7 @@ Any type \begin_layout Standard The function type -\begin_inset Formula $A\Rightarrow A$ +\begin_inset Formula $A\rightarrow A$ \end_inset is a monoid (for any type @@ -6043,7 +6041,7 @@ action \end_inset is -\begin_inset Formula $\alpha:S\Rightarrow P\Rightarrow P$ +\begin_inset Formula $\alpha:S\rightarrow P\rightarrow P$ \end_inset such that @@ -6066,7 +6064,7 @@ twisted product. \end_inset Examples: -\begin_inset Formula $\left(A\Rightarrow A\right)\times A$ +\begin_inset Formula $\left(A\rightarrow A\right)\times A$ \end_inset ; @@ -6201,7 +6199,7 @@ not \end_layout \begin_layout Standard -\begin_inset Formula $F^{A}\equiv R\Rightarrow G^{A}$ +\begin_inset Formula $F^{A}\equiv R\rightarrow G^{A}$ \end_inset is a (semi)monad for any (semi)monad @@ -6284,7 +6282,7 @@ Semimonad-only \end_layout \begin_layout Standard -\begin_inset Formula $F^{A}\equiv H^{A}\Rightarrow A\times G^{A}$ +\begin_inset Formula $F^{A}\equiv H^{A}\rightarrow A\times G^{A}$ \end_inset for any contrafunctor @@ -6308,7 +6306,7 @@ Obtain a full monad only when \end_inset -\begin_inset Formula $F^{A}\equiv H^{A}\Rightarrow A$ +\begin_inset Formula $F^{A}\equiv H^{A}\rightarrow A$ \end_inset @@ -6379,7 +6377,7 @@ route \end_inset as -\begin_inset Formula $R\equiv Q\Rightarrow\left(E+S\right)$ +\begin_inset Formula $R\equiv Q\rightarrow\left(E+S\right)$ \end_inset , where @@ -6460,11 +6458,11 @@ If are arbitrary fixed types, which of the functors can be made into a semimonad: -\begin_inset Formula $F^{A}\equiv W\times\left(R\Rightarrow A\right)$ +\begin_inset Formula $F^{A}\equiv W\times\left(R\rightarrow A\right)$ \end_inset , -\begin_inset Formula $G^{A}=R\Rightarrow\left(W\times A\right)$ +\begin_inset Formula $G^{A}=R\rightarrow\left(W\times A\right)$ \end_inset ? @@ -6472,7 +6470,7 @@ If \begin_layout Standard Show that -\begin_inset Formula $F^{A}\equiv\left(P\Rightarrow A\right)+\left(Q\Rightarrow A\right)$ +\begin_inset Formula $F^{A}\equiv\left(P\rightarrow A\right)+\left(Q\rightarrow A\right)$ \end_inset is not a semimonad (cannot define @@ -6573,7 +6571,7 @@ fmap method for \size footnotesize -\begin_inset Formula $F^{A}\equiv A\times\left(A\Rightarrow Z\right)$ +\begin_inset Formula $F^{A}\equiv A\times\left(A\rightarrow Z\right)$ \end_inset @@ -6587,19 +6585,19 @@ as \size footnotesize \color blue def fmap[A,B](f: A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset B): ((A, A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Z)) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset (B, B -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Z) = @@ -6611,11 +6609,11 @@ Z) = \size footnotesize \color blue { case (a, az) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset (f(a), (_: B) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset az(a)) } @@ -6659,7 +6657,7 @@ pure \size default \color inherit for -\begin_inset Formula $F^{A}\equiv A+\left(R\Rightarrow A\right)$ +\begin_inset Formula $F^{A}\equiv A+\left(R\rightarrow A\right)$ \end_inset , where @@ -6683,7 +6681,7 @@ pure \size footnotesize \color blue a -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Right(Monad[G].pure(a)) @@ -6703,7 +6701,7 @@ Left(a) \begin_layout Standard Implement the monad methods for -\begin_inset Formula $F^{A}\equiv\left(Z\Rightarrow1+A\right)\times\text{List}^{A}$ +\begin_inset Formula $F^{A}\equiv\left(Z\rightarrow1+A\right)\times\text{List}^{A}$ \end_inset using the known monad constructions (no need to check the laws). @@ -6796,7 +6794,7 @@ Any polynomial functor into monoids. Then the monads -\begin_inset Formula $E_{n}\Rightarrow A$ +\begin_inset Formula $E_{n}\rightarrow A$ \end_inset (reader) and @@ -6848,15 +6846,15 @@ An example of combining natural transformations: Given functors \end_inset and natural transformations -\begin_inset Formula $C^{A}\Rightarrow F^{A}$ +\begin_inset Formula $C^{A}\rightarrow F^{A}$ \end_inset and -\begin_inset Formula $C^{A}\Rightarrow G^{A}$ +\begin_inset Formula $C^{A}\rightarrow G^{A}$ \end_inset and taking the product, we get a natural transformation -\begin_inset Formula $C^{A}\Rightarrow F^{A}\times G^{A}$ +\begin_inset Formula $C^{A}\rightarrow F^{A}\times G^{A}$ \end_inset . @@ -6918,11 +6916,11 @@ Two monadic values \begin_layout Standard A curious example: The functor -\begin_inset Formula $Q^{A}\equiv\left(A\Rightarrow Z\right)\Rightarrow1+A$ +\begin_inset Formula $Q^{A}\equiv\left(A\rightarrow Z\right)\rightarrow1+A$ \end_inset is not a monad (and not even a lawful applicative) but -\begin_inset Formula $M^{A}\equiv\left(A\Rightarrow1+1\right)\Rightarrow1+A$ +\begin_inset Formula $M^{A}\equiv\left(A\rightarrow1+1\right)\rightarrow1+A$ \end_inset is a @@ -6943,7 +6941,7 @@ selector monad \end_inset is -\begin_inset Formula $\left(A\Rightarrow P^{1}\right)\Rightarrow P^{A}$ +\begin_inset Formula $\left(A\rightarrow P^{1}\right)\rightarrow P^{A}$ \end_inset for any functor diff --git a/sofp-src/sofp-monads.tex b/sofp-src/sofp-monads.tex index da200c8b5..8d6977872 100644 --- a/sofp-src/sofp-monads.tex +++ b/sofp-src/sofp-monads.tex @@ -33,11 +33,11 @@ \subsection{Computations within a functor context: Semimonads} \end{minipage}\texttt{\textcolor{blue}{\footnotesize{}}}% \begin{minipage}[t]{0.49\columnwidth}% \begin{lyxcode} -\textcolor{blue}{\footnotesize{}(1~to~n).flatMap~\{~i~$\Rightarrow$}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}(1~to~n).flatMap~\{~i~$\rightarrow$}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}~~~(1~to~n).flatMap~\{~j~$\Rightarrow$}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}~~~(1~to~n).flatMap~\{~j~$\rightarrow$}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}~~~~~(1~to~n).map~\{~k~$\Rightarrow$}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}~~~~~(1~to~n).map~\{~k~$\rightarrow$}{\footnotesize\par} \textcolor{blue}{\footnotesize{}~~~~~~~f(i,~j,~k)}{\footnotesize\par} @@ -58,15 +58,15 @@ \subsection{Computations within a functor context: Semimonads} as replacement of \texttt{\textcolor{blue}{\footnotesize{}map() $\circ$ flatten}} -\texttt{\textcolor{blue}{\footnotesize{}(1 to n).map(j $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{}(1 to n).map(j $\rightarrow$ ...).flatten}} is \texttt{\textcolor{blue}{\footnotesize{}(1 to n).flatMap(j -$\Rightarrow$ ...)}} +$\rightarrow$ ...)}} Functors having \texttt{\textcolor{blue}{\footnotesize{}flatMap}}/\texttt{\textcolor{blue}{\footnotesize{}flatten}} are ``flattenable'' or \textbf{semimonads} Most of them also have method \texttt{\textcolor{blue}{\footnotesize{}pure:\ A -$\Rightarrow$ F{[}A{]}}} and so are \textbf{monads} +$\rightarrow$ F{[}A{]}}} and so are \textbf{monads} The method \texttt{\textcolor{blue}{\footnotesize{}pure}} is not relevant in the functor block @@ -79,11 +79,11 @@ \subsection{How \texttt{\textcolor{blue}{\footnotesize{}flatMap}} works with lists} consider \texttt{\textcolor{blue}{\footnotesize{}List(x1, x2, x3).flatMap(x -$\Rightarrow$ f(x))}} +$\rightarrow$ f(x))}} assume that -\texttt{\textcolor{blue}{\footnotesize{}f: X $\Rightarrow$ List{[}Y{]}}}{\footnotesize\par} +\texttt{\textcolor{blue}{\footnotesize{}f: X $\rightarrow$ List{[}Y{]}}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}f(x1) = List(y0, y1)}}{\footnotesize\par} @@ -134,13 +134,13 @@ \subsection{What is \texttt{\textcolor{blue}{\footnotesize{}flatMap}} doing with \begin{lyxcode} \textcolor{blue}{\footnotesize{}val~result~=~\{}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}~~(1~to~m).flatMap~\{~i~$\Rightarrow$}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}~~(1~to~m).flatMap~\{~i~$\rightarrow$}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}~~~~(1~to~n).flatMap~\{~j~$\Rightarrow$}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}~~~~(1~to~n).flatMap~\{~j~$\rightarrow$}{\footnotesize\par} \textcolor{blue}{\footnotesize{}~~~~~~val~x~=~f(i,~j)}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}~~~~~~(1~to~p).map~\{~k~$\Rightarrow$}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}~~~~~~(1~to~p).map~\{~k~$\rightarrow$}{\footnotesize\par} \textcolor{blue}{\footnotesize{}~~~~~~~~val~y~=~g(i,~j,~k)}{\footnotesize\par} @@ -177,8 +177,8 @@ \subsection{What is \texttt{\textcolor{blue}{\footnotesize{}flatMap}} doing with ``Tree-like'' containers, e.g.\ can hold only $3$, $6$, $9$, $12$, ...\ elements -``Non-standard'' containers: $F^{A}\equiv\text{String}\Rightarrow A$; -$F^{A}\equiv\left(A\Rightarrow\text{Int}\right)\Rightarrow\text{Int}$ +``Non-standard'' containers: $F^{A}\equiv\text{String}\rightarrow A$; +$F^{A}\equiv\left(A\rightarrow\text{Int}\right)\rightarrow\text{Int}$ \subsection{Worked examples I: List-like monads} @@ -336,7 +336,7 @@ \subsection{Worked examples III: Tree-like monads} How \texttt{\textcolor{blue}{\footnotesize{}flatMap}} works for a binary tree: assume \texttt{\textcolor{blue}{\footnotesize{}f:\ A -$\Rightarrow$ Tree{[}B{]}}} and +$\rightarrow$ Tree{[}B{]}}} and \texttt{\textcolor{blue}{\footnotesize{}tree1}} = \Tree[ [ $a_1$ ] [ [ $a_2$ ] [ $a_3$ ] ] ] ; $f(a_{1})=$ \Tree[ [ $b_0$ ] [ $b_1$ ] ] ; $f(a_{2})=b_{2}$; @@ -382,24 +382,24 @@ \subsection{Worked examples IV: Single-value monads} \texttt{\textcolor{blue}{\footnotesize{}Reader}}: Read-only context, or dependency injection -$\text{Reader}^{A}\equiv E\Rightarrow A$ where $E$ represents the +$\text{Reader}^{A}\equiv E\rightarrow A$ where $E$ represents the ``environment'' \texttt{\textcolor{blue}{\footnotesize{}Eval}}: Perform a sequence of lazy or memoized computations -$\text{Eval}^{A}\equiv A+\left(1\Rightarrow A\right)$ +$\text{Eval}^{A}\equiv A+\left(1\rightarrow A\right)$ \texttt{\textcolor{blue}{\footnotesize{}Cont}}: A chain of asynchronous operations -$\text{Cont}^{A}\equiv\left(A\Rightarrow R\right)\Rightarrow R$ where +$\text{Cont}^{A}\equiv\left(A\rightarrow R\right)\rightarrow R$ where $R$ is the fixed ``result'' type \texttt{\textcolor{blue}{\footnotesize{}State}}: A sequence of steps that update state while returning results -$\text{State}^{A}\equiv S\Rightarrow A\times S$ where $S$ is the +$\text{State}^{A}\equiv S\rightarrow A\times S$ where $S$ is the fixed ``state'' value type @@ -411,13 +411,13 @@ \subsection{Deriving the types of single-value monads} We want previous values to be transformed via \texttt{\textcolor{blue}{\footnotesize{}flatMap}} to next values -\texttt{\textcolor{blue}{\footnotesize{}Writer}}: a computation $\left(A\Rightarrow B\right)$ +\texttt{\textcolor{blue}{\footnotesize{}Writer}}: a computation $\left(A\rightarrow B\right)$ and some info ($W$) about it -$x^{A}\Rightarrow f(x):B$ and $x^{A}\Rightarrow g(x):W$; the type -is $\left(A\Rightarrow B\right)\times\left(A\Rightarrow W\right)$ +$x^{A}\rightarrow f(x):B$ and $x^{A}\rightarrow g(x):W$; the type +is $\left(A\rightarrow B\right)\times\left(A\rightarrow W\right)$ -this function should have type $A\Rightarrow\text{Writer}^{B}$, hence +this function should have type $A\rightarrow\text{Writer}^{B}$, hence $\text{Writer}^{B}\equiv B\times W$ use the ``arithmetic'' Curry-Howard to transform types: $b^{a}w^{a}=(bw)^{a}$ @@ -425,34 +425,34 @@ \subsection{Deriving the types of single-value monads} \texttt{\textcolor{blue}{\footnotesize{}Reader}}: Read-only context, or ``environment'' of type $E$ -$x^{A}\Rightarrow f(r,x):B$ where $r^{E}$ is fixed; the type is -$A\times E\Rightarrow B$ +$x^{A}\rightarrow f(r,x):B$ where $r^{E}$ is fixed; the type is +$A\times E\rightarrow B$ -this function should have type $A\Rightarrow\text{Reader}^{B}$, hence -$\text{Reader}^{B}\equiv E\Rightarrow B$ +this function should have type $A\rightarrow\text{Reader}^{B}$, hence +$\text{Reader}^{B}\equiv E\rightarrow B$ we used the ``arithmetic'' Curry-Howard to transform $b^{ae}=(b^{e})^{a}$ \texttt{\textcolor{blue}{\footnotesize{}Cont}}: A computation that registers an asynchronous callback -$x^{A}\Rightarrow f(cb):1$ where $cb:B\Rightarrow1$ (usually, callbacks +$x^{A}\rightarrow f(cb):1$ where $cb:B\rightarrow1$ (usually, callbacks return \texttt{\textcolor{blue}{\footnotesize{}Unit}}) -the type is{\footnotesize{} $A\Rightarrow\left(B\Rightarrow1\right)\Rightarrow1$}; -this function should have type {\footnotesize{}$A\Rightarrow\text{Cont}^{B}$}, -hence{\footnotesize{} $\text{Cont}^{B}\equiv\left(B\Rightarrow1\right)\Rightarrow1$}{\footnotesize\par} +the type is{\footnotesize{} $A\rightarrow\left(B\rightarrow1\right)\rightarrow1$}; +this function should have type {\footnotesize{}$A\rightarrow\text{Cont}^{B}$}, +hence{\footnotesize{} $\text{Cont}^{B}\equiv\left(B\rightarrow1\right)\rightarrow1$}{\footnotesize\par} -generalize to {\footnotesize{}$\text{Cont}^{A}\equiv\left(A\Rightarrow R\right)\Rightarrow R$ +generalize to {\footnotesize{}$\text{Cont}^{A}\equiv\left(A\rightarrow R\right)\rightarrow R$ }where $R$ is a fixed ``result'' type \texttt{\textcolor{blue}{\footnotesize{}State}}: A computation can update state ($S$) while producing a result -$x^{A}\Rightarrow f(x,s)$ and $s^{S}:=g(x,s)$; the type is{\footnotesize{} -$\left(A\times S\Rightarrow B\right)\times\left(A\times S\Rightarrow S\right)$}{\footnotesize\par} +$x^{A}\rightarrow f(x,s)$ and $s^{S}:=g(x,s)$; the type is{\footnotesize{} +$\left(A\times S\rightarrow B\right)\times\left(A\times S\rightarrow S\right)$}{\footnotesize\par} -this will be $A\Rightarrow\text{State}^{B}$ if {\footnotesize{}$\text{State}^{B}\equiv\left(S\Rightarrow B\right)\times\left(S\Rightarrow S\right)\equiv S\Rightarrow B\times S$ }{\footnotesize\par} +this will be $A\rightarrow\text{State}^{B}$ if {\footnotesize{}$\text{State}^{B}\equiv\left(S\rightarrow B\right)\times\left(S\rightarrow S\right)\equiv S\rightarrow B\times S$ }{\footnotesize\par} we used the ``arithmetic'' Curry-Howard: $b^{as}s^{as}=(b^{s}s^{s})^{a}=\left(\left(bs\right)^{s}\right)^{a}$ @@ -473,13 +473,13 @@ \subsection{Exercises I} use it to compute $1+2+...+100$ via \texttt{\textcolor{blue}{\footnotesize{}for}}/\texttt{\textcolor{blue}{\footnotesize{}yield}} and verify the result. E.g.\ implement: -\texttt{\textcolor{blue}{\footnotesize{}const: Int $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{}const: Int $\rightarrow$ Future{[}Int{]}}}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{}add(x: Int): Int $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{}add(x: Int): Int $\rightarrow$ Future{[}Int{]}}}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{}isEqual(x: Int): Int $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{}isEqual(x: Int): Int $\rightarrow$ Future{[}Boolean{]} }}{\footnotesize\par} Read a file into a string and write it to another file using Java @@ -488,7 +488,7 @@ \subsection{Exercises I} and \texttt{\textcolor{blue}{\footnotesize{}for}}/\texttt{\textcolor{blue}{\footnotesize{}yield}} to make this safe. -Given a semigroup $W$, make a semimonad out of $F^{A}\equiv E\Rightarrow A\times W$ +Given a semigroup $W$, make a semimonad out of $F^{A}\equiv E\rightarrow A\times W$ Implement a semimonad instance for the (recursive) type constructor $F^{A}=A+A\times A+F^{A}+F^{A}\times F^{A}$ @@ -524,7 +524,7 @@ \subsection{Semimonad laws I: The intuitions} \begin{lyxcode} \textcolor{blue}{\footnotesize{}y~$\leftarrow$~cont1}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}~~~~~~.map(x~$\Rightarrow$~f(x))}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}~~~~~~.map(x~$\rightarrow$~f(x))}{\footnotesize\par} \textcolor{blue}{\footnotesize{}z~$\leftarrow$~cont2(y)}{\footnotesize\par} \end{lyxcode} @@ -532,8 +532,8 @@ \subsection{Semimonad laws I: The intuitions} \end{minipage}\texttt{\textcolor{blue}{\footnotesize{}\hfill{}\medskip{} }}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{}cont1.flatMap(x $\Rightarrow$ -cont2(f(x))) = cont1.map(f).flatMap(y $\Rightarrow$ cont2(y))}} +\texttt{\textcolor{blue}{\footnotesize{}cont1.flatMap(x $\rightarrow$ +cont2(f(x))) = cont1.map(f).flatMap(y $\rightarrow$ cont2(y))}} Manipulating items in container is preceded by a generator: @@ -559,7 +559,7 @@ \subsection{Semimonad laws I: The intuitions} % \end{minipage}\texttt{\textcolor{blue}{\footnotesize{}\hfill{}\medskip{} cont1.flatMap(cont2).map(f)}} \texttt{\textcolor{blue}{\footnotesize{}= -cont1.flatMap(x $\Rightarrow$ cont2(x).map(f))}} +cont1.flatMap(x $\rightarrow$ cont2(x).map(f))}} Within a generator, \texttt{\textcolor{blue}{\footnotesize{}for \{...\} yield}} can be inlined: @@ -585,39 +585,39 @@ \subsection{Semimonad laws I: The intuitions} \end{lyxcode} % \end{minipage}\texttt{\textcolor{blue}{\footnotesize{}\hfill{}\medskip{} -cont.flatMap(x $\Rightarrow$ p(x).flatMap(cont2)) = cont.flatMap(p).flatMap(cont2)}} +cont.flatMap(x $\rightarrow$ p(x).flatMap(cont2)) = cont.flatMap(p).flatMap(cont2)}} \subsection{Semimonad laws II: The laws for \texttt{\textcolor{blue}{\footnotesize{}flatMap}} } For brevity, write {\footnotesize{}$\text{flm}$} instead of \texttt{\textcolor{blue}{\footnotesize{}flatMap}} -A \textbf{semimonad} $S^{A}$ has {\footnotesize{}$\text{flm}^{\left[A,B\right]}:\left(A\Rightarrow S^{B}\right)\Rightarrow S^{A}\Rightarrow S^{B}$} +A \textbf{semimonad} $S^{A}$ has {\footnotesize{}$\text{flm}^{\left[A,B\right]}:\left(A\rightarrow S^{B}\right)\rightarrow S^{A}\rightarrow S^{B}$} with 3 laws: -{\footnotesize{}$\text{flm}\,(f^{A\Rightarrow B}\bef g^{B\Rightarrow S^{C}})=\text{fmap}\,f\bef\text{flm}\,g$} +{\footnotesize{}$\text{flm}\,(f^{A\rightarrow B}\bef g^{B\rightarrow S^{C}})=\text{fmap}\,f\bef\text{flm}\,g$} {\footnotesize{}(naturality in $A$)} {\footnotesize{} \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & S^{B}\ar[rd]\sp(0.5){\ \text{flm}\,g^{B\Rightarrow S^{C}}}\\ -S^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\Rightarrow B}\ }\ar[rr]\sb(0.5){\text{flm}\,(f^{A\Rightarrow B}\bef\,g^{B\Rightarrow S^{C}})\,} & & S^{C} +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & S^{B}\ar[rd]\sp(0.5){\ \text{flm}\,g^{B\rightarrow S^{C}}}\\ +S^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\rightarrow B}\ }\ar[rr]\sb(0.5){\text{flm}\,(f^{A\rightarrow B}\bef\,g^{B\rightarrow S^{C}})\,} & & S^{C} } \] }{\footnotesize\par} -{\footnotesize{}$\text{flm}\,\big(f^{A\Rightarrow S^{B}}\bef\text{fmap}\,g^{B\Rightarrow C}\big)=\text{flm}\,f\bef\text{fmap}\,g$} +{\footnotesize{}$\text{flm}\,\big(f^{A\rightarrow S^{B}}\bef\text{fmap}\,g^{B\rightarrow C}\big)=\text{flm}\,f\bef\text{fmap}\,g$} {\footnotesize{}(naturality in $B$)} {\footnotesize{} \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & S^{B}\ar[rd]\sp(0.5){\ \text{fmap}\,g^{B\Rightarrow C}}\\ -S^{A}\ar[ru]\sp(0.5){\text{flm}\,f^{A\Rightarrow S^{B}}\ }\ar[rr]\sb(0.5){\text{flm}\,(f^{A\Rightarrow S^{B}}\bef\,\text{fmap}\,g^{B\Rightarrow C})\,} & & S^{C} +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & S^{B}\ar[rd]\sp(0.5){\ \text{fmap}\,g^{B\rightarrow C}}\\ +S^{A}\ar[ru]\sp(0.5){\text{flm}\,f^{A\rightarrow S^{B}}\ }\ar[rr]\sb(0.5){\text{flm}\,(f^{A\rightarrow S^{B}}\bef\,\text{fmap}\,g^{B\rightarrow C})\,} & & S^{C} } \] }{\footnotesize\par} -{\footnotesize{}$\text{flm}\,\big(f^{A\Rightarrow S^{B}}\bef\text{flm}\,g^{B\Rightarrow S^{C}}\big)=\text{flm}\,f\bef\text{flm}\,g$} +{\footnotesize{}$\text{flm}\,\big(f^{A\rightarrow S^{B}}\bef\text{flm}\,g^{B\rightarrow S^{C}}\big)=\text{flm}\,f\bef\text{flm}\,g$} {\footnotesize{}(associativity)} {\footnotesize{} \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & S^{B}\ar[rd]\sp(0.5){\ \text{flm}\,g^{B\Rightarrow S^{C}}}\\ -S^{A}\ar[ru]\sp(0.5){\text{flm}\,f^{A\Rightarrow S^{B}}\ }\ar[rr]\sb(0.5){\text{flm}\,\big(f^{A\Rightarrow S^{B}}\bef\,\text{flm}\,g^{B\Rightarrow S^{C}}\big)\,} & & S^{C} +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & S^{B}\ar[rd]\sp(0.5){\ \text{flm}\,g^{B\rightarrow S^{C}}}\\ +S^{A}\ar[ru]\sp(0.5){\text{flm}\,f^{A\rightarrow S^{B}}\ }\ar[rr]\sb(0.5){\text{flm}\,\big(f^{A\rightarrow S^{B}}\bef\,\text{flm}\,g^{B\rightarrow S^{C}}\big)\,} & & S^{C} } \] }{\footnotesize\par} @@ -633,8 +633,8 @@ \subsection{Semimonad laws III: The laws for \texttt{\textcolor{blue}{\footnotes \begin{minipage}[c][1\totalheight][t]{0.4\columnwidth}% {\footnotesize{} \begin{align*} -\text{ftn}^{\left[A\right]}:S^{S^{A}}\Rightarrow S^{A} & \equiv\text{flm}^{\left[S^{A},A\right]}(m^{S^{A}}\Rightarrow m)\\ -\text{flm}\,\big(f^{A\Rightarrow S^{B}}\big) & \equiv\text{fmap}\,f\bef\text{ftn} +\text{ftn}^{\left[A\right]}:S^{S^{A}}\rightarrow S^{A} & \equiv\text{flm}^{\left[S^{A},A\right]}(m^{S^{A}}\rightarrow m)\\ +\text{flm}\,\big(f^{A\rightarrow S^{B}}\big) & \equiv\text{fmap}\,f\bef\text{ftn} \end{align*} }% \end{minipage}\texttt{\textcolor{blue}{\footnotesize{}\hfill{}}}% @@ -642,7 +642,7 @@ \subsection{Semimonad laws III: The laws for \texttt{\textcolor{blue}{\footnotes {\footnotesize{} \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & S^{S^{B}}\ar[rd]\sp(0.5){\ \text{ftn}\ }\\ -S^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\Rightarrow S^{B}}\ }\ar[rr]\sb(0.5){\text{flm}\,\big(f^{A\Rightarrow S^{B}}\big)\,} & & S^{B} +S^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\rightarrow S^{B}}\ }\ar[rr]\sb(0.5){\text{flm}\,\big(f^{A\rightarrow S^{B}}\big)\,} & & S^{B} } \] }% @@ -651,12 +651,12 @@ \subsection{Semimonad laws III: The laws for \texttt{\textcolor{blue}{\footnotes It turns out that \texttt{\textcolor{blue}{\footnotesize{}flatten}} has only 2 laws: -{\footnotesize{}$\text{fmap}\big(\text{fmap}\,f^{A\Rightarrow B}\big)\bef\text{ftn}^{\left[B\right]}=\text{ftn}^{\left[A\right]}\bef\text{fmap}\,f$} +{\footnotesize{}$\text{fmap}\big(\text{fmap}\,f^{A\rightarrow B}\big)\bef\text{ftn}^{\left[B\right]}=\text{ftn}^{\left[A\right]}\bef\text{fmap}\,f$} {\footnotesize{}(naturality) \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{5pc} & S^{S^{B}}\ar[rd]\sp(0.5){\ \text{ftn}^{\left[B\right]}}\\ -S^{S^{A}}\ar[ru]\sp(0.5){\text{fmap}\,\big(\text{fmap}\,f^{A\Rightarrow B}\big)\ \ }\ar[rd]\sb(0.5){\text{ftn}^{\left[A\right]}\,} & & S^{B}\\ - & S^{A}\ar[ru]\sb(0.5){\text{fmap}\,f^{A\Rightarrow B}} +S^{S^{A}}\ar[ru]\sp(0.5){\text{fmap}\,\big(\text{fmap}\,f^{A\rightarrow B}\big)\ \ }\ar[rd]\sb(0.5){\text{ftn}^{\left[A\right]}\,} & & S^{B}\\ + & S^{A}\ar[ru]\sb(0.5){\text{fmap}\,f^{A\rightarrow B}} } \] }{\footnotesize\par} @@ -682,10 +682,10 @@ \subsection{Equivalence of a natural transformation and a ``lifting''} Is there a general pattern where two such functions are equivalent? -Let {\footnotesize{}$\text{tr}:F^{G^{A}}\Rightarrow F^{A}$ }be a +Let {\footnotesize{}$\text{tr}:F^{G^{A}}\rightarrow F^{A}$ }be a natural transformation ($F$ and $G$ are functors) -Define {\footnotesize{}$\text{ftr}:\left(A\Rightarrow G^{B}\right)\Rightarrow F^{A}\Rightarrow F^{B}$} +Define {\footnotesize{}$\text{ftr}:\left(A\rightarrow G^{B}\right)\rightarrow F^{A}\rightarrow F^{B}$} by {\footnotesize{}$\text{ftr}\,f=\text{fmap}\,f\bef\text{tr}$} It follows that {\footnotesize{}$\text{tr}=\text{ftr}\left(\text{id}\right)$}, @@ -694,8 +694,8 @@ \subsection{Equivalence of a natural transformation and a ``lifting''} \begin{minipage}[c][1\totalheight][t]{0.4\columnwidth}% {\footnotesize{} \begin{align*} -\text{tr}:F^{G^{A}}\Rightarrow F^{A} & =\text{ftr}(m^{G^{A}}\Rightarrow m)\\ -\text{ftr}\,\big(f^{A\Rightarrow G^{B}}\big) & =\text{fmap}\,f\bef\text{tr} +\text{tr}:F^{G^{A}}\rightarrow F^{A} & =\text{ftr}(m^{G^{A}}\rightarrow m)\\ +\text{ftr}\,\big(f^{A\rightarrow G^{B}}\big) & =\text{fmap}\,f\bef\text{tr} \end{align*} }% \end{minipage}\texttt{\textcolor{blue}{\footnotesize{}\hfill{}}}% @@ -703,7 +703,7 @@ \subsection{Equivalence of a natural transformation and a ``lifting''} {\footnotesize{} \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{G^{B}}\ar[rd]\sp(0.5){\ \text{tr}\ }\\ -F^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\Rightarrow G^{B}}\ }\ar[rr]\sb(0.5){\text{ftr}\,\big(f^{A\Rightarrow G^{B}}\big)\,} & & F^{B} +F^{A}\ar[ru]\sp(0.5){\text{fmap}\,f^{A\rightarrow G^{B}}\ }\ar[rr]\sb(0.5){\text{ftr}\,\big(f^{A\rightarrow G^{B}}\big)\,} & & F^{B} } \] }% @@ -725,7 +725,7 @@ \subsection{Equivalence of a natural transformation and a ``lifting''} \subsection{Semimonad laws IV: Deriving the laws for \texttt{\textcolor{blue}{\footnotesize{}flatten}} } Denote for brevity $q^{\uparrow}\equiv\text{fmap}\,q$ for any function -$q$ (``lifting'' $q^{A\Rightarrow B}$ to $S$) +$q$ (``lifting'' $q^{A\rightarrow B}$ to $S$) Express $\text{flm}\,f=f^{\uparrow}\bef\text{ftn}$ and substitute that into $\text{flm}$'s 3 laws: @@ -754,7 +754,7 @@ \subsection{Semimonad laws IV: Deriving the laws for \texttt{\textcolor{blue}{\f It is usually easy to check naturality! \textbf{Parametricity theorem}: Any \emph{pure, fully parametric} -code for a function of type $F^{A}\Rightarrow G^{A}$ will implement +code for a function of type $F^{A}\rightarrow G^{A}$ will implement a natural transformation Checking \texttt{\textcolor{blue}{\footnotesize{}flatten}}'s associativity @@ -771,22 +771,22 @@ \subsection{Checking the associativity law for standard monads} functors and check the laws (see code): \texttt{\textcolor{blue}{\footnotesize{}Option}} monad: $F^{A}\equiv1+A$; -$\text{ftn}:1+\left(1+A\right)\Rightarrow1+A$ +$\text{ftn}:1+\left(1+A\right)\rightarrow1+A$ \texttt{\textcolor{blue}{\footnotesize{}Either}} monad: $F^{A}\equiv Z+A$; -$\text{ftn}:Z+\left(Z+A\right)\Rightarrow Z+A$ +$\text{ftn}:Z+\left(Z+A\right)\rightarrow Z+A$ \texttt{\textcolor{blue}{\footnotesize{}List}} monad: $F^{A}\equiv\text{List}^{A}$; -$\text{ftn}:\text{List}^{\text{List}^{A}}\Rightarrow\text{List}^{A}$ +$\text{ftn}:\text{List}^{\text{List}^{A}}\rightarrow\text{List}^{A}$ -Writer monad: $F^{A}\equiv A\times W$; $\text{ftn}:\left(A\times W\right)\times W\Rightarrow A\times W$ +Writer monad: $F^{A}\equiv A\times W$; $\text{ftn}:\left(A\times W\right)\times W\rightarrow A\times W$ -Reader monad: $F^{A}\equiv R\Rightarrow A$; $\text{ftn}:\left(R\Rightarrow\left(R\Rightarrow A\right)\right)\Rightarrow R\Rightarrow A$ +Reader monad: $F^{A}\equiv R\rightarrow A$; $\text{ftn}:\left(R\rightarrow\left(R\rightarrow A\right)\right)\rightarrow R\rightarrow A$ -State: $F^{A}\equiv S\Rightarrow A\times S$; $\text{ftn}:\left(S\Rightarrow\left(S\Rightarrow A\times S\right)\times S\right)\Rightarrow S\Rightarrow A\times S$ +State: $F^{A}\equiv S\rightarrow A\times S$; $\text{ftn}:\left(S\rightarrow\left(S\rightarrow A\times S\right)\times S\right)\rightarrow S\rightarrow A\times S$ -Continuation monad: $F^{A}\equiv\left(A\Rightarrow R\right)\Rightarrow R$; -$\text{ftn}:\left(\left(\left(\left(A\Rightarrow R\right)\Rightarrow R\right)\Rightarrow R\right)\Rightarrow R\right)\Rightarrow\left(A\Rightarrow R\right)\Rightarrow R$ +Continuation monad: $F^{A}\equiv\left(A\rightarrow R\right)\rightarrow R$; +$\text{ftn}:\left(\left(\left(\left(A\rightarrow R\right)\rightarrow R\right)\rightarrow R\right)\rightarrow R\right)\rightarrow\left(A\rightarrow R\right)\rightarrow R$ Code implementing these \texttt{\textcolor{blue}{\footnotesize{}flatten}} functions is \emph{fully parametric} in $A$ @@ -818,7 +818,7 @@ \subsection{Motivation for monads} It is generally useful to have an ``empty context'' available: \[ -\text{pure}:A\Rightarrow M^{A} +\text{pure}:A\rightarrow M^{A} \] Adding the empty context to another context should be a no-op @@ -844,7 +844,7 @@ \subsection{Motivation for monads} \end{minipage}\texttt{\textcolor{blue}{\footnotesize{}\hfill{}\medskip{} }}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{}pure(x).flatMap(y $\Rightarrow$ +\texttt{\textcolor{blue}{\footnotesize{}pure(x).flatMap(y $\rightarrow$ cont(y)) = cont(x)}}$\quad\quad\text{pure}\bef\text{flm}\,f=f$ \textcolor{gray}{\textendash{} left identity} @@ -867,7 +867,7 @@ \subsection{Motivation for monads} \end{lyxcode} % \end{minipage}\texttt{\textcolor{blue}{\footnotesize{}\hfill{}\medskip{} -cont.flatMap(x $\Rightarrow$ pure(x))}} \texttt{\textcolor{blue}{\footnotesize{}= +cont.flatMap(x $\rightarrow$ pure(x))}} \texttt{\textcolor{blue}{\footnotesize{}= cont}} $\quad\quad\quad\text{flm}\left(\text{pure}\right)=\text{id}$ \textcolor{gray}{\textendash{} right identity} @@ -879,8 +879,8 @@ \subsection{The monad laws formulated in terms of \texttt{\textcolor{blue}{\foot $f\bef\text{pure}=\text{pure}\bef\text{fmap}\,f$ \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{5pc} & B\ar[rd]\sp(0.5){\ \text{pure}^{\left[B\right]}}\\ -A\ar[ru]\sp(0.5){f^{A\Rightarrow B}\ }\ar[rd]\sb(0.5){\text{pure}^{[A]}\,} & & S^{B}\\ - & S^{A}\ar[ru]\sb(0.5){\text{fmap}\,f^{A\Rightarrow B}} +A\ar[ru]\sp(0.5){f^{A\rightarrow B}\ }\ar[rd]\sb(0.5){\text{pure}^{[A]}\,} & & S^{B}\\ + & S^{A}\ar[ru]\sb(0.5){\text{fmap}\,f^{A\rightarrow B}} } \] @@ -893,7 +893,7 @@ \subsection{The monad laws formulated in terms of \texttt{\textcolor{blue}{\foot } \] -Right identity: $\text{flm}\left(\text{pure}\right)=\text{fmap}\left(\text{pure}\right)\bef\text{ftn}=\text{id}^{S^{A}\Rightarrow S^{A}}$ +Right identity: $\text{flm}\left(\text{pure}\right)=\text{fmap}\left(\text{pure}\right)\bef\text{ftn}=\text{id}^{S^{A}\rightarrow S^{A}}$ \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & S^{S^{A}}\ar[rd]\sp(0.5){\ \text{ftn}^{[A]}\ }\\ S^{A}\ar[ru]\sp(0.5){\text{fmap}(\text{pure}^{[A]})\quad}\ar[rr]\sb(0.5){\text{id}} & & S^{A} @@ -905,27 +905,27 @@ \subsection{Formulating laws via Kleisli functions} Recall: we formulated the laws of filterables via \texttt{\textcolor{blue}{\footnotesize{}fmapOpt}} -type signature of $\text{fmapOpt}:\left(A\Rightarrow1+B\right)\Rightarrow S^{A}\Rightarrow S^{B}$ +type signature of $\text{fmapOpt}:\left(A\rightarrow1+B\right)\rightarrow S^{A}\rightarrow S^{B}$ -and then we had to compose functions of types $A\Rightarrow1+B$ via +and then we had to compose functions of types $A\rightarrow1+B$ via $\diamond_{\text{Opt}}$ -Here we have{\small{} $\text{flm}:\left(A\Rightarrow S^{B}\right)\Rightarrow S^{A}\Rightarrow S^{B}$} +Here we have{\small{} $\text{flm}:\left(A\rightarrow S^{B}\right)\rightarrow S^{A}\rightarrow S^{B}$} instead of \texttt{\textcolor{blue}{\footnotesize{}fmapOpt}} Can we compose \textbf{Kleisli functions} with ``twisted'' type, -$A\Rightarrow S^{B}$? +$A\rightarrow S^{B}$? -Use $\text{flm}$ to define \textbf{Kleisli composition}: $f^{A\Rightarrow S^{B}}\diamond g^{B\Rightarrow S^{C}}\equiv f\bef\text{flm}\,g$ +Use $\text{flm}$ to define \textbf{Kleisli composition}: $f^{A\rightarrow S^{B}}\diamond g^{B\rightarrow S^{C}}\equiv f\bef\text{flm}\,g$ -Define \textbf{Kleisli identity} $\text{id}_{\diamond}$ of type $A\Rightarrow S^{A}$ +Define \textbf{Kleisli identity} $\text{id}_{\diamond}$ of type $A\rightarrow S^{A}$ as $\text{id}_{\diamond}\equiv\text{pure}$ Composition law: $\text{flm}\left(f\diamond g\right)=\text{flm}\,f\bef\text{flm}\,g$ (same as for \texttt{\textcolor{blue}{\footnotesize{}fmapOpt}}) Shows that \texttt{\textcolor{blue}{\footnotesize{}flatMap}} is a -``lifting'' of $A\Rightarrow S^{B}$ to $S^{A}\Rightarrow S^{B}$ +``lifting'' of $A\rightarrow S^{B}$ to $S^{A}\rightarrow S^{B}$ These laws are similar to functor ``lifting'' laws... @@ -955,11 +955,11 @@ \subsection{{*} Motivation for categories and functors} \textbf{Category} & \textbf{Type }$A\rightsquigarrow B$ & \textbf{Identity} & \textbf{Composition}\tabularnewline \hline \hline -plain functions & $A\Rightarrow B$ & $\text{id}:A\Rightarrow A$ & $f^{A\Rightarrow B}\bef g^{B\Rightarrow C}$\tabularnewline +plain functions & $A\rightarrow B$ & $\text{id}:A\rightarrow A$ & $f^{A\rightarrow B}\bef g^{B\rightarrow C}$\tabularnewline \hline -lifted to $F$ & $F^{A}\Rightarrow F^{B}$ & $\text{id}:F^{A}\Rightarrow F^{A}$ & $f^{F^{A}\Rightarrow F^{B}}\bef g^{F^{B}\Rightarrow F^{C}}$\tabularnewline +lifted to $F$ & $F^{A}\rightarrow F^{B}$ & $\text{id}:F^{A}\rightarrow F^{A}$ & $f^{F^{A}\rightarrow F^{B}}\bef g^{F^{B}\rightarrow F^{C}}$\tabularnewline \hline -Kleisli over $F$ & $A\Rightarrow F^{B}$ & $\text{pure}:A\Rightarrow F^{A}$ & $f^{A\Rightarrow F^{B}}\diamond g^{B\Rightarrow F^{C}}$\tabularnewline +Kleisli over $F$ & $A\rightarrow F^{B}$ & $\text{pure}:A\rightarrow F^{A}$ & $f^{A\rightarrow F^{B}}\diamond g^{B\rightarrow F^{C}}$\tabularnewline \hline \end{tabular} \par\end{center} @@ -998,24 +998,24 @@ \subsection{{*} Motivation for categories and functors} \subsection{{*} From Kleisli back to \texttt{\textcolor{blue}{\footnotesize{}flatMap}} } -The Kleisli functions, $A\rightsquigarrow B\equiv A\Rightarrow S^{B}$, +The Kleisli functions, $A\rightsquigarrow B\equiv A\rightarrow S^{B}$, form a category iff $S$ is a monad \texttt{\textcolor{blue}{\footnotesize{}fmap}} and \texttt{\textcolor{blue}{\footnotesize{}flatMap}} are computationally equivalent to Kleisli composition: Define \texttt{\textcolor{blue}{\footnotesize{}flatMap}} through Kleisli:{\small{} -$\text{flm}\,f^{A\Rightarrow S^{B}}\equiv\text{id}^{S^{A}\Rightarrow S^{A}}\diamond f$}{\small\par} +$\text{flm}\,f^{A\rightarrow S^{B}}\equiv\text{id}^{S^{A}\rightarrow S^{A}}\diamond f$}{\small\par} Require two additional laws that connect $\diamond$, $\text{fmap}$, and $\bef$: -Left naturality: {\small{}$f^{A\Rightarrow B}\bef g^{B\Rightarrow S^{C}}=\left(f\bef\text{pure}\right)\diamond g$}{\small\par} +Left naturality: {\small{}$f^{A\rightarrow B}\bef g^{B\rightarrow S^{C}}=\left(f\bef\text{pure}\right)\diamond g$}{\small\par} -Right naturality: {\small{}$f^{A\Rightarrow S^{B}}\bef\text{fmap}\,g^{B\Rightarrow C}=f\diamond\left(g\bef\text{pure}\right)$}{\small\par} +Right naturality: {\small{}$f^{A\rightarrow S^{B}}\bef\text{fmap}\,g^{B\rightarrow C}=f\diamond\left(g\bef\text{pure}\right)$}{\small\par} So, can define \texttt{\textcolor{blue}{\footnotesize{}fmap}} through -Kleisli: $\text{fmap}\,g^{A\Rightarrow B}\equiv\text{id}^{S^{A}\Rightarrow S^{A}}\diamond\left(g\bef\text{pure}\right)$ +Kleisli: $\text{fmap}\,g^{A\rightarrow B}\equiv\text{id}^{S^{A}\rightarrow S^{A}}\diamond\left(g\bef\text{pure}\right)$ The laws for \texttt{\textcolor{blue}{\footnotesize{}pure}} and \texttt{\textcolor{blue}{\footnotesize{}flatMap}} then follow from category axioms for Kleisli: @@ -1030,7 +1030,7 @@ \subsection{{*} From Kleisli back to \texttt{\textcolor{blue}{\footnotesize{}fla Naturality for \texttt{\textcolor{blue}{\footnotesize{}pure}}: $\text{pure}\bef\text{fmap}\,f=\text{pure}\diamond\left(f\bef\text{pure}\right)=f\bef\text{pure}$ -Define \texttt{\textcolor{blue}{\footnotesize{}flatten}}: $\text{ftn}=\text{id}^{S^{S^{A}}\Rightarrow S^{S^{A}}}\diamond\text{id}^{S^{A}\Rightarrow S^{A}}$ +Define \texttt{\textcolor{blue}{\footnotesize{}flatten}}: $\text{ftn}=\text{id}^{S^{S^{A}}\rightarrow S^{S^{A}}}\diamond\text{id}^{S^{A}\rightarrow S^{A}}$ Naturality for \texttt{\textcolor{blue}{\footnotesize{}flatten}}: $\text{ftn}\bef\text{fmap}\,f=\text{id}\diamond\text{id}\diamond\left(f\bef\text{pure}\right)=\text{id}\diamond\text{fmap}\,f$ @@ -1056,7 +1056,7 @@ \subsection{Structure of semigroups and monoids} $\text{List}^{A}$ is a monoid (for any type $A$), also $\text{Seq}^{A}$ etc. -The function type $A\Rightarrow A$ is a monoid (for any type $A$) +The function type $A\rightarrow A$ is a monoid (for any type $A$) The operation $f\bef g$ can be either $f\bef g$ or $g\bef f$ @@ -1076,10 +1076,10 @@ \subsection{Structure of semigroups and monoids} $S\times P$ is a semigroup if $S$ is a semigroup that has an \textbf{action on} $P$ -The ``action'' is $\alpha:S\Rightarrow P\Rightarrow P$ such that +The ``action'' is $\alpha:S\rightarrow P\rightarrow P$ such that $\alpha(s_{2})\bef\alpha(s_{1})=\alpha(s_{1}\bef s_{2})$ -$S\times P$ is a ``twisted product.'' Examples: $\left(A\Rightarrow A\right)\times A$; +$S\times P$ is a ``twisted product.'' Examples: $\left(A\rightarrow A\right)\times A$; $\text{Bool}\times\left(1+A\right)$ Other examples of monoids: $\text{Int}$ (many), $\text{String}$, @@ -1107,7 +1107,7 @@ \subsection{Structure of (semi)monads} but $G^{A}+H^{A}$ is generally \emph{not} a semimonad -$F^{A}\equiv R\Rightarrow G^{A}$ is a (semi)monad for any (semi)monad +$F^{A}\equiv R\rightarrow G^{A}$ is a (semi)monad for any (semi)monad $G^{A}$ $F^{A}\equiv A+G^{A}$ is a monad for a monad $G^{A}$ (\textbf{free @@ -1123,10 +1123,10 @@ \subsection{Structure of (semi)monads} $F^{A}\equiv G^{A}+G^{F^{A}}$ (recursive) for any functor $G^{A}$ -$F^{A}\equiv H^{A}\Rightarrow A\times G^{A}$ for any contrafunctor +$F^{A}\equiv H^{A}\rightarrow A\times G^{A}$ for any contrafunctor $H^{A}$ and functor $G^{A}$ -Obtain a full monad only when $G^{A}\equiv1$, i.e.\ $F^{A}\equiv H^{A}\Rightarrow A$ +Obtain a full monad only when $G^{A}\equiv1$, i.e.\ $F^{A}\equiv H^{A}\rightarrow A$ \subsection{Exercises II} @@ -1135,7 +1135,7 @@ \subsection{Exercises II} is a monoid if \texttt{\textcolor{blue}{\footnotesize{}M{[}\_{]}}} is a monad and \texttt{\textcolor{blue}{\footnotesize{}S}} is a monoid. -A framework implements a ``route'' type $R$ as $R\equiv Q\Rightarrow\left(E+S\right)$, +A framework implements a ``route'' type $R$ as $R\equiv Q\rightarrow\left(E+S\right)$, where $Q$ is a query, $E$ is an error response, and $S$ is a success response. A server is defined as a ``sum'' of several routes. For a given query $Q$, the response is the first route (if it exists) @@ -1150,10 +1150,10 @@ \subsection{Exercises II} into a monad. If $W$ and $R$ are arbitrary fixed types, which of the functors -can be made into a semimonad: $F^{A}\equiv W\times\left(R\Rightarrow A\right)$, -$G^{A}=R\Rightarrow\left(W\times A\right)$? +can be made into a semimonad: $F^{A}\equiv W\times\left(R\rightarrow A\right)$, +$G^{A}=R\rightarrow\left(W\times A\right)$? -Show that $F^{A}\equiv\left(P\Rightarrow A\right)+\left(Q\Rightarrow A\right)$ +Show that $F^{A}\equiv\left(P\rightarrow A\right)+\left(Q\rightarrow A\right)$ is not a semimonad (cannot define \texttt{\textcolor{blue}{\footnotesize{}flatMap}}) when $P$ and $Q$ are arbitrary, different types. @@ -1169,14 +1169,14 @@ \subsection{Exercises II (continued)} []\addtocounter{enumi}{7}\vspace*{-0.5cm} A programmer implemented the \texttt{\textcolor{blue}{\footnotesize{}fmap}} -method for {\footnotesize{}$F^{A}\equiv A\times\left(A\Rightarrow Z\right)$ +method for {\footnotesize{}$F^{A}\equiv A\times\left(A\rightarrow Z\right)$ }as -\texttt{\textcolor{blue}{\footnotesize{}def fmap{[}A,B{]}(f: A$\Rightarrow$B): ((A, -A$\Rightarrow$Z)) $\Rightarrow$ (B, B$\Rightarrow$Z) =}}{\footnotesize\par} +\texttt{\textcolor{blue}{\footnotesize{}def fmap{[}A,B{]}(f: A$\rightarrow$B): ((A, +A$\rightarrow$Z)) $\rightarrow$ (B, B$\rightarrow$Z) =}}{\footnotesize\par} -\texttt{\textcolor{blue}{\footnotesize{} \{ case (a, az) $\Rightarrow$ -(f(a), (\_: B) $\Rightarrow$ az(a)) \}}}{\footnotesize\par} +\texttt{\textcolor{blue}{\footnotesize{} \{ case (a, az) $\rightarrow$ +(f(a), (\_: B) $\rightarrow$ az(a)) \}}}{\footnotesize\par} Show that this implementation fails to satisfy the functor laws. @@ -1186,14 +1186,14 @@ \subsection{Exercises II (continued)} Verify that the full monad laws hold for construction 4. Implement \texttt{\textcolor{blue}{\footnotesize{}flatten}} and \texttt{\textcolor{blue}{\footnotesize{}pure}} -for $F^{A}\equiv A+\left(R\Rightarrow A\right)$, where $R$ is a +for $F^{A}\equiv A+\left(R\rightarrow A\right)$, where $R$ is a fixed type, and show that all the monad laws hold. For construction 5, show that an identity law would fail if \texttt{\textcolor{blue}{\footnotesize{}pure}} -were defined as \texttt{\textcolor{blue}{\footnotesize{}a $\Rightarrow$ +were defined as \texttt{\textcolor{blue}{\footnotesize{}a $\rightarrow$ Right(Monad{[}G{]}.pure(a))}} instead of as \texttt{\textcolor{blue}{\footnotesize{}Left(a)}}. -Implement the monad methods for $F^{A}\equiv\left(Z\Rightarrow1+A\right)\times\text{List}^{A}$ +Implement the monad methods for $F^{A}\equiv\left(Z\rightarrow1+A\right)\times\text{List}^{A}$ using the known monad constructions (no need to check the laws). Implement the semimonad construction 2 by discarding the first effect @@ -1215,7 +1215,7 @@ \subsection{Addendum: Miscellaneous remarks on monads} of this form may be built from the identity monad via constructions 3 and 5. To illustrate this, denote $E_{1}\equiv1$, $E_{n+1}\equiv1+E_{n}$. Monoid construction 2 makes $E_{n}$ into monoids. Then the monads -$E_{n}\Rightarrow A$ (reader) and $E_{n}\times A$ (writer) are equivalent +$E_{n}\rightarrow A$ (reader) and $E_{n}\times A$ (writer) are equivalent to polynomial monads $A\times...\times A$ and $A+...+A$. Contrafunctors cannot be monads or semimonads: if $H^{A}$ is a contrafunctor @@ -1223,9 +1223,9 @@ \subsection{Addendum: Miscellaneous remarks on monads} $H^{H^{A}}$ and $H^{A}$ (in either direction) is impossible. An example of combining natural transformations: Given functors $C$, -$F$, $G$ and natural transformations $C^{A}\Rightarrow F^{A}$ and -$C^{A}\Rightarrow G^{A}$ and taking the product, we get a natural -transformation $C^{A}\Rightarrow F^{A}\times G^{A}$. +$F$, $G$ and natural transformations $C^{A}\rightarrow F^{A}$ and +$C^{A}\rightarrow G^{A}$ and taking the product, we get a natural +transformation $C^{A}\rightarrow F^{A}\times G^{A}$. If $M^{A}$ is a monad then $M^{M^{A}}$ is not automatically a monad (need counterexample?). @@ -1236,10 +1236,10 @@ \subsection{Addendum: Miscellaneous remarks on monads} \_ $\leftarrow$ m$_{2}$ \} yield x or for \{ \_ $\leftarrow$ m$_{1}$; x $\leftarrow$ m$_{2}$ \} yield x -A curious example: The functor $Q^{A}\equiv\left(A\Rightarrow Z\right)\Rightarrow1+A$ -is not a monad (and not even a lawful applicative) but $M^{A}\equiv\left(A\Rightarrow1+1\right)\Rightarrow1+A$ +A curious example: The functor $Q^{A}\equiv\left(A\rightarrow Z\right)\rightarrow1+A$ +is not a monad (and not even a lawful applicative) but $M^{A}\equiv\left(A\rightarrow1+1\right)\rightarrow1+A$ is a ``search monad''. More generally, a ``selector monad'' is -$\left(A\Rightarrow P^{1}\right)\Rightarrow P^{A}$ for any functor +$\left(A\rightarrow P^{1}\right)\rightarrow P^{A}$ for any functor $P^{A}$. \section{Practical use} diff --git a/sofp-src/sofp-nameless-functions.lyx b/sofp-src/sofp-nameless-functions.lyx index b2f2201f9..a10ab5851 100644 --- a/sofp-src/sofp-nameless-functions.lyx +++ b/sofp-src/sofp-nameless-functions.lyx @@ -109,9 +109,6 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} @@ -837,7 +834,7 @@ status open \begin_layout Plain Layout This book uses the symbol -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset for symbolic calculations and @@ -2437,7 +2434,7 @@ variables occurring free in an expression These concepts apply equally well to mathematical formulas and to Scala code. For example, in the mathematical expression -\begin_inset Formula $k\Rightarrow n\neq0\text{ mod }k$ +\begin_inset Formula $k\rightarrow n\neq0\text{ mod }k$ \end_inset (which is a nameless function), the variable @@ -2726,7 +2723,7 @@ status open At this point we can apply a simplification trick to this code. The nameless function -\begin_inset Formula $k\Rightarrow p(k)$ +\begin_inset Formula $k\rightarrow p(k)$ \end_inset does exactly the same thing as the (named) function @@ -2762,7 +2759,7 @@ status open \begin_layout Standard The simplification of -\begin_inset Formula $x\Rightarrow f(x)$ +\begin_inset Formula $x\rightarrow f(x)$ \end_inset to just @@ -8046,7 +8043,7 @@ may be renamed at will . In FP notation, this nameless function would be denoted as -\begin_inset Formula $z\Rightarrow\frac{1}{1+z}$ +\begin_inset Formula $z\rightarrow\frac{1}{1+z}$ \end_inset , and the integral rewritten as code such as diff --git a/sofp-src/sofp-nameless-functions.tex b/sofp-src/sofp-nameless-functions.tex index 3f99432a8..97342efb7 100644 --- a/sofp-src/sofp-nameless-functions.tex +++ b/sofp-src/sofp-nameless-functions.tex @@ -119,7 +119,7 @@ \subsection{Nameless functions\label{subsec:Nameless-functions}} (1 to n).product \end{lstlisting} is the function's \textbf{body}. The arrow symbol \lstinline!=>! -separates the argument from the body.\footnote{This book uses the symbol $\Rightarrow$ for symbolic calculations +separates the argument from the body.\footnote{This book uses the symbol $\rightarrow$ for symbolic calculations and \lstinline!=>! for Scala code. Several programming languages, such as OCaml and Haskell, use the notation \lstinline!->! for the function arrow.} @@ -340,7 +340,7 @@ \subsection{Nameless functions and bound variables} variables}\index{free variable}, or ``variables occurring free in an expression''. These concepts apply equally well to mathematical formulas and to Scala code. For example, in the mathematical expression -$k\Rightarrow n\neq0\text{ mod }k$ (which is a nameless function), +$k\rightarrow n\neq0\text{ mod }k$ (which is a nameless function), the variable $k$ is bound (it is defined only within that expression) but the variable $n$ is free (it is defined outside that expression). @@ -387,7 +387,7 @@ \subsection{Nameless functions and bound variables} (1 to n).forall(k => p(k)) \end{lstlisting} At this point we can apply a simplification trick to this code. The -nameless function $k\Rightarrow p(k)$ does exactly the same thing +nameless function $k\rightarrow p(k)$ does exactly the same thing as the (named) function $p$: It takes an argument, which we may call $k$, and returns $p(k)$. So, we can simplify the Scala code above to @@ -396,7 +396,7 @@ \subsection{Nameless functions and bound variables} (1 to n).forall(p) \end{lstlisting} -The simplification of $x\Rightarrow f(x)$ to just $f$ is always +The simplification of $x\rightarrow f(x)$ to just $f$ is always possible for functions $f$ of a single argument.\footnote{Certain features of Scala allow programmers to write code that looks like \lstinline!f(x)! but actually involves additional implicit or default arguments of the function \lstinline!f!, or an implicit type @@ -1262,7 +1262,7 @@ \subsection{Nameless functions in mathematical notation\label{subsec:Nameless-fu It follows that the notations $\frac{dx}{1+x}$ and $\frac{dz}{1+z}$ correspond to a nameless function whose argument was renamed from $x$ to $z$. In FP notation, this nameless function would be denoted -as $z\Rightarrow\frac{1}{1+z}$, and the integral rewritten as code +as $z\rightarrow\frac{1}{1+z}$, and the integral rewritten as code such as \begin{lstlisting} integration(0, x, { z => 1.0 / (1 + z) } ) diff --git a/sofp-src/sofp-preface.lyx b/sofp-src/sofp-preface.lyx index 704148346..d21c9a94b 100644 --- a/sofp-src/sofp-preface.lyx +++ b/sofp-src/sofp-preface.lyx @@ -109,15 +109,13 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} \def\mathunderline#1#2{\color{#1}\underline{{\color{black}#2}}\color{black}} % The LyX document will define a macro \gunderline{#1} that will use \mathunderline with the color `greenunder`. %\def\gunderline#1{\mathunderline{greenunder}{#1}} % This is now defined by LyX itself with GUI support. + \end_preamble \options open=any,numbers=noenddot,index=totoc,bibliography=totoc,listof=totoc,fontsize=10pt \use_default_options true @@ -580,7 +578,7 @@ status open \end_inset is written as -\begin_inset Formula $A\times B\Rightarrow\bbnum 1+A$ +\begin_inset Formula $A\times B\rightarrow\bbnum 1+A$ \end_inset . @@ -623,11 +621,11 @@ where \end_inset is a functor and -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset and -\begin_inset Formula $g^{:B\Rightarrow C}$ +\begin_inset Formula $g^{:B\rightarrow C}$ \end_inset are arbitrary functions of the specified types. diff --git a/sofp-src/sofp-preface.tex b/sofp-src/sofp-preface.tex index bf5194c0b..6eb36e336 100644 --- a/sofp-src/sofp-preface.tex +++ b/sofp-src/sofp-preface.tex @@ -89,14 +89,14 @@ \item In the introductory chapters, type expressions and code examples are written in the syntax of Scala. Starting from Chapters~\ref{chap:Higher-order-functions}\textendash \ref{chap:3-3-The-formal-logic-curry-howard}, the book introduces a new notation for types where e.g.~the Scala -type expression \lstinline!((A, B)) => Option[A]! is written as $A\times B\Rightarrow\bbnum 1+A$. +type expression \lstinline!((A, B)) => Option[A]! is written as $A\times B\rightarrow\bbnum 1+A$. Also, a new notation for code is introduced and developed in Chapters~\ref{chap:3-3-The-formal-logic-curry-howard}\textendash \ref{chap:Functors,-contrafunctors,-and} for easier reasoning about laws. For example, the functor composition law is written in the code notation as \[ f^{\uparrow L}\bef g^{\uparrow L}=\left(f\bef g\right)^{\uparrow L}\quad, \] -where $L$ is a functor and $f^{:A\Rightarrow B}$ and $g^{:B\Rightarrow C}$ +where $L$ is a functor and $f^{:A\rightarrow B}$ and $g^{:B\rightarrow C}$ are arbitrary functions of the specified types. The symbol $\bef$ denotes the forward composition of functions (Scala's \lstinline!andThen! method). Appendix~\ref{chap:Appendix-Notations} summarizes the conventions diff --git a/sofp-src/sofp-recursive.lyx b/sofp-src/sofp-recursive.lyx index e205eada8..98c4311a9 100644 --- a/sofp-src/sofp-recursive.lyx +++ b/sofp-src/sofp-recursive.lyx @@ -109,9 +109,6 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} diff --git a/sofp-src/sofp-summary.lyx b/sofp-src/sofp-summary.lyx index 69344db21..e76f29140 100644 --- a/sofp-src/sofp-summary.lyx +++ b/sofp-src/sofp-summary.lyx @@ -109,9 +109,6 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} diff --git a/sofp-src/sofp-transformers.lyx b/sofp-src/sofp-transformers.lyx index f07b2c87f..91385c088 100644 --- a/sofp-src/sofp-transformers.lyx +++ b/sofp-src/sofp-transformers.lyx @@ -109,9 +109,6 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} @@ -271,7 +268,7 @@ Effect what else happens in \size footnotesize -\begin_inset Formula $A\Rightarrow M^{B}$ +\begin_inset Formula $A\rightarrow M^{B}$ \end_inset @@ -528,7 +525,7 @@ status open \size footnotesize \color blue (1 to n).flatMap { i -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset @@ -540,7 +537,7 @@ status open \size footnotesize \color blue Future(q(i)).flatMap { j -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset @@ -552,7 +549,7 @@ status open \size footnotesize \color blue maybeError(j).map { k -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset @@ -685,7 +682,7 @@ Examples and counterexamples for functor composition: \begin_layout Standard Combine -\begin_inset Formula $Z\Rightarrow A$ +\begin_inset Formula $Z\rightarrow A$ \end_inset and @@ -693,7 +690,7 @@ Combine \end_inset as -\begin_inset Formula $Z\Rightarrow\text{List}^{A}$ +\begin_inset Formula $Z\rightarrow\text{List}^{A}$ \end_inset @@ -741,7 +738,7 @@ Either[Z, Future[A]] \size footnotesize \color blue Option[Z -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset A] @@ -1048,7 +1045,7 @@ def lift \end_inset [A]: Seq[A] -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset BigM[A] = ??? @@ -1064,7 +1061,7 @@ def lift \end_inset [A]: Future[A] -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset BigM[A] = ??? @@ -1080,7 +1077,7 @@ def lift \end_inset [A]: Try[A] -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset BigM[A] = ??? @@ -1130,7 +1127,7 @@ def lift \end_inset [A]: Option[A] -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Future[Option[A]] = Future.successful(_) @@ -1146,11 +1143,11 @@ def lift \end_inset [A]: Future[A] -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Future[Option[A]] = _.map(x -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Some(x)) @@ -1207,11 +1204,11 @@ def lift \end_inset [A]: Try[A] -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset List[Try[A]] = x -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset List(x) @@ -1227,11 +1224,11 @@ def lift \end_inset [A]: List[A] -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset List[Try[A]] = _.map(x -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Success(x)) @@ -1581,7 +1578,7 @@ hspace{-0.0cm} \end_inset -\begin_inset Formula $\left(\text{pure}_{M_{1}}\bef\text{lift}_{1}\right)^{:X\Rightarrow\text{BigM}^{X}}\diamond b^{:X\Rightarrow\text{BigM}^{Y}}=b$ +\begin_inset Formula $\left(\text{pure}_{M_{1}}\bef\text{lift}_{1}\right)^{:X\rightarrow\text{BigM}^{X}}\diamond b^{:X\rightarrow\text{BigM}^{Y}}=b$ \end_inset @@ -1589,7 +1586,7 @@ hspace{-0.0cm} \end_inset with -\begin_inset Formula $f^{:X\Rightarrow M^{Y}}\diamond g^{:Y\Rightarrow M^{Z}}\triangleq x\Rightarrow f(x).\text{flatMap}(g)$ +\begin_inset Formula $f^{:X\rightarrow M^{Y}}\diamond g^{:Y\rightarrow M^{Z}}\triangleq x\rightarrow f(x).\text{flatMap}(g)$ \end_inset @@ -1804,7 +1801,7 @@ hspace{-0.0cm} \end_inset -\begin_inset Formula $b^{:X\Rightarrow\text{BigM}^{Y}}\diamond\left(\text{pure}_{M_{1}}\bef\text{lift}_{1}\right)^{:Y\Rightarrow\text{BigM}^{Y}}=b$ +\begin_inset Formula $b^{:X\rightarrow\text{BigM}^{Y}}\diamond\left(\text{pure}_{M_{1}}\bef\text{lift}_{1}\right)^{:Y\rightarrow\text{BigM}^{Y}}=b$ \end_inset @@ -2182,7 +2179,7 @@ lift Rewritten equivalently through \size footnotesize -\begin_inset Formula $\text{flm}_{M}:\left(A\Rightarrow M^{B}\right)\Rightarrow M^{A}\Rightarrow M^{B}$ +\begin_inset Formula $\text{flm}_{M}:\left(A\rightarrow M^{B}\right)\rightarrow M^{A}\rightarrow M^{B}$ \end_inset @@ -2213,7 +2210,7 @@ hspace{-0.0cm} \end_inset – both sides are functions -\begin_inset Formula $M_{1}^{A}\Rightarrow\text{BigM}^{B}$ +\begin_inset Formula $M_{1}^{A}\rightarrow\text{BigM}^{B}$ \end_inset @@ -2241,7 +2238,7 @@ hspace{-0.0cm} Rewritten equivalently through \size footnotesize -\begin_inset Formula $\text{ftn}_{M}:M^{M^{A}}\Rightarrow M^{A}$ +\begin_inset Formula $\text{ftn}_{M}:M^{M^{A}}\rightarrow M^{A}$ \end_inset , @@ -2272,7 +2269,7 @@ hspace{-0.0cm} \end_inset – both sides are functions -\begin_inset Formula $M_{1}^{M_{1}^{A}}\Rightarrow\text{BigM}^{A}$ +\begin_inset Formula $M_{1}^{M_{1}^{A}}\rightarrow\text{BigM}^{A}$ \end_inset @@ -2327,7 +2324,7 @@ hspace{-0.0cm} \end_inset -\begin_inset Formula $\big(b^{:X\Rightarrow M_{1}^{Y}}\bef\text{lift}_{1}\big)\diamond_{\text{BigM}}\big(c^{:Y\Rightarrow M_{1}^{Z}}\bef\text{lift}_{1}\big)=\left(b\diamond_{M_{1}}c\right)\bef\text{lift}_{1}$ +\begin_inset Formula $\big(b^{:X\rightarrow M_{1}^{Y}}\bef\text{lift}_{1}\big)\diamond_{\text{BigM}}\big(c^{:Y\rightarrow M_{1}^{Z}}\bef\text{lift}_{1}\big)=\left(b\diamond_{M_{1}}c\right)\bef\text{lift}_{1}$ \end_inset @@ -2385,7 +2382,7 @@ Laws for monad liftings III. \begin_layout Standard Show that -\begin_inset Formula $\text{lift}_{1}:M_{1}^{A}\Rightarrow\text{BigM}^{A}$ +\begin_inset Formula $\text{lift}_{1}:M_{1}^{A}\rightarrow\text{BigM}^{A}$ \end_inset is a natural transformation @@ -2440,7 +2437,7 @@ interpreters \end_inset -\begin_inset Formula $M^{A}\Rightarrow N^{A}$ +\begin_inset Formula $M^{A}\rightarrow N^{A}$ \end_inset are monadic morphisms @@ -2448,7 +2445,7 @@ interpreters \begin_layout Standard The (functor) naturality law: for any -\begin_inset Formula $f:X\Rightarrow Y$ +\begin_inset Formula $f:X\rightarrow Y$ \end_inset , @@ -2494,7 +2491,7 @@ vspace{-0.5cm} \begin_inset Formula \[ -\xymatrix{\xyScaleY{2pc}\xyScaleX{3pc}M_{1}^{X}\ar[d]\sb(0.45){\text{fmap}_{M_{1}}\,f^{:X\Rightarrow Y}}\ar[r]\sp(0.45){\ \text{lift}_{1}} & \text{BigM}^{X}\ar[d]\sp(0.45){\text{fmap}_{\text{BigM}}\,f^{:X\Rightarrow Y}}\\ +\xymatrix{\xyScaleY{2pc}\xyScaleX{3pc}M_{1}^{X}\ar[d]\sb(0.45){\text{fmap}_{M_{1}}\,f^{:X\rightarrow Y}}\ar[r]\sp(0.45){\ \text{lift}_{1}} & \text{BigM}^{X}\ar[d]\sp(0.45){\text{fmap}_{\text{BigM}}\,f^{:X\rightarrow Y}}\\ M_{1}^{Y}\ar[r]\sp(0.45){\text{lift}_{1}} & \text{BigM}^{Y} } \] @@ -2524,7 +2521,7 @@ Express \begin_layout Standard Given -\begin_inset Formula $f^{:X\Rightarrow Y}$ +\begin_inset Formula $f^{:X\rightarrow Y}$ \end_inset , use the law @@ -2577,7 +2574,7 @@ vspace{-0.2cm} \size default Combine -\begin_inset Formula $Z\Rightarrow A$ +\begin_inset Formula $Z\rightarrow A$ \end_inset and @@ -2585,11 +2582,11 @@ Combine \end_inset : only -\begin_inset Formula $Z\Rightarrow1+A$ +\begin_inset Formula $Z\rightarrow1+A$ \end_inset works, not -\begin_inset Formula $1+\left(Z\Rightarrow A\right)$ +\begin_inset Formula $1+\left(Z\rightarrow A\right)$ \end_inset @@ -2617,7 +2614,7 @@ It is not possible to combine arbitrary monads as \begin_layout Standard Example: state monad -\begin_inset Formula $\text{St}_{S}^{A}\triangleq S\Rightarrow A\times S$ +\begin_inset Formula $\text{St}_{S}^{A}\triangleq S\rightarrow A\times S$ \end_inset does not compose @@ -3001,7 +2998,7 @@ For any monad \end_inset for the transformed monads: -\begin_inset Formula $\text{mrun}_{L}^{M}:\left(M^{\bullet}\leadsto N^{\bullet}\right)\Rightarrow T_{L}^{M,\bullet}\leadsto T_{L}^{N,\bullet}$ +\begin_inset Formula $\text{mrun}_{L}^{M}:\left(M^{\bullet}\leadsto N^{\bullet}\right)\rightarrow T_{L}^{M,\bullet}\leadsto T_{L}^{N,\bullet}$ \end_inset with the @@ -3041,7 +3038,7 @@ traverse \size small \color inherit -\begin_inset Formula $:L^{A}\Rightarrow(A\Rightarrow F^{B})\Rightarrow F^{L^{B}}$ +\begin_inset Formula $:L^{A}\rightarrow(A\rightarrow F^{B})\rightarrow F^{L^{B}}$ \end_inset – natural w.r.t. @@ -3092,7 +3089,7 @@ Base runner \end_inset ; so -\begin_inset Formula $\text{brun}_{L}^{M}:\left(L^{\bullet}\leadsto\bullet\right)\Rightarrow T_{L}^{M,\bullet}\leadsto M^{\bullet}$ +\begin_inset Formula $\text{brun}_{L}^{M}:\left(L^{\bullet}\leadsto\bullet\right)\rightarrow T_{L}^{M,\bullet}\leadsto M^{\bullet}$ \end_inset , must commute with @@ -3151,7 +3148,7 @@ If \end_inset is a monad then -\begin_inset Formula $R\Rightarrow M^{A}$ +\begin_inset Formula $R\rightarrow M^{A}$ \end_inset is also a monad (for a fixed type @@ -3215,7 +3212,7 @@ Either \size footnotesize \color blue type ReaderT[R, M[_], A] = R -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset M[A] @@ -3515,11 +3512,11 @@ SearchT \size footnotesize \color blue S[A] = (A -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset Z) -\begin_inset Formula $\Rightarrow$ +\begin_inset Formula $\rightarrow$ \end_inset A @@ -3609,7 +3606,7 @@ Contrafunctor-choice \end_inset -\begin_inset Formula $H^{A}\Rightarrow A$ +\begin_inset Formula $H^{A}\rightarrow A$ \end_inset – composed-outside transformer @@ -3641,7 +3638,7 @@ Irregular \begin_layout Standard \size footnotesize -\begin_inset Formula $T_{\text{State}}^{M,A}=S\Rightarrow M^{S\times A}$ +\begin_inset Formula $T_{\text{State}}^{M,A}=S\rightarrow M^{S\times A}$ \end_inset @@ -3649,7 +3646,7 @@ Irregular ; \size footnotesize -\begin_inset Formula $T_{\text{Cont}}^{M,A}=\left(A\Rightarrow M^{R}\right)\Rightarrow M^{R}$ +\begin_inset Formula $T_{\text{Cont}}^{M,A}=\left(A\rightarrow M^{R}\right)\rightarrow M^{R}$ \end_inset @@ -3665,19 +3662,19 @@ selector \size footnotesize -\begin_inset Formula $F^{A\Rightarrow P^{Q}}\Rightarrow P^{A}$ +\begin_inset Formula $F^{A\rightarrow P^{Q}}\rightarrow P^{A}$ \end_inset \size default – transformer -\begin_inset Formula $F^{A\Rightarrow T_{P}^{M,Q}}\Rightarrow T_{P}^{M,A}$ +\begin_inset Formula $F^{A\rightarrow T_{P}^{M,Q}}\rightarrow T_{P}^{M,A}$ \end_inset ; codensity \size footnotesize -\begin_inset Formula $\forall R.\left(A\Rightarrow M^{R}\right)\Rightarrow M^{R}$ +\begin_inset Formula $\forall R.\left(A\rightarrow M^{R}\right)\rightarrow M^{R}$ \end_inset @@ -3870,7 +3867,7 @@ monad transformers!lifting law \end_inset , the function -\begin_inset Formula $\text{lift}:M^{A}\Rightarrow T_{L}^{M,A}$ +\begin_inset Formula $\text{lift}:M^{A}\rightarrow T_{L}^{M,A}$ \end_inset is a monadic morphism. @@ -3994,7 +3991,7 @@ monad transformers!base lifting base lifting \series default , -\begin_inset Formula $\text{mrun}\left(\text{pu}_{M}\right)\triangleq\text{blift}:L^{A}\Rightarrow T_{L}^{M,A}$ +\begin_inset Formula $\text{mrun}\left(\text{pu}_{M}\right)\triangleq\text{blift}:L^{A}\rightarrow T_{L}^{M,A}$ \end_inset . @@ -4229,7 +4226,7 @@ transformer \end_inset and -\begin_inset Formula $\text{lift}\bef\text{brun}\left(\theta\right)=\left(\_\Rightarrow1\right)\neq\text{id}$ +\begin_inset Formula $\text{lift}\bef\text{brun}\left(\theta\right)=\left(\_\rightarrow1\right)\neq\text{id}$ \end_inset . @@ -4428,7 +4425,7 @@ State \end_inset monad, -\begin_inset Formula $\text{State}_{S}^{A}\triangleq S\Rightarrow S\times A$ +\begin_inset Formula $\text{State}_{S}^{A}\triangleq S\rightarrow S\times A$ \end_inset , for which we have already shown that @@ -4436,7 +4433,7 @@ State \end_inset is not a monad and -\begin_inset Formula $\text{State}_{S}^{Z\Rightarrow A}$ +\begin_inset Formula $\text{State}_{S}^{Z\rightarrow A}$ \end_inset is not a monad (see Section @@ -4494,16 +4491,16 @@ Reader \end_inset monads, -\begin_inset Formula $L^{A}\triangleq R\Rightarrow A$ +\begin_inset Formula $L^{A}\triangleq R\rightarrow A$ \end_inset and -\begin_inset Formula $M^{A}\triangleq S\Rightarrow A$ +\begin_inset Formula $M^{A}\triangleq S\rightarrow A$ \end_inset . The disjunction -\begin_inset Formula $\left(R\Rightarrow A\right)+\left(S\Rightarrow A\right)$ +\begin_inset Formula $\left(R\rightarrow A\right)+\left(S\rightarrow A\right)$ \end_inset is a functor that is not a monad (and not even applicative, see Section @@ -4596,7 +4593,7 @@ The functor composition \end_inset and the lifting laws are also violated because -\begin_inset Formula $\text{lift}:M^{A}\Rightarrow\text{Free}^{L^{\bullet}+M^{\bullet},A}$ +\begin_inset Formula $\text{lift}:M^{A}\rightarrow\text{Free}^{L^{\bullet}+M^{\bullet},A}$ \end_inset is not a monad morphism because it maps @@ -4651,7 +4648,7 @@ monoidal convolution via \begin_inset Formula \begin{equation} -\left(L\star M\right)^{A}\triangleq\exists P\exists Q.\left(P\times Q\Rightarrow A\right)\times L^{P}\times M^{Q}\quad.\label{eq:definition-of-monoidal-convolution} +\left(L\star M\right)^{A}\triangleq\exists P\exists Q.\left(P\times Q\rightarrow A\right)\times L^{P}\times M^{Q}\quad.\label{eq:definition-of-monoidal-convolution} \end{equation} \end_inset @@ -4659,7 +4656,7 @@ monoidal convolution This formula can be seen as a combination of the co-Yoneda identities \begin_inset Formula \[ -L^{A}\cong\exists P.L^{P}\times\left(P\Rightarrow A\right)\quad,\quad\quad M^{A}\cong\exists Q.M^{Q}\times\left(Q\Rightarrow A\right)\quad. +L^{A}\cong\exists P.L^{P}\times\left(P\rightarrow A\right)\quad,\quad\quad M^{A}\cong\exists Q.M^{Q}\times\left(Q\rightarrow A\right)\quad. \] \end_inset @@ -4672,8 +4669,8 @@ The functor product \begin_inset Formula \begin{align} & L^{A}\times M^{A}\nonumber \\ -\text{co-Yoneda identities for }L^{A}\text{ and }M^{A}:\quad & \cong\exists P.L^{P}\times\gunderline{\left(P\Rightarrow A\right)}\times\exists Q.M^{Q}\times\gunderline{\left(Q\Rightarrow A\right)}\nonumber \\ -\text{equivalence in Eq.~(\ref{eq:equivalence-pq-a-for-monoidal-convolution})}:\quad & \cong\exists P.\exists Q.L^{P}\times M^{Q}\times\left(P+Q\Rightarrow A\right)\label{eq:product-l-m-for-monoidal-convolution} +\text{co-Yoneda identities for }L^{A}\text{ and }M^{A}:\quad & \cong\exists P.L^{P}\times\gunderline{\left(P\rightarrow A\right)}\times\exists Q.M^{Q}\times\gunderline{\left(Q\rightarrow A\right)}\nonumber \\ +\text{equivalence in Eq.~(\ref{eq:equivalence-pq-a-for-monoidal-convolution})}:\quad & \cong\exists P.\exists Q.L^{P}\times M^{Q}\times\left(P+Q\rightarrow A\right)\label{eq:product-l-m-for-monoidal-convolution} \end{align} \end_inset @@ -4681,17 +4678,17 @@ The functor product where we used the type equivalence \begin_inset Formula \begin{equation} -\left(P\Rightarrow A\right)\times\left(Q\Rightarrow A\right)\cong P+Q\Rightarrow A\quad.\label{eq:equivalence-pq-a-for-monoidal-convolution} +\left(P\rightarrow A\right)\times\left(Q\rightarrow A\right)\cong P+Q\rightarrow A\quad.\label{eq:equivalence-pq-a-for-monoidal-convolution} \end{equation} \end_inset If we (arbitrarily) replace -\begin_inset Formula $P+Q\Rightarrow A$ +\begin_inset Formula $P+Q\rightarrow A$ \end_inset by -\begin_inset Formula $P\times Q\Rightarrow A$ +\begin_inset Formula $P\times Q\rightarrow A$ \end_inset in Eq. @@ -4755,7 +4752,7 @@ noprefix "false" \end_inset and -\begin_inset Formula $M^{A}\triangleq R\Rightarrow A$ +\begin_inset Formula $M^{A}\triangleq R\rightarrow A$ \end_inset . @@ -4767,11 +4764,11 @@ noprefix "false" \begin_inset Formula \begin{align*} & \left(L\star M\right)^{A}\\ -\text{definitions of }L,M,\star:\quad & \cong\exists P\exists Q.\gunderline{\left(P\times Q\Rightarrow A\right)}\times\left(\bbnum 1+P\right)\times\left(R\Rightarrow Q\right)\\ -\text{curry the arguments, move quantifier}:\quad & \cong\exists P.\left(\bbnum 1+P\right)\times\gunderline{\exists Q.\left(Q\Rightarrow P\Rightarrow A\right)\times\left(R\Rightarrow Q\right)}\\ -\text{co-Yoneda identity with }\exists Q:\quad & \cong\exists P.\left(\bbnum 1+P\right)\times\left(\gunderline{R\Rightarrow P}\Rightarrow A\right)\\ -\text{swap curried arguments}:\quad & \cong\exists P.\left(\bbnum 1+P\right)\times\left(P\Rightarrow R\Rightarrow A\right)\\ -\text{co-Yoneda identity with }\exists P:\quad & \cong\bbnum 1+\left(R\Rightarrow A\right)\quad. +\text{definitions of }L,M,\star:\quad & \cong\exists P\exists Q.\gunderline{\left(P\times Q\rightarrow A\right)}\times\left(\bbnum 1+P\right)\times\left(R\rightarrow Q\right)\\ +\text{curry the arguments, move quantifier}:\quad & \cong\exists P.\left(\bbnum 1+P\right)\times\gunderline{\exists Q.\left(Q\rightarrow P\rightarrow A\right)\times\left(R\rightarrow Q\right)}\\ +\text{co-Yoneda identity with }\exists Q:\quad & \cong\exists P.\left(\bbnum 1+P\right)\times\left(\gunderline{R\rightarrow P}\rightarrow A\right)\\ +\text{swap curried arguments}:\quad & \cong\exists P.\left(\bbnum 1+P\right)\times\left(P\rightarrow R\rightarrow A\right)\\ +\text{co-Yoneda identity with }\exists P:\quad & \cong\bbnum 1+\left(R\rightarrow A\right)\quad. \end{align*} \end_inset @@ -4793,7 +4790,7 @@ codensity monad over \end_inset : -\begin_inset Formula $F^{A}\triangleq\forall B.\,\big(A\Rightarrow L^{M^{B}}\big)\Rightarrow L^{M^{B}}$ +\begin_inset Formula $F^{A}\triangleq\forall B.\,\big(A\rightarrow L^{M^{B}}\big)\rightarrow L^{M^{B}}$ \end_inset – no lift @@ -4805,7 +4802,7 @@ Codensity- \end_inset transformer: -\begin_inset Formula $\text{Cod}_{L}^{M,A}\triangleq\forall B.\left(A\Rightarrow L^{B}\right)\Rightarrow L^{M^{B}}$ +\begin_inset Formula $\text{Cod}_{L}^{M,A}\triangleq\forall B.\left(A\rightarrow L^{B}\right)\rightarrow L^{M^{B}}$ \end_inset – no lift @@ -4814,7 +4811,7 @@ Codensity- \begin_deeper \begin_layout Itemize applies the continuation transformer to -\begin_inset Formula $M^{A}\cong\forall B.\left(A\Rightarrow B\right)\Rightarrow M^{B}$ +\begin_inset Formula $M^{A}\cong\forall B.\left(A\rightarrow B\right)\rightarrow M^{B}$ \end_inset @@ -4823,7 +4820,7 @@ applies the continuation transformer to \end_deeper \begin_layout Itemize Codensity composition: -\begin_inset Formula $F^{A}\triangleq\forall B.\left(M^{A}\Rightarrow L^{B}\right)\Rightarrow L^{B}$ +\begin_inset Formula $F^{A}\triangleq\forall B.\left(M^{A}\rightarrow L^{B}\right)\rightarrow L^{B}$ \end_inset – not a monad @@ -4832,11 +4829,11 @@ Codensity composition: \begin_deeper \begin_layout Itemize Counterexample: -\begin_inset Formula $M^{A}\triangleq R\Rightarrow A$ +\begin_inset Formula $M^{A}\triangleq R\rightarrow A$ \end_inset and -\begin_inset Formula $L^{A}\triangleq S\Rightarrow A$ +\begin_inset Formula $L^{A}\triangleq S\rightarrow A$ \end_inset @@ -4849,7 +4846,7 @@ Properties of monadic morphisms \begin_layout Standard A natural transformation -\begin_inset Formula $\phi^{A}:M^{A}\Rightarrow N^{A}$ +\begin_inset Formula $\phi^{A}:M^{A}\rightarrow N^{A}$ \end_inset , equivalently written as @@ -4917,7 +4914,7 @@ For any monad \end_inset , the method -\begin_inset Formula $\text{pu}_{M}:A\Rightarrow M^{A}$ +\begin_inset Formula $\text{pu}_{M}:A\rightarrow M^{A}$ \end_inset is a monadic morphism @@ -5029,8 +5026,8 @@ Suppose defined as \begin_inset Formula \begin{align*} - & f:\left(Z\Rightarrow A\right)\Rightarrow M^{A}\quad,\\ - & f\left(q^{:Z\Rightarrow A}\right)\triangleq q^{\uparrow M}m\quad. + & f:\left(Z\rightarrow A\right)\rightarrow M^{A}\quad,\\ + & f\left(q^{:Z\rightarrow A}\right)\triangleq q^{\uparrow M}m\quad. \end{align*} \end_inset @@ -5044,7 +5041,7 @@ Prove that not \emph default a monadic morphism from the reader monad -\begin_inset Formula $R^{A}\triangleq Z\Rightarrow A$ +\begin_inset Formula $R^{A}\triangleq Z\rightarrow A$ \end_inset to the monad @@ -5066,8 +5063,8 @@ not defined as \begin_inset Formula \begin{align*} - & \phi:\left(Z\Rightarrow M^{A}\right)\Rightarrow M^{A}\quad,\\ - & \phi\left(q^{:Z\Rightarrow M^{A}}\right)\triangleq\text{flm}_{M}\left(q\right)\left(m\right)\quad. + & \phi:\left(Z\rightarrow M^{A}\right)\rightarrow M^{A}\quad,\\ + & \phi\left(q^{:Z\rightarrow M^{A}}\right)\triangleq\text{flm}_{M}\left(q\right)\left(m\right)\quad. \end{align*} \end_inset @@ -5081,7 +5078,7 @@ Show that not \emph default a monadic morphism from the monad -\begin_inset Formula $Q^{A}\triangleq Z\Rightarrow M^{A}$ +\begin_inset Formula $Q^{A}\triangleq Z\rightarrow M^{A}$ \end_inset to @@ -5204,7 +5201,7 @@ For any monad \end_inset , the function -\begin_inset Formula $\Delta:M^{A}\Rightarrow M^{A}\times M^{A}$ +\begin_inset Formula $\Delta:M^{A}\rightarrow M^{A}\times M^{A}$ \end_inset is a monadic morphism between monads @@ -5260,7 +5257,7 @@ we use the definition of , \begin_inset Formula \[ -\text{ftn}_{M\times M}:M^{M^{\bullet}\times M^{\bullet}}\times M^{M^{\bullet}\times M^{\bullet}}\Rightarrow M^{\bullet}\times M^{\bullet}=\big(\nabla_{1}^{\uparrow M}\bef\text{ftn}_{M}\big)\boxtimes\big(\nabla_{2}^{\uparrow M}\bef\text{ftn}_{M}\big)\quad, +\text{ftn}_{M\times M}:M^{M^{\bullet}\times M^{\bullet}}\times M^{M^{\bullet}\times M^{\bullet}}\rightarrow M^{\bullet}\times M^{\bullet}=\big(\nabla_{1}^{\uparrow M}\bef\text{ftn}_{M}\big)\boxtimes\big(\nabla_{2}^{\uparrow M}\bef\text{ftn}_{M}\big)\quad, \] \end_inset @@ -5385,7 +5382,7 @@ To verify the composition law for , we use the definitions \begin_inset Formula \begin{align*} - & \text{ftn}_{K\times L}=\big(\nabla_{1}^{\uparrow K}\bef\text{ftn}_{K}\big)^{:K^{K^{\bullet}\times L^{\bullet}}\Rightarrow K^{\bullet}}\boxtimes\big(\nabla_{2}^{\uparrow L}\bef\text{ftn}_{L}\big)^{:L^{K^{\bullet}\times L^{\bullet}}\Rightarrow L^{\bullet}}\quad,\\ + & \text{ftn}_{K\times L}=\big(\nabla_{1}^{\uparrow K}\bef\text{ftn}_{K}\big)^{:K^{K^{\bullet}\times L^{\bullet}}\rightarrow K^{\bullet}}\boxtimes\big(\nabla_{2}^{\uparrow L}\bef\text{ftn}_{L}\big)^{:L^{K^{\bullet}\times L^{\bullet}}\rightarrow L^{\bullet}}\quad,\\ & \text{ftn}_{M\times N}=\big(\nabla_{1}^{\uparrow M}\bef\text{ftn}_{M}\big)\boxtimes\big(\nabla_{2}^{\uparrow N}\bef\text{ftn}_{N}\big)\quad. \end{align*} @@ -5729,7 +5726,7 @@ The properties of the transformer allow us to convert this type to a single In this example, we will have a natural transformation \begin_inset Formula \[ -T^{M^{T^{L^{M^{L^{A}}}}}}\Rightarrow T^{A}\quad. +T^{M^{T^{L^{M^{L^{A}}}}}}\rightarrow T^{A}\quad. \] \end_inset @@ -6221,7 +6218,7 @@ Runner law We need to show that there exists a lawful lifting \begin_inset Formula \[ -\text{mrun}_{R}:\left(M\leadsto N\right)\Rightarrow T_{P}^{T_{Q}^{M}}\leadsto T_{P}^{T_{Q}^{N}}\quad. +\text{mrun}_{R}:\left(M\leadsto N\right)\rightarrow T_{P}^{T_{Q}^{M}}\leadsto T_{P}^{T_{Q}^{N}}\quad. \] \end_inset @@ -6365,7 +6362,7 @@ We need to show that for any monadic morphism has the type signature \begin_inset Formula \[ -\text{brun}_{Q}:\left(Q\leadsto\text{Id}\right)\Rightarrow T_{Q}^{M}\leadsto M\quad. +\text{brun}_{Q}:\left(Q\leadsto\text{Id}\right)\rightarrow T_{Q}^{M}\leadsto M\quad. \] \end_inset @@ -6381,7 +6378,7 @@ We can apply the base runner for as the foreign monad, \begin_inset Formula \[ -\text{brun}_{P}:\left(P\leadsto\text{Id}\right)\Rightarrow T_{P}^{T_{Q}^{M}}\leadsto T_{Q}^{M}\quad. +\text{brun}_{P}:\left(P\leadsto\text{Id}\right)\rightarrow T_{P}^{T_{Q}^{M}}\leadsto T_{Q}^{M}\quad. \] \end_inset @@ -6814,7 +6811,7 @@ ReaderT transformer, \begin_inset Formula \[ -L^{A}\triangleq R\Rightarrow A,\quad\quad T_{L}^{M,A}\triangleq L^{M^{A}}=R\Rightarrow M^{A}\quad, +L^{A}\triangleq R\rightarrow A,\quad\quad T_{L}^{M,A}\triangleq L^{M^{A}}=R\rightarrow M^{A}\quad, \] \end_inset @@ -7021,7 +7018,7 @@ flatten ), with the type signatures \begin_inset Formula \[ -\text{pu}_{T}:A\Rightarrow L^{M^{A}}\quad,\quad\text{ftn}_{T}:L^{M^{L^{M^{A}}}}\Rightarrow L^{M^{A}}\quad. +\text{pu}_{T}:A\rightarrow L^{M^{A}}\quad,\quad\text{ftn}_{T}:L^{M^{L^{M^{A}}}}\rightarrow L^{M^{A}}\quad. \] \end_inset @@ -7212,7 +7209,7 @@ swap which is equivalently written in a more verbose notation as \begin_inset Formula \[ -\text{sw}:M^{L^{A}}\Rightarrow L^{M^{A}}\quad. +\text{sw}:M^{L^{A}}\rightarrow L^{M^{A}}\quad. \] \end_inset @@ -7342,8 +7339,8 @@ swap are \begin_inset Formula \begin{align*} -\text{composed-inside}:\quad\text{ftn}_{T}:M^{L^{M^{L^{A}}}}\Rightarrow M^{L^{A}}\quad, & \quad\text{sw}:L^{M^{A}}\Rightarrow M^{L^{A}}\quad,\\ -\text{composed-outside}:\quad\text{ftn}_{T}:L^{M^{L^{M^{A}}}}\Rightarrow L^{M^{A}}\quad, & \quad\text{sw}:M^{L^{A}}\Rightarrow L^{M^{A}}\quad. +\text{composed-inside}:\quad\text{ftn}_{T}:M^{L^{M^{L^{A}}}}\rightarrow M^{L^{A}}\quad, & \quad\text{sw}:L^{M^{A}}\rightarrow M^{L^{A}}\quad,\\ +\text{composed-outside}:\quad\text{ftn}_{T}:L^{M^{L^{M^{A}}}}\rightarrow L^{M^{A}}\quad, & \quad\text{sw}:M^{L^{A}}\rightarrow L^{M^{A}}\quad. \end{align*} \end_inset @@ -7426,7 +7423,7 @@ noprefix "false" Indeed, the type signature of the sequence operation is \begin_inset Formula \[ -\text{seq}:L^{F^{A}}\Rightarrow F^{L^{A}}\quad, +\text{seq}:L^{F^{A}}\rightarrow F^{L^{A}}\quad, \] \end_inset @@ -7575,7 +7572,7 @@ status collapsed \emph on This is actually confusing! Let's not do this and always write -\begin_inset Formula $\text{sw}_{L}^{M}:M^{L^{A}}\Rightarrow L^{M^{A}}$ +\begin_inset Formula $\text{sw}_{L}^{M}:M^{L^{A}}\rightarrow L^{M^{A}}$ \end_inset @@ -7597,8 +7594,8 @@ swap is generic, we may write \begin_inset Formula \begin{align*} -\text{sw}_{L}^{M}:L^{M^{A}}\Rightarrow M^{L^{A}}\quad & \text{for the composed-inside transformers,}\\ -\text{sw}_{L}^{M}:M^{L^{A}}\Rightarrow L^{M^{A}}\quad & \text{for the composed-outside transformers.} +\text{sw}_{L}^{M}:L^{M^{A}}\rightarrow M^{L^{A}}\quad & \text{for the composed-inside transformers,}\\ +\text{sw}_{L}^{M}:M^{L^{A}}\rightarrow L^{M^{A}}\quad & \text{for the composed-outside transformers.} \end{align*} \end_inset @@ -7843,7 +7840,7 @@ swap \family default has only one type parameter, there is one naturality law: for any function -\begin_inset Formula $f:A\Rightarrow B$ +\begin_inset Formula $f:A\rightarrow B$ \end_inset , @@ -8341,7 +8338,7 @@ Let us look for such interchange laws. \end_inset , which is a function of type -\begin_inset Formula $M^{M^{L^{A}}}\Rightarrow L^{M^{A}}$ +\begin_inset Formula $M^{M^{L^{A}}}\rightarrow L^{M^{A}}$ \end_inset or, in another notation, @@ -8746,7 +8743,7 @@ If two monads are such that there exists a function \begin_inset Formula \[ -\text{sw}_{L,M}:M^{L^{A}}\Rightarrow L^{M^{A}} +\text{sw}_{L,M}:M^{L^{A}}\rightarrow L^{M^{A}} \] \end_inset @@ -10097,8 +10094,8 @@ pure compatibility laws \begin_inset Formula \begin{align*} -\text{inner-pure-compatibility}:\quad & \text{ftn}_{L}=\text{pu}_{M}^{\uparrow L}\bef\text{ftn}_{T}\quad:L^{L^{M^{A}}}\Rightarrow L^{M^{A}}\quad,\\ -\text{outer-pure-compatibility}:\quad & \text{ftn}_{M}^{\uparrow L}=\text{pu}_{L}^{\uparrow T}\bef\text{ftn}_{T}\quad:L^{M^{M^{A}}}\Rightarrow L^{M^{A}}\quad, +\text{inner-pure-compatibility}:\quad & \text{ftn}_{L}=\text{pu}_{M}^{\uparrow L}\bef\text{ftn}_{T}\quad:L^{L^{M^{A}}}\rightarrow L^{M^{A}}\quad,\\ +\text{outer-pure-compatibility}:\quad & \text{ftn}_{M}^{\uparrow L}=\text{pu}_{L}^{\uparrow T}\bef\text{ftn}_{T}\quad:L^{M^{M^{A}}}\rightarrow L^{M^{A}}\quad, \end{align*} \end_inset @@ -10114,8 +10111,8 @@ or, expressed equivalently through the , \begin_inset Formula \begin{align*} -\text{flm}_{L}f^{:A\Rightarrow L^{M^{B}}} & =\text{pure}_{M}^{\uparrow L}\bef\text{flm}_{T}f^{:A\Rightarrow L^{M^{B}}}\quad,\\ -\big(\text{flm}_{M}f^{:A\Rightarrow M^{B}}\big)^{\uparrow L} & =\text{pure}_{L}^{\uparrow T}\bef\text{flm}_{T}(f^{\uparrow L})\quad. +\text{flm}_{L}f^{:A\rightarrow L^{M^{B}}} & =\text{pure}_{M}^{\uparrow L}\bef\text{flm}_{T}f^{:A\rightarrow L^{M^{B}}}\quad,\\ +\big(\text{flm}_{M}f^{:A\rightarrow M^{B}}\big)^{\uparrow L} & =\text{pure}_{L}^{\uparrow T}\bef\text{flm}_{T}(f^{\uparrow L})\quad. \end{align*} \end_inset @@ -10267,7 +10264,7 @@ Since \begin_layout Standard Note that -\begin_inset Formula $\text{sw}_{L,\text{Id}}:L^{A}\Rightarrow L^{A}$ +\begin_inset Formula $\text{sw}_{L,\text{Id}}:L^{A}\rightarrow L^{A}$ \end_inset is a natural transformation for a monad @@ -10279,7 +10276,7 @@ Note that \end_inset to be equal to the identity map (the only natural transformation -\begin_inset Formula $L^{A}\Rightarrow L^{A}$ +\begin_inset Formula $L^{A}\rightarrow L^{A}$ \end_inset that exists for all monads @@ -10288,7 +10285,7 @@ Note that ). Similarly, one may expect that -\begin_inset Formula $\text{sw}_{\text{Id},M}:M^{A}\Rightarrow M^{A}=\text{id}$ +\begin_inset Formula $\text{sw}_{\text{Id},M}:M^{A}\rightarrow M^{A}=\text{id}$ \end_inset since it is a natural transformation. @@ -10358,11 +10355,11 @@ For composed-inside transformers \end_inset are simply the identity maps in both directions, -\begin_inset Formula $\text{id}:T_{L}^{\text{Id},A}\Rightarrow L^{A}$ +\begin_inset Formula $\text{id}:T_{L}^{\text{Id},A}\rightarrow L^{A}$ \end_inset and -\begin_inset Formula $\text{id}:L^{A}\Rightarrow T_{L}^{\text{Id},A}$ +\begin_inset Formula $\text{id}:L^{A}\rightarrow T_{L}^{\text{Id},A}$ \end_inset . @@ -10392,11 +10389,11 @@ For composed-outside transformers \end_inset are again the identity maps in both directions, -\begin_inset Formula $\text{id}:T_{L}^{\text{Id},A}\Rightarrow L^{A}$ +\begin_inset Formula $\text{id}:T_{L}^{\text{Id},A}\rightarrow L^{A}$ \end_inset and -\begin_inset Formula $\text{id}:L^{A}\Rightarrow T_{L}^{\text{Id},A}$ +\begin_inset Formula $\text{id}:L^{A}\rightarrow T_{L}^{\text{Id},A}$ \end_inset . @@ -10496,7 +10493,7 @@ the same functions \end_inset , then the identity map -\begin_inset Formula $\text{id}:T^{A}\Rightarrow L^{A}$ +\begin_inset Formula $\text{id}:T^{A}\rightarrow L^{A}$ \end_inset will satisfy the laws of the monadic morphism, @@ -10791,8 +10788,8 @@ To be specific, let us assume that The lifting morphisms of a compositional monad transformer are defined by \begin_inset Formula \begin{align*} -\text{lift} & =\text{pu}_{L}:M^{A}\Rightarrow L^{M^{A}}\quad,\\ -\text{blift} & =\text{pu}_{M}^{\uparrow L}:L^{A}\Rightarrow L^{M^{A}}\quad. +\text{lift} & =\text{pu}_{L}:M^{A}\rightarrow L^{M^{A}}\quad,\\ +\text{blift} & =\text{pu}_{M}^{\uparrow L}:L^{A}\rightarrow L^{M^{A}}\quad. \end{align*} \end_inset @@ -12024,7 +12021,7 @@ swap function having the type signature \begin_inset Formula \[ -\text{sw}_{N,M}:M^{L^{A}}\Rightarrow L^{M^{A}}\quad, +\text{sw}_{N,M}:M^{L^{A}}\rightarrow L^{M^{A}}\quad, \] \end_inset @@ -12092,7 +12089,7 @@ swap function as \begin_inset Formula \[ -\text{sw}_{L,M}:P+Q\times L^{A}\Rightarrow L^{P+Q\times A}\quad. +\text{sw}_{L,M}:P+Q\times L^{A}\rightarrow L^{P+Q\times A}\quad. \] \end_inset @@ -12111,7 +12108,7 @@ We can map . We can also map -\begin_inset Formula $Q\times L^{A}\Rightarrow L^{Q\times A}$ +\begin_inset Formula $Q\times L^{A}\rightarrow L^{Q\times A}$ \end_inset since @@ -12121,7 +12118,7 @@ We can map is a functor, \begin_inset Formula \[ -q\times l\Rightarrow\left(a\Rightarrow q\times a\right)^{\uparrow L}l\quad. +q\times l\rightarrow\left(a\rightarrow q\times a\right)^{\uparrow L}l\quad. \] \end_inset @@ -12131,8 +12128,8 @@ q\times l\Rightarrow\left(a\Rightarrow q\times a\right)^{\uparrow L}l\quad. \begin_inset Formula \begin{equation} \text{sw}_{L,M}=\begin{array}{|c||c|} -P & (x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ -Q\times L^{A} & q\times l\Rightarrow(a^{:A}\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l +P & (x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ +Q\times L^{A} & q\times l\rightarrow(a^{:A}\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l \end{array}\quad.\label{eq:single-valued-monad-def-of-swap} \end{equation} @@ -12302,20 +12299,20 @@ swap : \begin_inset Formula \begin{align*} -\text{fmap}_{M}f^{:A\Rightarrow B} & =f^{\uparrow M}=\begin{array}{|c||cc|} +\text{fmap}_{M}f^{:A\rightarrow B} & =f^{\uparrow M}=\begin{array}{|c||cc|} & P & Q\times B\\ \hline P & \text{id} & \bbnum 0\\ -Q\times A & \bbnum 0\enskip & q\times a\Rightarrow q\times f(a) +Q\times A & \bbnum 0\enskip & q\times a\rightarrow q\times f(a) \end{array}\quad,\\ \text{pu}_{M}a^{:A} & =0^{:P}+q_{0}\times a\quad,\quad\quad\text{pu}_{M}=\begin{array}{|c||cc|} & P & Q\times A\\ -\hline A & \bbnum 0\enskip & a\Rightarrow q_{0}\times a +\hline A & \bbnum 0\enskip & a\rightarrow q_{0}\times a \end{array}\quad,\\ -\text{ftn}_{M}^{:M^{M^{A}}\Rightarrow M^{A}} & =\begin{array}{|c||cc|} +\text{ftn}_{M}^{:M^{M^{A}}\rightarrow M^{A}} & =\begin{array}{|c||cc|} & P & Q\times A\\ \hline P & \text{id} & \bbnum 0\\ -Q\times P & q\times p\Rightarrow p & \bbnum 0\\ -Q\times Q\times A & \bbnum 0 & q_{1}\times q_{2}\times a\Rightarrow\left(q_{1}\oplus q_{2}\right)\times a +Q\times P & q\times p\rightarrow p & \bbnum 0\\ +Q\times Q\times A & \bbnum 0 & q_{1}\times q_{2}\times a\rightarrow\left(q_{1}\oplus q_{2}\right)\times a \end{array}\quad. \end{align*} @@ -12360,18 +12357,18 @@ We need to show that \begin{align*} \text{pu}_{L}^{\uparrow M}\bef\text{sw}= & \left\Vert \begin{array}{cc} \text{id} & \bbnum 0\\ -\bbnum 0 & q\times a\Rightarrow q\times\text{pu}_{L}a +\bbnum 0 & q\times a\rightarrow q\times\text{pu}_{L}a \end{array}\right|\bef\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ -q\times l\Rightarrow(x^{:A}\Rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ +q\times l\rightarrow(x^{:A}\rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}l \end{array}\right|\\ \text{composition}:\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ -q\times a\Rightarrow\gunderline{(a^{:A}\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\left(\text{pu}_{L}a\right)} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ +q\times a\rightarrow\gunderline{(a^{:A}\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\left(\text{pu}_{L}a\right)} \end{array}\right|\\ \text{pu}_{L}\text{'s naturality}:\quad & =\begin{array}{|c||c|} -P & x^{:P}\Rightarrow\text{pu}_{L}(x+\bbnum 0^{:Q\times A})\\ -Q\times A & q\times a\Rightarrow\text{pu}_{L}(\bbnum 0^{:P}+q\times a) +P & x^{:P}\rightarrow\text{pu}_{L}(x+\bbnum 0^{:Q\times A})\\ +Q\times A & q\times a\rightarrow\text{pu}_{L}(\bbnum 0^{:P}+q\times a) \end{array}\\ \text{matrix notation}:\quad & =\text{pu}_{L}\quad. \end{align*} @@ -12394,12 +12391,12 @@ We need to show that \begin_inset Formula \begin{align*} \text{pu}_{M}\bef\text{sw} & =\left\Vert \begin{array}{cc} -\bbnum 0 & l^{:L^{A}}\Rightarrow q_{0}\times l\end{array}\right|\bef\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ -q\times l\Rightarrow(x^{:A}\Rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}l +\bbnum 0 & l^{:L^{A}}\rightarrow q_{0}\times l\end{array}\right|\bef\left\Vert \begin{array}{c} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ +q\times l\rightarrow(x^{:A}\rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}l \end{array}\right|\\ -\text{composition}:\quad & =l^{:L^{A}}\Rightarrow(x^{:A}\Rightarrow\bbnum 0^{:P}+q_{0}\times x)^{\uparrow L}l\\ -\text{definition of }\text{pu}_{M}:\quad & =l\Rightarrow\text{pu}_{M}^{\uparrow L}l=\text{pu}_{M}\quad. +\text{composition}:\quad & =l^{:L^{A}}\rightarrow(x^{:A}\rightarrow\bbnum 0^{:P}+q_{0}\times x)^{\uparrow L}l\\ +\text{definition of }\text{pu}_{M}:\quad & =l\rightarrow\text{pu}_{M}^{\uparrow L}l=\text{pu}_{M}\quad. \end{align*} \end_inset @@ -12421,22 +12418,22 @@ Show that \begin{align} \text{ftn}_{L}^{\uparrow M}\bef\text{sw}= & \left\Vert \begin{array}{cc} \text{id} & \bbnum 0\\ -\bbnum 0 & q\times l\Rightarrow q\times\text{ftn}_{L}l +\bbnum 0 & q\times l\rightarrow q\times\text{ftn}_{L}l \end{array}\right|\bef\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ -q\times l\Rightarrow(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ +q\times l\rightarrow(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l \end{array}\right|\nonumber \\ & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ -q\times l\Rightarrow(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}(\text{ftn}_{L}l) +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ +q\times l\rightarrow(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}(\text{ftn}_{L}l) \end{array}\right|\quad,\label{eq:l-interchange-simplify-1}\\ \text{sw}\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L}= & \left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ -q\times l\Rightarrow(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ +q\times l\rightarrow(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l \end{array}\right|\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L}\nonumber \\ & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L}\\ -\big(q\times l\Rightarrow(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l\big)\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L}\\ +\big(q\times l\rightarrow(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l\big)\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L} \end{array}\right|\quad.\nonumber \end{align} @@ -12461,10 +12458,10 @@ noprefix "false" Simplify the upper expression: \begin_inset Formula \begin{align*} - & (x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\gunderline{\text{pu}_{L}\bef\text{sw}^{\uparrow L}}\bef\text{ftn}_{L}\\ -\text{naturality of }\text{pu}_{L}:\quad & =(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{sw}\bef\gunderline{\text{pu}_{L}\bef\text{ftn}_{L}}\\ -\text{identity law of }L:\quad & =\gunderline{(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{sw}}\\ -\text{definition of }\text{sw}:\quad & =(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\quad. + & (x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\gunderline{\text{pu}_{L}\bef\text{sw}^{\uparrow L}}\bef\text{ftn}_{L}\\ +\text{naturality of }\text{pu}_{L}:\quad & =(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{sw}\bef\gunderline{\text{pu}_{L}\bef\text{ftn}_{L}}\\ +\text{identity law of }L:\quad & =\gunderline{(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{sw}}\\ +\text{definition of }\text{sw}:\quad & =(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\quad. \end{align*} \end_inset @@ -12487,23 +12484,23 @@ noprefix "false" Simplify the lower expression; \begin_inset Formula \begin{align} - & \big(q\times l\Rightarrow\gunderline{(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l}\big)\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L}\nonumber \\ -\text{definition of }\triangleright:\quad & =q\times l\Rightarrow l\triangleright(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L}\quad.\label{eq:l-interchange-simplify-2} + & \big(q\times l\rightarrow\gunderline{(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l}\big)\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L}\nonumber \\ +\text{definition of }\triangleright:\quad & =q\times l\rightarrow l\triangleright(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L}\quad.\label{eq:l-interchange-simplify-2} \end{align} \end_inset Simplify the expression -\begin_inset Formula $(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\text{sw}^{\uparrow L}$ +\begin_inset Formula $(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\text{sw}^{\uparrow L}$ \end_inset separately: \begin_inset Formula \begin{align} - & (a\Rightarrow\bbnum 0^{:P}+q\times a)\bef\text{sw}\nonumber \\ -\text{composition}:\quad & =a\Rightarrow\gunderline{\text{sw}\,(\bbnum 0^{:P}+q\times a)}\nonumber \\ -\text{definition of }\text{sw}:\quad & =\gunderline{a\Rightarrow a\triangleright(}x\Rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}\nonumber \\ -\text{omit argument}:\quad & =(x\Rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}\quad.\label{eq:l-interchange-simplify-3} + & (a\rightarrow\bbnum 0^{:P}+q\times a)\bef\text{sw}\nonumber \\ +\text{composition}:\quad & =a\rightarrow\gunderline{\text{sw}\,(\bbnum 0^{:P}+q\times a)}\nonumber \\ +\text{definition of }\text{sw}:\quad & =\gunderline{a\rightarrow a\triangleright(}x\rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}\nonumber \\ +\text{omit argument}:\quad & =(x\rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}\quad.\label{eq:l-interchange-simplify-3} \end{align} \end_inset @@ -12525,10 +12522,10 @@ noprefix "false" ): \begin_inset Formula \begin{align*} - & q\times l\Rightarrow l\triangleright\gunderline{(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\text{sw}^{\uparrow L}}\bef\text{ftn}_{L}\\ -\text{use Eq.~(\ref{eq:l-interchange-simplify-3})}:\quad & =q\times l\Rightarrow l\triangleright\gunderline{(x\Rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L\uparrow L}\bef\text{ftn}_{L}}\\ -\text{naturality of }\text{ftn}_{L}:\quad & =q\times l\Rightarrow\gunderline{l\triangleright\text{ftn}_{L}}\bef(x\Rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}\\ -\text{definition of }\triangleright:\quad & =q\times l\Rightarrow(x\Rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}(\text{ftn}_{L}l)\quad. + & q\times l\rightarrow l\triangleright\gunderline{(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\text{sw}^{\uparrow L}}\bef\text{ftn}_{L}\\ +\text{use Eq.~(\ref{eq:l-interchange-simplify-3})}:\quad & =q\times l\rightarrow l\triangleright\gunderline{(x\rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L\uparrow L}\bef\text{ftn}_{L}}\\ +\text{naturality of }\text{ftn}_{L}:\quad & =q\times l\rightarrow\gunderline{l\triangleright\text{ftn}_{L}}\bef(x\rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}\\ +\text{definition of }\triangleright:\quad & =q\times l\rightarrow(x\rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}(\text{ftn}_{L}l)\quad. \end{align*} \end_inset @@ -12582,16 +12579,16 @@ Show that & \text{ftn}_{M}\bef\text{sw}\nonumber \\ & =\left\Vert \begin{array}{cc} \text{id} & \bbnum 0\\ -q\times p\Rightarrow p & \bbnum 0\\ -\bbnum 0 & q_{1}\times q_{2}\times a\Rightarrow\left(q_{1}\oplus q_{2}\right)\times a +q\times p\rightarrow p & \bbnum 0\\ +\bbnum 0 & q_{1}\times q_{2}\times a\rightarrow\left(q_{1}\oplus q_{2}\right)\times a \end{array}\right|\bef\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ -q\times l\Rightarrow(x\Rightarrow\bbnum 0+q\times x)^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ +q\times l\rightarrow(x\rightarrow\bbnum 0+q\times x)^{\uparrow L}l \end{array}\right|\nonumber \\ & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ -\left(q\times p\Rightarrow p+\bbnum 0\right)\bef\text{pu}_{L}\\ -q_{1}\times q_{2}\times a\Rightarrow(x\Rightarrow\bbnum 0+\left(q_{1}\oplus q_{2}\right)\times x)^{\uparrow L}a +(x^{:P}\rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ +\left(q\times p\rightarrow p+\bbnum 0\right)\bef\text{pu}_{L}\\ +q_{1}\times q_{2}\times a\rightarrow(x\rightarrow\bbnum 0+\left(q_{1}\oplus q_{2}\right)\times x)^{\uparrow L}a \end{array}\right|\quad.\label{eq:m-interchange-law-of-swap-linear-monads-left-hand-side} \end{align} @@ -12616,13 +12613,13 @@ We cannot simplify this any more, so we hope to transform the right-hand \begin{align*} \text{sw}^{\uparrow M}=~ & \begin{array}{|c||cc|} P & \text{id} & \bbnum 0\\ -Q\times P & \bbnum 0 & q\times p\Rightarrow q\times\text{sw}\left(p+\bbnum 0\right)\\ -Q\times Q\times L^{A} & \bbnum 0 & q_{1}\times q_{2}\times l\Rightarrow q_{1}\times\text{sw}\left(\bbnum 0+q_{2}\times l\right) +Q\times P & \bbnum 0 & q\times p\rightarrow q\times\text{sw}\left(p+\bbnum 0\right)\\ +Q\times Q\times L^{A} & \bbnum 0 & q_{1}\times q_{2}\times l\rightarrow q_{1}\times\text{sw}\left(\bbnum 0+q_{2}\times l\right) \end{array}\\ & =\begin{array}{|c||cc|} P & \text{id} & \bbnum 0\\ -Q\times P & \bbnum 0 & q\times p\Rightarrow q\times\text{pu}_{L}\left(p+\bbnum 0\right)\\ -Q\times Q\times L^{A} & \bbnum 0 & q_{1}\times q_{2}\times l\Rightarrow q_{1}\times(x\Rightarrow\bbnum 0+q_{2}\times x)^{\uparrow L}l +Q\times P & \bbnum 0 & q\times p\rightarrow q\times\text{pu}_{L}\left(p+\bbnum 0\right)\\ +Q\times Q\times L^{A} & \bbnum 0 & q_{1}\times q_{2}\times l\rightarrow q_{1}\times(x\rightarrow\bbnum 0+q_{2}\times x)^{\uparrow L}l \end{array}\quad. \end{align*} @@ -12638,21 +12635,21 @@ Then compute the composition & \text{sw}^{\uparrow M}\bef\text{sw}\\ & =\left\Vert \begin{array}{cc} \text{id} & \bbnum 0\\ -\bbnum 0 & q\times p\Rightarrow q\times\text{pu}_{L}\left(p+\bbnum 0\right)\\ -\bbnum 0 & q_{1}\times q_{2}\times l\Rightarrow q_{1}\times(x\Rightarrow\bbnum 0+q_{2}\times x)^{\uparrow L}l +\bbnum 0 & q\times p\rightarrow q\times\text{pu}_{L}\left(p+\bbnum 0\right)\\ +\bbnum 0 & q_{1}\times q_{2}\times l\rightarrow q_{1}\times(x\rightarrow\bbnum 0+q_{2}\times x)^{\uparrow L}l \end{array}\right|\bef\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ -q\times l\Rightarrow(x\Rightarrow\bbnum 0+q\times x)^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ +q\times l\rightarrow(x\rightarrow\bbnum 0+q\times x)^{\uparrow L}l \end{array}\right|\\ & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ -q\times p\Rightarrow(x^{:M^{A}}\Rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}\left(\text{pu}_{L}\left(p+\bbnum 0\right)\right)\\ -q_{1}\times q_{2}\times l\Rightarrow(x^{:M^{A}}\Rightarrow\bbnum 0^{:P}+q_{1}\times x)^{\uparrow L}(x\Rightarrow\bbnum 0+q_{2}\times x)^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ +q\times p\rightarrow(x^{:M^{A}}\rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}\left(\text{pu}_{L}\left(p+\bbnum 0\right)\right)\\ +q_{1}\times q_{2}\times l\rightarrow(x^{:M^{A}}\rightarrow\bbnum 0^{:P}+q_{1}\times x)^{\uparrow L}(x\rightarrow\bbnum 0+q_{2}\times x)^{\uparrow L}l \end{array}\right|\\ & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ -q\times p\Rightarrow\text{pu}_{L}(\bbnum 0^{:P}+q\times\left(p+\bbnum 0\right))\\ -q_{1}\times q_{2}\times l\Rightarrow(x^{:M^{A}}\Rightarrow\bbnum 0+q_{1}\times(\bbnum 0+q_{2}\times x))^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ +q\times p\rightarrow\text{pu}_{L}(\bbnum 0^{:P}+q\times\left(p+\bbnum 0\right))\\ +q_{1}\times q_{2}\times l\rightarrow(x^{:M^{A}}\rightarrow\bbnum 0+q_{1}\times(\bbnum 0+q_{2}\times x))^{\uparrow L}l \end{array}\right|\quad. \end{align*} @@ -12666,24 +12663,24 @@ Now we need to post-compose \begin_inset Formula \begin{align*} \text{sw}^{\uparrow M}\bef\text{sw}\bef\text{ftn}_{M}^{\uparrow L} & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0)\bef\gunderline{\text{pu}_{L}\bef\text{ftn}_{M}^{\uparrow L}}\\ -(q\times p\Rightarrow\bbnum 0^{:P}+q\times\left(p+\bbnum 0\right))\bef\gunderline{\text{pu}_{L}\bef\text{ftn}_{M}^{\uparrow L}}\\ -q_{1}\times q_{2}\times l\Rightarrow l\triangleright(x^{:M^{A}}\Rightarrow\bbnum 0+q_{1}\times(\bbnum 0+q_{2}\times x))^{\uparrow L}\bef\text{ftn}_{M}^{\uparrow L} +(x^{:P}\rightarrow x+\bbnum 0)\bef\gunderline{\text{pu}_{L}\bef\text{ftn}_{M}^{\uparrow L}}\\ +(q\times p\rightarrow\bbnum 0^{:P}+q\times\left(p+\bbnum 0\right))\bef\gunderline{\text{pu}_{L}\bef\text{ftn}_{M}^{\uparrow L}}\\ +q_{1}\times q_{2}\times l\rightarrow l\triangleright(x^{:M^{A}}\rightarrow\bbnum 0+q_{1}\times(\bbnum 0+q_{2}\times x))^{\uparrow L}\bef\text{ftn}_{M}^{\uparrow L} \end{array}\right|\\ \text{pu}_{L}\text{'s naturality}:\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0)\bef\text{ftn}_{M}\bef\text{pu}_{L}\\ -(q\times p\Rightarrow\bbnum 0^{:P}+q\times\left(p+\bbnum 0\right))\bef\text{ftn}_{M}\bef\text{pu}_{L}\\ -q_{1}\times q_{2}\times l\Rightarrow l\triangleright(x^{:M^{A}}\Rightarrow\gunderline{\text{ftn}_{M}\left(\bbnum 0+q_{1}\times(\bbnum 0+q_{2}\times x)\right)})^{\uparrow L} +(x^{:P}\rightarrow x+\bbnum 0)\bef\text{ftn}_{M}\bef\text{pu}_{L}\\ +(q\times p\rightarrow\bbnum 0^{:P}+q\times\left(p+\bbnum 0\right))\bef\text{ftn}_{M}\bef\text{pu}_{L}\\ +q_{1}\times q_{2}\times l\rightarrow l\triangleright(x^{:M^{A}}\rightarrow\gunderline{\text{ftn}_{M}\left(\bbnum 0+q_{1}\times(\bbnum 0+q_{2}\times x)\right)})^{\uparrow L} \end{array}\right|\\ \text{compute }\text{ftn}_{M}(...):\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow\text{ftn}_{M}(x+\bbnum 0))\bef\text{pu}_{L}\\ -(q\times p\Rightarrow\text{ftn}_{M}(\bbnum 0^{:P}+q\times\left(p+\bbnum 0\right)))\bef\text{pu}_{L}\\ -q_{1}\times q_{2}\times l\Rightarrow l\triangleright(x^{:M^{A}}\Rightarrow\bbnum 0+\left(q_{1}\oplus q_{2}\right)\times x)^{\uparrow L} +(x^{:P}\rightarrow\text{ftn}_{M}(x+\bbnum 0))\bef\text{pu}_{L}\\ +(q\times p\rightarrow\text{ftn}_{M}(\bbnum 0^{:P}+q\times\left(p+\bbnum 0\right)))\bef\text{pu}_{L}\\ +q_{1}\times q_{2}\times l\rightarrow l\triangleright(x^{:M^{A}}\rightarrow\bbnum 0+\left(q_{1}\oplus q_{2}\right)\times x)^{\uparrow L} \end{array}\right|\\ \text{compute }\text{ftn}_{M}(...):\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ -(q\times p\Rightarrow p+\bbnum 0)\bef\text{pu}_{L}\\ -q_{1}\times q_{2}\times l\Rightarrow(x^{:M^{A}}\Rightarrow\bbnum 0+\left(q_{1}\oplus q_{2}\right)\times x)^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ +(q\times p\rightarrow p+\bbnum 0)\bef\text{pu}_{L}\\ +q_{1}\times q_{2}\times l\rightarrow(x^{:M^{A}}\rightarrow\bbnum 0+\left(q_{1}\oplus q_{2}\right)\times x)^{\uparrow L}l \end{array}\right|\quad. \end{align*} @@ -12762,12 +12759,12 @@ The first law is the swap identity law, \begin{align*} & \text{sw}_{\text{Id},M}\\ \text{Eq.~(\ref{eq:single-valued-monad-def-of-swap}) with }L=\text{Id}:\quad & =\begin{array}{|c||c|} -P & (x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{\text{Id}}\\ -Q\times\text{Id}^{A} & q\times l\Rightarrow(a^{:A}\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow\text{Id}}l +P & (x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{\text{Id}}\\ +Q\times\text{Id}^{A} & q\times l\rightarrow(a^{:A}\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow\text{Id}}l \end{array}\\ \text{matrix notation}:\quad & =\begin{array}{|c||c|} -P & x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A}\\ -Q\times A & q\times a\Rightarrow\bbnum 0^{:P}+q\times a +P & x^{:P}\rightarrow x+\bbnum 0^{:Q\times A}\\ +Q\times A & q\times a\rightarrow\bbnum 0^{:P}+q\times a \end{array}\\ & =\text{id}\quad. \end{align*} @@ -12783,16 +12780,16 @@ Begin with the left-hand side of the second law, \begin{align*} & \text{sw}_{L,M}\bef\phi\\ \text{definition of }\text{sw}_{L,M}:\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ -q\times l\Rightarrow(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ +q\times l\rightarrow(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l \end{array}\right|\gunderline{\bef\phi}\\ \text{compose with }\phi:\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\bef\phi\\ -q\times l\Rightarrow l\triangleright\gunderline{(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\phi} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\bef\phi\\ +q\times l\rightarrow l\triangleright\gunderline{(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\phi} \end{array}\right|\\ \text{naturality of }\phi:\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{N}\\ -q\times l\Rightarrow l\triangleright\phi\bef(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow N} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{N}\\ +q\times l\rightarrow l\triangleright\phi\bef(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow N} \end{array}\right|\quad. \end{align*} @@ -12804,14 +12801,14 @@ The right-hand side is & \phi^{\uparrow M}\bef\text{sw}_{N,M}\\ & =\left\Vert \begin{array}{cc} \text{id} & \bbnum 0\\ -\bbnum 0 & q\times l\Rightarrow q\times\phi\left(l\right) +\bbnum 0 & q\times l\rightarrow q\times\phi\left(l\right) \end{array}\right|\bef\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{N}\\ -q\times n\Rightarrow n\triangleright(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow N} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{N}\\ +q\times n\rightarrow n\triangleright(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow N} \end{array}\right|\\ \text{composition}:\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{N}\\ -q\times l\Rightarrow n\triangleright\phi\bef(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow N} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{N}\\ +q\times l\rightarrow n\triangleright\phi\bef(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow N} \end{array}\right|\quad. \end{align*} @@ -12826,12 +12823,12 @@ The left-hand side of the third law is \begin{align} & \text{sw}_{L,M}\bef\theta^{\uparrow L}\nonumber \\ \text{compose with }\theta^{\uparrow L}:\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\gunderline{\text{pu}_{L}\bef\theta^{\uparrow L}}\\ -q\times l\Rightarrow l\triangleright(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\theta^{\uparrow L} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\gunderline{\text{pu}_{L}\bef\theta^{\uparrow L}}\\ +q\times l\rightarrow l\triangleright(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\theta^{\uparrow L} \end{array}\right|\nonumber \\ \text{naturality of }\text{pu}_{L}:\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\theta\bef\text{pu}_{L}\\ -q\times l\Rightarrow l\triangleright\big(a\Rightarrow\theta(\bbnum 0^{:P}+q\times a)\big)^{\uparrow L} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\theta\bef\text{pu}_{L}\\ +q\times l\rightarrow l\triangleright\big(a\rightarrow\theta(\bbnum 0^{:P}+q\times a)\big)^{\uparrow L} \end{array}\right|\quad.\label{eq:linear-monads-monadic-naturality-of-swap-2} \end{align} @@ -12840,10 +12837,10 @@ q\times l\Rightarrow l\triangleright\big(a\Rightarrow\theta(\bbnum 0^{:P}+q\time We expect this to equal the right-hand side, which we write as \begin_inset Formula \begin{align} - & m^{:M^{L^{A}}}\Rightarrow\theta(m)\nonumber \\ + & m^{:M^{L^{A}}}\rightarrow\theta(m)\nonumber \\ \text{matrix notation}:\quad & =\left\Vert \begin{array}{c} -x^{:P}\Rightarrow\theta(x+\bbnum 0^{:Q\times L^{A}})\\ -q\times l\Rightarrow\theta(\bbnum 0^{:P}+q\times l) +x^{:P}\rightarrow\theta(x+\bbnum 0^{:Q\times L^{A}})\\ +q\times l\rightarrow\theta(\bbnum 0^{:P}+q\times l) \end{array}\right|\quad.\label{eq:linear-monads-monadic-naturality-of-swap-1} \end{align} @@ -12867,14 +12864,14 @@ noprefix "false" The upper line can be transformed as \begin_inset Formula \begin{align*} - & (x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\gunderline{\theta\bef\text{pu}_{L}}\\ -\text{naturality of }\theta:\quad & =(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\gunderline{\text{pu}_{L}^{\uparrow M}}\bef\theta\\ -\text{definition of }^{\uparrow M}:\quad & =x^{:P}\Rightarrow\left\Vert \begin{array}{cc} + & (x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\gunderline{\theta\bef\text{pu}_{L}}\\ +\text{naturality of }\theta:\quad & =(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\gunderline{\text{pu}_{L}^{\uparrow M}}\bef\theta\\ +\text{definition of }^{\uparrow M}:\quad & =x^{:P}\rightarrow\left\Vert \begin{array}{cc} x\enskip & \bbnum 0\end{array}\right|\triangleright\left\Vert \begin{array}{cc} \text{id} & \bbnum 0\\ -\bbnum 0 & q\times l\Rightarrow q\times\text{pu}_{L}l +\bbnum 0 & q\times l\rightarrow q\times\text{pu}_{L}l \end{array}\right|\bef\theta\\ -\text{matrix notation}:\quad & =x^{:P}\Rightarrow(x+\bbnum 0^{:Q\times L^{A}})\triangleright\theta\quad. +\text{matrix notation}:\quad & =x^{:P}\rightarrow(x+\bbnum 0^{:Q\times L^{A}})\triangleright\theta\quad. \end{align*} \end_inset @@ -12912,7 +12909,7 @@ noprefix "false" \end_inset ), we need to evaluate the monadic morphism -\begin_inset Formula $\theta:M^{A}\Rightarrow A$ +\begin_inset Formula $\theta:M^{A}\rightarrow A$ \end_inset on a specific value of type @@ -13012,11 +13009,11 @@ We can compute . To write this as a formula, define the function -\begin_inset Formula $f^{:\bbnum 1\Rightarrow A}$ +\begin_inset Formula $f^{:\bbnum 1\rightarrow A}$ \end_inset as -\begin_inset Formula $f\triangleq\left(\_\Rightarrow a\right)$ +\begin_inset Formula $f\triangleq\left(\_\rightarrow a\right)$ \end_inset using the fixed value @@ -13095,9 +13092,9 @@ noprefix "false" ) as \begin_inset Formula \begin{align*} - & q\times l\Rightarrow l\triangleright\big(a\Rightarrow\theta(\bbnum 0^{:P}+q\times a)\big)^{\uparrow L}\\ -\text{use Eq.~(\ref{eq:runner-on-linear-monads})}:\quad & =q\times l\Rightarrow l\,\gunderline{\triangleright\,\big(a\Rightarrow a\big)^{\uparrow L}}\\ -\text{identity law}:\quad & =q\times l\Rightarrow l\quad. + & q\times l\rightarrow l\triangleright\big(a\rightarrow\theta(\bbnum 0^{:P}+q\times a)\big)^{\uparrow L}\\ +\text{use Eq.~(\ref{eq:runner-on-linear-monads})}:\quad & =q\times l\rightarrow l\,\gunderline{\triangleright\,\big(a\rightarrow a\big)^{\uparrow L}}\\ +\text{identity law}:\quad & =q\times l\rightarrow l\quad. \end{align*} \end_inset @@ -13117,7 +13114,7 @@ noprefix "false" \end_inset ) is the same function, -\begin_inset Formula $q\times l\Rightarrow l$ +\begin_inset Formula $q\times l\rightarrow l$ \end_inset . @@ -13581,8 +13578,8 @@ Search monad, \begin_inset Formula \begin{align*} -\text{(the \texttt{Reader} monad)} & :\quad\quad R^{A}\triangleq Z\Rightarrow A\quad,\\ -\text{(the \texttt{Search} monad)} & :\quad\quad S^{A}\triangleq\left(A\Rightarrow Z\right)\Rightarrow A\quad, +\text{(the \texttt{Reader} monad)} & :\quad\quad R^{A}\triangleq Z\rightarrow A\quad,\\ +\text{(the \texttt{Search} monad)} & :\quad\quad S^{A}\triangleq\left(A\rightarrow Z\right)\rightarrow A\quad, \end{align*} \end_inset @@ -13595,8 +13592,8 @@ where These monads have composed-outside transformers: \begin_inset Formula \begin{align*} -\text{(the \texttt{ReaderT} transformer)} & :\quad\quad T_{R}^{M,A}\triangleq Z\Rightarrow M^{A}\quad,\\ -\text{(the \texttt{SearchT} transformer)} & :\quad\quad T_{S}^{M,A}\triangleq\left(M^{A}\Rightarrow Z\right)\Rightarrow M^{A}\quad. +\text{(the \texttt{ReaderT} transformer)} & :\quad\quad T_{R}^{M,A}\triangleq Z\rightarrow M^{A}\quad,\\ +\text{(the \texttt{SearchT} transformer)} & :\quad\quad T_{S}^{M,A}\triangleq\left(M^{A}\rightarrow Z\right)\rightarrow M^{A}\quad. \end{align*} \end_inset @@ -13610,7 +13607,7 @@ To build intuition for rigid monads, we will look at some general constructions \begin_layout Enumerate Choice: -\begin_inset Formula $C^{A}\triangleq H^{A}\Rightarrow A$ +\begin_inset Formula $C^{A}\triangleq H^{A}\rightarrow A$ \end_inset is a rigid monad if @@ -13654,7 +13651,7 @@ Product: \begin_layout Enumerate Selector: -\begin_inset Formula $S^{A}\triangleq F^{A\Rightarrow R^{Q}}\Rightarrow R^{A}$ +\begin_inset Formula $S^{A}\triangleq F^{A\rightarrow R^{Q}}\rightarrow R^{A}$ \end_inset is a rigid monad for any rigid monad @@ -13705,7 +13702,7 @@ the choice \series default monad, -\begin_inset Formula $R^{A}\triangleq H^{A}\Rightarrow A$ +\begin_inset Formula $R^{A}\triangleq H^{A}\rightarrow A$ \end_inset , defines a rigid monad @@ -13751,7 +13748,7 @@ consume \end_inset , a function such as -\begin_inset Formula $H^{A}\triangleq A\Rightarrow Q$ +\begin_inset Formula $H^{A}\triangleq A\rightarrow Q$ \end_inset , or a more complicated contrafunctor. @@ -13771,7 +13768,7 @@ Different choices of the contrafunctor \end_inset (the identity monad), -\begin_inset Formula $R^{A}\triangleq Z\Rightarrow A$ +\begin_inset Formula $R^{A}\triangleq Z\rightarrow A$ \end_inset (the reader monad), as well as the @@ -13818,7 +13815,7 @@ search monad \end_inset -\begin_inset Formula $R^{A}\triangleq\left(A\Rightarrow Q\right)\Rightarrow A$ +\begin_inset Formula $R^{A}\triangleq\left(A\rightarrow Q\right)\rightarrow A$ \end_inset . @@ -13832,7 +13829,7 @@ The search monad represents the effect of searching for a value of type \end_inset that satisfies a condition expressed through a function of type -\begin_inset Formula $A\Rightarrow Q$ +\begin_inset Formula $A\rightarrow Q$ \end_inset . @@ -13842,7 +13839,7 @@ The search monad represents the effect of searching for a value of type . One may implement a function of type -\begin_inset Formula $\left(A\Rightarrow\text{Bool}\right)\Rightarrow A$ +\begin_inset Formula $\left(A\rightarrow\text{Bool}\right)\rightarrow A$ \end_inset that @@ -13854,7 +13851,7 @@ somehow \end_inset that might satisfy the given predicate of type -\begin_inset Formula $A\Rightarrow\text{Bool}$ +\begin_inset Formula $A\rightarrow\text{Bool}$ \end_inset . @@ -13872,7 +13869,7 @@ some \begin_layout Standard A closely related monad is the search-with-failure monad, -\begin_inset Formula $R^{A}\triangleq\left(A\Rightarrow\text{Bool}\right)\Rightarrow\bbnum 1+A$ +\begin_inset Formula $R^{A}\triangleq\left(A\rightarrow\text{Bool}\right)\rightarrow\bbnum 1+A$ \end_inset . @@ -13898,7 +13895,7 @@ Assume that is a monad, and denote for brevity \begin_inset Formula \[ -T^{A}\triangleq R^{M^{A}}\triangleq H^{M^{A}}\Rightarrow M^{A}\quad. +T^{A}\triangleq R^{M^{A}}\triangleq H^{M^{A}}\rightarrow M^{A}\quad. \] \end_inset @@ -13949,7 +13946,7 @@ noprefix "false" \end_layout \begin_layout Standard -\begin_inset Formula $T^{\bullet}\triangleq R^{M^{\bullet}}\triangleq H^{M^{\bullet}}\Rightarrow M^{\bullet}$ +\begin_inset Formula $T^{\bullet}\triangleq R^{M^{\bullet}}\triangleq H^{M^{\bullet}}\rightarrow M^{\bullet}$ \end_inset is a monad if @@ -13999,11 +13996,11 @@ To define the monad instance for , it is convenient to use the Kleisli formulation of the monad. In this formulation, we consider Kleisli morphisms of type -\begin_inset Formula $A\Rightarrow T^{B}$ +\begin_inset Formula $A\rightarrow T^{B}$ \end_inset and then define the Kleisli identity morphism, -\begin_inset Formula $\text{pu}_{T}:A\Rightarrow T^{A}$ +\begin_inset Formula $\text{pu}_{T}:A\rightarrow T^{A}$ \end_inset , and the Kleisli product operation @@ -14013,7 +14010,7 @@ To define the monad instance for , \begin_inset Formula \[ -f^{:A\Rightarrow T^{B}}\diamond_{T}g^{:B\Rightarrow T^{C}}:A\Rightarrow T^{C}\quad. +f^{:A\rightarrow T^{B}}\diamond_{T}g^{:B\rightarrow T^{C}}:A\rightarrow T^{C}\quad. \] \end_inset @@ -14031,15 +14028,15 @@ We notice that since the type constructor \end_inset is itself a function type -\begin_inset Formula $H^{A}\Rightarrow A$ +\begin_inset Formula $H^{A}\rightarrow A$ \end_inset , the type of the Kleisli morphism -\begin_inset Formula $A\Rightarrow T^{B}$ +\begin_inset Formula $A\rightarrow T^{B}$ \end_inset is actually -\begin_inset Formula $A\Rightarrow T^{B}\triangleq A\Rightarrow H^{M^{B}}\Rightarrow M^{B}$ +\begin_inset Formula $A\rightarrow T^{B}\triangleq A\rightarrow H^{M^{B}}\rightarrow M^{B}$ \end_inset . @@ -14065,12 +14062,12 @@ We notice that since the type constructor \end_inset of type -\begin_inset Formula $A\Rightarrow M^{B}$ +\begin_inset Formula $A\rightarrow M^{B}$ \end_inset more easily available. If we flip the curried arguments of the Kleisli morphism type -\begin_inset Formula $A\Rightarrow H^{M^{B}}\Rightarrow M^{B}$ +\begin_inset Formula $A\rightarrow H^{M^{B}}\rightarrow M^{B}$ \end_inset and instead consider the @@ -14088,20 +14085,20 @@ flipped Kleisli \series default morphisms of type -\begin_inset Formula $H^{M^{B}}\Rightarrow A\Rightarrow M^{B}$ +\begin_inset Formula $H^{M^{B}}\rightarrow A\rightarrow M^{B}$ \end_inset , the type -\begin_inset Formula $A\Rightarrow M^{B}$ +\begin_inset Formula $A\rightarrow M^{B}$ \end_inset will be easier to reason about. Since the type -\begin_inset Formula $A\Rightarrow H^{M^{B}}\Rightarrow M^{B}$ +\begin_inset Formula $A\rightarrow H^{M^{B}}\rightarrow M^{B}$ \end_inset is equivalent to -\begin_inset Formula $A\Rightarrow H^{M^{B}}\Rightarrow M^{B}$ +\begin_inset Formula $A\rightarrow H^{M^{B}}\rightarrow M^{B}$ \end_inset , any laws we prove for the flipped Kleisli morphisms will yield the correspondi @@ -14121,8 +14118,8 @@ We temporarily denote by the flipped Kleisli operations: \begin_inset Formula \begin{align*} -\tilde{\text{pu}}_{T} & :\ H^{M^{A}}\Rightarrow A\Rightarrow M^{A}\\ -f^{:H^{M^{B}}\Rightarrow A\Rightarrow M^{B}}\tilde{\diamond}_{T}g^{:H^{M^{C}}\Rightarrow B\Rightarrow M^{C}} & :\ H^{M^{C}}\Rightarrow A\Rightarrow M^{C}\quad. +\tilde{\text{pu}}_{T} & :\ H^{M^{A}}\rightarrow A\rightarrow M^{A}\\ +f^{:H^{M^{B}}\rightarrow A\rightarrow M^{B}}\tilde{\diamond}_{T}g^{:H^{M^{C}}\rightarrow B\rightarrow M^{C}} & :\ H^{M^{C}}\rightarrow A\rightarrow M^{C}\quad. \end{align*} \end_inset @@ -14159,8 +14156,8 @@ To define the operations The definitions are \begin_inset Formula \begin{align*} -\tilde{\text{pu}}_{T} & =\_\Rightarrow\text{pu}_{M}\quad\text{(the argument is unused)}\quad,\\ -f\tilde{\diamond}_{T}g & =q\Rightarrow\left(f\,p\right)\diamond_{M}\left(g\,q\right)\quad\text{where}\\ +\tilde{\text{pu}}_{T} & =\_\rightarrow\text{pu}_{M}\quad\text{(the argument is unused)}\quad,\\ +f\tilde{\diamond}_{T}g & =q\rightarrow\left(f\,p\right)\diamond_{M}\left(g\,q\right)\quad\text{where}\\ & \quad p^{:H^{M^{B}}}=\left(\text{flm}_{M}\left(g\,q\right)\right)^{\downarrow H}q\quad. \end{align*} @@ -14171,11 +14168,11 @@ This definition works by using the Kleisli product \end_inset on values -\begin_inset Formula $f\,p:A\Rightarrow M^{B}$ +\begin_inset Formula $f\,p:A\rightarrow M^{B}$ \end_inset and -\begin_inset Formula $g\,q:B\Rightarrow M^{C}$ +\begin_inset Formula $g\,q:B\rightarrow M^{C}$ \end_inset . @@ -14184,7 +14181,7 @@ This definition works by using the Kleisli product \end_inset , we use the function -\begin_inset Formula $\text{flm}_{M}\left(g\,q\right):M^{B}\Rightarrow M^{C}$ +\begin_inset Formula $\text{flm}_{M}\left(g\,q\right):M^{B}\rightarrow M^{C}$ \end_inset to @@ -14210,7 +14207,7 @@ Written as a single expression, the definition of is \begin_inset Formula \begin{equation} -f\tilde{\diamond}_{T}g=q\Rightarrow f\left(\left(\text{flm}_{M}\left(g\,q\right)\right)^{\downarrow H}q\right)\diamond_{M}\left(g\,q\right)\quad.\label{eq:def-flipped-kleisli} +f\tilde{\diamond}_{T}g=q\rightarrow f\left(\left(\text{flm}_{M}\left(g\,q\right)\right)^{\downarrow H}q\right)\diamond_{M}\left(g\,q\right)\quad.\label{eq:def-flipped-kleisli} \end{equation} \end_inset @@ -14219,9 +14216,9 @@ Checking the left identity law: \begin_inset Formula \begin{align*} & \tilde{\text{pu}}_{T}\tilde{\diamond}_{T}g\\ -\text{definition of }\tilde{\diamond}_{T}:\quad & =q\Rightarrow\gunderline{\tilde{\text{pu}}_{T}\left(\left(\text{flm}_{M}\left(g\,q\right)\right)^{\downarrow H}q\right)}\diamond_{M}\left(g\,q\right)\\ -\text{definition of }\tilde{\text{pu}}_{T}:\quad & =q\Rightarrow\gunderline{\text{pu}_{M}\diamond_{M}}g\,q\\ -\text{left identity law for }M:\quad & =q\Rightarrow g\,q\\ +\text{definition of }\tilde{\diamond}_{T}:\quad & =q\rightarrow\gunderline{\tilde{\text{pu}}_{T}\left(\left(\text{flm}_{M}\left(g\,q\right)\right)^{\downarrow H}q\right)}\diamond_{M}\left(g\,q\right)\\ +\text{definition of }\tilde{\text{pu}}_{T}:\quad & =q\rightarrow\gunderline{\text{pu}_{M}\diamond_{M}}g\,q\\ +\text{left identity law for }M:\quad & =q\rightarrow g\,q\\ \text{function expansion}:\quad & =g \end{align*} @@ -14231,10 +14228,10 @@ Checking the right identity law: \begin_inset Formula \begin{align*} & f\tilde{\diamond}_{T}\tilde{\text{pu}}_{T}\\ -\text{definition of }\tilde{\diamond}_{T}:\quad & =q\Rightarrow f\left(\left(\text{flm}_{M}\left(\tilde{\text{pu}}_{T}q\right)\right)^{\downarrow H}q\right)\diamond_{M}\gunderline{\left(\tilde{\text{pu}}_{T}q\right)}\\ -\text{definition of }\tilde{\text{pu}}_{T}:\quad & =q\Rightarrow f\left(\left(\text{flm}_{M}\left(\text{pu}_{M}\right)\right)^{\downarrow H}q\right)\gunderline{\diamond_{M}\text{pu}_{M}}\\ -\text{right identity law for }M:\quad & =q\Rightarrow f\gunderline{\left(\left(\text{id}\right)^{\downarrow H}q\right)}\\ -\text{identity law for }H:\quad & =q\Rightarrow f\,q\\ +\text{definition of }\tilde{\diamond}_{T}:\quad & =q\rightarrow f\left(\left(\text{flm}_{M}\left(\tilde{\text{pu}}_{T}q\right)\right)^{\downarrow H}q\right)\diamond_{M}\gunderline{\left(\tilde{\text{pu}}_{T}q\right)}\\ +\text{definition of }\tilde{\text{pu}}_{T}:\quad & =q\rightarrow f\left(\left(\text{flm}_{M}\left(\text{pu}_{M}\right)\right)^{\downarrow H}q\right)\gunderline{\diamond_{M}\text{pu}_{M}}\\ +\text{right identity law for }M:\quad & =q\rightarrow f\gunderline{\left(\left(\text{id}\right)^{\downarrow H}q\right)}\\ +\text{identity law for }H:\quad & =q\rightarrow f\,q\\ \text{function expansion}:\quad & =f \end{align*} @@ -14253,8 +14250,8 @@ Checking the associativity law: \begin_inset Formula \begin{align*} & \left(f\tilde{\diamond}_{T}g\right)\tilde{\diamond}_{T}h\\ - & =\left(s\Rightarrow f\left(\left(\text{flm}_{M}\left(g\,s\right)\right)^{\downarrow H}s\right)\diamond_{M}\left(g\,s\right)\right)\tilde{\diamond}_{T}h\\ - & =q\Rightarrow f\left(\left(\text{flm}_{M}\left(g\,r\right)\right)^{\downarrow H}r\right)\diamond_{M}\left(g\,r\right)\diamond_{M}\left(h\,q\right)\quad\text{where}\\ + & =\left(s\rightarrow f\left(\left(\text{flm}_{M}\left(g\,s\right)\right)^{\downarrow H}s\right)\diamond_{M}\left(g\,s\right)\right)\tilde{\diamond}_{T}h\\ + & =q\rightarrow f\left(\left(\text{flm}_{M}\left(g\,r\right)\right)^{\downarrow H}r\right)\diamond_{M}\left(g\,r\right)\diamond_{M}\left(h\,q\right)\quad\text{where}\\ & \quad\quad\quad r\triangleq\left(\text{flm}_{M}\left(h\,q\right)\right)^{\downarrow H}q\quad; \end{align*} @@ -14264,8 +14261,8 @@ while \begin_inset Formula \begin{align*} & f\tilde{\diamond}_{T}\left(g\tilde{\diamond}_{T}h\right)\\ - & =f\tilde{\diamond}_{T}\left(q\Rightarrow g\left(\left(\text{flm}_{M}\left(h\,q\right)\right)^{\downarrow H}q\right)\diamond_{M}\left(h\,q\right)\right)\\ - & =q\Rightarrow f\left(\left(\text{flm}_{M}\,k\right)^{\downarrow H}q\right)\diamond_{M}u\quad\text{where}\\ + & =f\tilde{\diamond}_{T}\left(q\rightarrow g\left(\left(\text{flm}_{M}\left(h\,q\right)\right)^{\downarrow H}q\right)\diamond_{M}\left(h\,q\right)\right)\\ + & =q\rightarrow f\left(\left(\text{flm}_{M}\,k\right)^{\downarrow H}q\right)\diamond_{M}u\quad\text{where}\\ & \quad\quad\quad r\triangleq\left(\text{flm}_{M}\left(h\,q\right)\right)^{\downarrow H}q\quad\text{and}\\ & \quad\quad\quad u\triangleq\left(g\,r\right)\diamond_{M}\left(h\,q\right)\quad. \end{align*} @@ -14405,10 +14402,10 @@ noprefix "false" can be written equivalently as \begin_inset Formula \begin{align} -\text{pu}_{T} & (a^{:A}):\ H^{M^{A}}\Rightarrow M^{A}\quad,\nonumber \\ -\text{pu}_{T} & (a)\triangleq\left(\_\Rightarrow\text{pu}_{M}a\right)\quad;\nonumber \\ -\text{flm}_{T} & \big(f^{:A\Rightarrow H^{M^{B}}\Rightarrow M^{B}}\big):\ \big(H^{M^{A}}\Rightarrow M^{A}\big)\Rightarrow H^{M^{B}}\Rightarrow M^{B}\quad,\nonumber \\ -\text{flm}_{T} & f\triangleq t^{:R^{M^{A}}}\Rightarrow q^{:H^{M^{B}}}\Rightarrow\big(\text{flm}_{M}(x^{:A}\Rightarrow f\,x\,q)\big)^{\uparrow R}t\,q\quad.\label{eq:rigid-monad-flm-T-def} +\text{pu}_{T} & (a^{:A}):\ H^{M^{A}}\rightarrow M^{A}\quad,\nonumber \\ +\text{pu}_{T} & (a)\triangleq\left(\_\rightarrow\text{pu}_{M}a\right)\quad;\nonumber \\ +\text{flm}_{T} & \big(f^{:A\rightarrow H^{M^{B}}\rightarrow M^{B}}\big):\ \big(H^{M^{A}}\rightarrow M^{A}\big)\rightarrow H^{M^{B}}\rightarrow M^{B}\quad,\nonumber \\ +\text{flm}_{T} & f\triangleq t^{:R^{M^{A}}}\rightarrow q^{:H^{M^{B}}}\rightarrow\big(\text{flm}_{M}(x^{:A}\rightarrow f\,x\,q)\big)^{\uparrow R}t\,q\quad.\label{eq:rigid-monad-flm-T-def} \end{align} \end_inset @@ -14432,7 +14429,7 @@ flatMap method, which is implemented as \begin_inset Formula \begin{equation} -\text{flm}_{R}g^{:A\Rightarrow R^{B}}=t^{:R^{A}}\Rightarrow q^{:H^{B}}\Rightarrow(x^{:A}\Rightarrow g\,x\,q)^{\uparrow R}t\,q\quad,\label{eq:rigid-monad-flm-R-def} +\text{flm}_{R}g^{:A\rightarrow R^{B}}=t^{:R^{A}}\rightarrow q^{:H^{B}}\rightarrow(x^{:A}\rightarrow g\,x\,q)^{\uparrow R}t\,q\quad,\label{eq:rigid-monad-flm-R-def} \end{equation} \end_inset @@ -14444,7 +14441,7 @@ the method can be written as \begin_inset Formula \begin{equation} -\text{flm}_{T}f=\text{flm}_{R}\left(y\Rightarrow q\Rightarrow\text{flm}_{M}(x\Rightarrow f\,x\,q)\,y\right)\quad.\label{eq:rigid-monad-def-flm-t-via-flm-r} +\text{flm}_{T}f=\text{flm}_{R}\left(y\rightarrow q\rightarrow\text{flm}_{M}(x\rightarrow f\,x\,q)\,y\right)\quad.\label{eq:rigid-monad-def-flm-t-via-flm-r} \end{equation} \end_inset @@ -14480,14 +14477,14 @@ noprefix "false" To restore the standard type signatures, we need to unflip the arguments: \begin_inset Formula \begin{align*} - & f^{:A\Rightarrow H^{M^{B}}\Rightarrow M^{B}}\diamond_{T}g^{:B\Rightarrow H^{M^{C}}\Rightarrow M^{C}}:\ A\Rightarrow H^{M^{C}}\Rightarrow M^{C}\quad;\\ - & f\diamond_{T}g=t\Rightarrow q\Rightarrow\left(\tilde{f}\left(\left(\text{flm}_{M}\left(b\Rightarrow g\,b\,q\right)\right)^{\downarrow H}q\right)\diamond_{M}\left(b\Rightarrow g\,b\,q\right)\right)t\quad, + & f^{:A\rightarrow H^{M^{B}}\rightarrow M^{B}}\diamond_{T}g^{:B\rightarrow H^{M^{C}}\rightarrow M^{C}}:\ A\rightarrow H^{M^{C}}\rightarrow M^{C}\quad;\\ + & f\diamond_{T}g=t\rightarrow q\rightarrow\left(\tilde{f}\left(\left(\text{flm}_{M}\left(b\rightarrow g\,b\,q\right)\right)^{\downarrow H}q\right)\diamond_{M}\left(b\rightarrow g\,b\,q\right)\right)t\quad, \end{align*} \end_inset where -\begin_inset Formula $\tilde{f}\triangleq h\Rightarrow k\Rightarrow f\,k\,h$ +\begin_inset Formula $\tilde{f}\triangleq h\rightarrow k\rightarrow f\,k\,h$ \end_inset is the flipped version of @@ -14510,7 +14507,7 @@ where to find \begin_inset Formula \[ -f\diamond_{T}g=t\Rightarrow q\Rightarrow\left(\tilde{f}\left(p^{\downarrow H}q\right)\bef p\right)t\quad\text{where }p=\text{flm}_{M}\left(x\Rightarrow g\,x\,q\right)\quad. +f\diamond_{T}g=t\rightarrow q\rightarrow\left(\tilde{f}\left(p^{\downarrow H}q\right)\bef p\right)t\quad\text{where }p=\text{flm}_{M}\left(x\rightarrow g\,x\,q\right)\quad. \] \end_inset @@ -14530,13 +14527,13 @@ To obtain an implementation of as \begin_inset Formula \[ -\text{flm}_{T}g^{:A\Rightarrow T^{B}}=\text{id}^{:T^{A}\Rightarrow T^{A}}\diamond_{T}g\quad. +\text{flm}_{T}g^{:A\rightarrow T^{B}}=\text{id}^{:T^{A}\rightarrow T^{A}}\diamond_{T}g\quad. \] \end_inset Now we need to substitute -\begin_inset Formula $f^{:T^{A}\Rightarrow T^{A}}=\text{id}$ +\begin_inset Formula $f^{:T^{A}\rightarrow T^{A}}=\text{id}$ \end_inset into @@ -14551,7 +14548,7 @@ Now we need to substitute will then become \begin_inset Formula \[ -\tilde{f}=\left(h\Rightarrow k\Rightarrow\text{id}\,k\,h\right)=\left(h\Rightarrow k\Rightarrow k\,h\right)\quad, +\tilde{f}=\left(h\rightarrow k\rightarrow\text{id}\,k\,h\right)=\left(h\rightarrow k\rightarrow k\,h\right)\quad, \] \end_inset @@ -14559,22 +14556,22 @@ Now we need to substitute we get \begin_inset Formula \begin{align*} - & \text{flm}_{T}g^{:A\Rightarrow T^{B}}=\text{id}\bef\text{flm}_{T}g\\ -\text{definition of }\diamond_{T}:\quad & =t^{:T^{A}}\Rightarrow q^{H^{M^{B}}}\Rightarrow\left(\tilde{f}\left(p^{\downarrow H}q\right)\bef p\right)t\\ - & \quad\quad\text{where }p\triangleq\text{flm}_{M}\left(x\Rightarrow g\,x\,q\right)\\ -\text{substitute }f=\text{id}:\quad & =t\Rightarrow q\Rightarrow\left(\left(h\Rightarrow k\Rightarrow k\,h\right)\left(p^{\downarrow H}q\right)\bef p\right)t\\ -\text{apply }k\text{ to }p^{\downarrow H}q:\quad & =t\Rightarrow q\Rightarrow\left(\left(k\Rightarrow k\left(p^{\downarrow H}q\right)\right)\bef p\right)t\\ -\text{definition of }\bef:\quad & =t\Rightarrow q\Rightarrow p\left(t\left(p^{\downarrow H}q\right)\right)\quad. + & \text{flm}_{T}g^{:A\rightarrow T^{B}}=\text{id}\bef\text{flm}_{T}g\\ +\text{definition of }\diamond_{T}:\quad & =t^{:T^{A}}\rightarrow q^{H^{M^{B}}}\rightarrow\left(\tilde{f}\left(p^{\downarrow H}q\right)\bef p\right)t\\ + & \quad\quad\text{where }p\triangleq\text{flm}_{M}\left(x\rightarrow g\,x\,q\right)\\ +\text{substitute }f=\text{id}:\quad & =t\rightarrow q\rightarrow\left(\left(h\rightarrow k\rightarrow k\,h\right)\left(p^{\downarrow H}q\right)\bef p\right)t\\ +\text{apply }k\text{ to }p^{\downarrow H}q:\quad & =t\rightarrow q\rightarrow\left(\left(k\rightarrow k\left(p^{\downarrow H}q\right)\right)\bef p\right)t\\ +\text{definition of }\bef:\quad & =t\rightarrow q\rightarrow p\left(t\left(p^{\downarrow H}q\right)\right)\quad. \end{align*} \end_inset By definition of the functor -\begin_inset Formula $R^{A}\triangleq H^{A}\Rightarrow A$ +\begin_inset Formula $R^{A}\triangleq H^{A}\rightarrow A$ \end_inset , we raise any function -\begin_inset Formula $p^{:A\Rightarrow B}$ +\begin_inset Formula $p^{:A\rightarrow B}$ \end_inset into @@ -14584,9 +14581,9 @@ By definition of the functor as \begin_inset Formula \begin{align*} -p^{\uparrow R} & :\left(H^{A}\Rightarrow A\right)\Rightarrow H^{B}\Rightarrow B\quad,\\ -p^{\uparrow R}r^{H^{A}\Rightarrow A} & \triangleq p^{\downarrow H}\bef r\bef p\\ - & =q^{H^{B}}\Rightarrow p\left(r\left(p^{\downarrow H}q\right)\right)\quad. +p^{\uparrow R} & :\left(H^{A}\rightarrow A\right)\rightarrow H^{B}\rightarrow B\quad,\\ +p^{\uparrow R}r^{H^{A}\rightarrow A} & \triangleq p^{\downarrow H}\bef r\bef p\\ + & =q^{H^{B}}\rightarrow p\left(r\left(p^{\downarrow H}q\right)\right)\quad. \end{align*} \end_inset @@ -14602,7 +14599,7 @@ Finally, renaming , we obtain the desired code, \begin_inset Formula \[ -\text{flm}_{T}f=t\Rightarrow q\Rightarrow p^{\uparrow R}t\,q\quad\text{where }p\triangleq\text{flm}_{M}\left(x\Rightarrow f\,x\,q\right)\quad. +\text{flm}_{T}f=t\rightarrow q\rightarrow p^{\uparrow R}t\,q\quad\text{where }p\triangleq\text{flm}_{M}\left(x\rightarrow f\,x\,q\right)\quad. \] \end_inset @@ -14655,19 +14652,19 @@ noprefix "false" Comparing these two expressions, we find that we need \begin_inset Formula \[ -\text{flm}_{M}(x\Rightarrow f\,x\,q)=(y\Rightarrow g\,y\,q)\quad. +\text{flm}_{M}(x\rightarrow f\,x\,q)=(y\rightarrow g\,y\,q)\quad. \] \end_inset This is achieved if we define -\begin_inset Formula $g\,y\,q=\text{flm}_{M}(x^{:A}\Rightarrow f\,x\,q)\,y$ +\begin_inset Formula $g\,y\,q=\text{flm}_{M}(x^{:A}\rightarrow f\,x\,q)\,y$ \end_inset , or equivalently \begin_inset Formula \[ -g=y\Rightarrow q\Rightarrow\text{flm}_{M}(x\Rightarrow f\,x\,q)\,y\quad. +g=y\rightarrow q\rightarrow\text{flm}_{M}(x\rightarrow f\,x\,q)\,y\quad. \] \end_inset @@ -14742,8 +14739,8 @@ swap defined by \begin_inset Formula \begin{align} -\text{ftn}_{T} & =t^{:T^{T^{A}}}\Rightarrow q^{:H^{M^{A}}}\Rightarrow q\triangleright\bigg(t\triangleright\big(\text{flm}_{M}(x^{:R^{M^{A}}}\Rightarrow x\,q)\big)^{\uparrow R}\bigg)\quad,\label{eq:rigid-monad-def-of-ftn-t-via-forward}\\ -\text{sw}_{R,M} & =m^{:M^{R^{A}}}\Rightarrow q^{:H^{M^{A}}}\Rightarrow\big(r^{:R^{A}}\Rightarrow r(\text{pu}_{M}^{\downarrow H}q)\big)^{\uparrow M}m\quad.\label{eq:rigid-monad-short-formula-for-swap} +\text{ftn}_{T} & =t^{:T^{T^{A}}}\rightarrow q^{:H^{M^{A}}}\rightarrow q\triangleright\bigg(t\triangleright\big(\text{flm}_{M}(x^{:R^{M^{A}}}\rightarrow x\,q)\big)^{\uparrow R}\bigg)\quad,\label{eq:rigid-monad-def-of-ftn-t-via-forward}\\ +\text{sw}_{R,M} & =m^{:M^{R^{A}}}\rightarrow q^{:H^{M^{A}}}\rightarrow\big(r^{:R^{A}}\rightarrow r(\text{pu}_{M}^{\downarrow H}q)\big)^{\uparrow M}m\quad.\label{eq:rigid-monad-short-formula-for-swap} \end{align} \end_inset @@ -14761,7 +14758,7 @@ These functions are computationally equivalent (can be derived from each is \begin_inset Formula \begin{equation} -q\triangleright\big(m\triangleright\text{sw}_{R,M}\big)=m\triangleright(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)^{\uparrow M}\quad.\label{eq:rigid-monad-1-forward-formula-for-swap} +q\triangleright\big(m\triangleright\text{sw}_{R,M}\big)=m\triangleright(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)^{\uparrow M}\quad.\label{eq:rigid-monad-1-forward-formula-for-swap} \end{equation} \end_inset @@ -14789,15 +14786,15 @@ noprefix "false" \end_inset ) and the relationship -\begin_inset Formula $\text{ftn}_{T}=\text{flm}_{T}\text{id}^{:T^{A}\Rightarrow T^{A}}$ +\begin_inset Formula $\text{ftn}_{T}=\text{flm}_{T}\text{id}^{:T^{A}\rightarrow T^{A}}$ \end_inset , we find \begin_inset Formula \begin{align*} \text{ftn}_{T}t^{:T^{T^{A}}} & =\gunderline{\text{flm}_{T}}(\text{id})\,t\\ -\text{use Eq.~(\ref{eq:rigid-monad-flm-T-def})}:\quad & =q\Rightarrow\big(\text{flm}_{M}(x^{:A}\Rightarrow f\,x\,q)\big)^{\uparrow R}\gunderline{t\,q}\\ -\text{definition of }\triangleright:\quad & =q\Rightarrow\gunderline{q\triangleright\big(t\triangleright\big(}\text{flm}_{M}(x^{:A}\Rightarrow f\,x\,q)\big)^{\uparrow R}\big)\quad. +\text{use Eq.~(\ref{eq:rigid-monad-flm-T-def})}:\quad & =q\rightarrow\big(\text{flm}_{M}(x^{:A}\rightarrow f\,x\,q)\big)^{\uparrow R}\gunderline{t\,q}\\ +\text{definition of }\triangleright:\quad & =q\rightarrow\gunderline{q\triangleright\big(t\triangleright\big(}\text{flm}_{M}(x^{:A}\rightarrow f\,x\,q)\big)^{\uparrow R}\big)\quad. \end{align*} \end_inset @@ -14834,7 +14831,7 @@ noprefix "false" \begin_inset Formula \begin{align*} \text{ftn}_{T} & =\text{flm}_{T}(\text{id})\\ - & =\text{flm}_{R}\left(y\Rightarrow q\Rightarrow\text{flm}_{M}(x\Rightarrow x\,q)\,y\right)\quad. + & =\text{flm}_{R}\left(y\rightarrow q\rightarrow\text{flm}_{M}(x\rightarrow x\,q)\,y\right)\quad. \end{align*} \end_inset @@ -14873,12 +14870,12 @@ noprefix "false" \begin_inset Formula \begin{align} \text{sw}_{R,M}(m) & =m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\bef\gunderline{\text{ftn}_{T}}\nonumber \\ -\text{use Eq.~(\ref{eq:rigid-monad-def-flm-t-via-flm-r})}:\quad & =m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\gunderline{\text{pu}_{R}\bef\text{flm}_{R}}\left(y\Rightarrow q\Rightarrow\text{flm}_{M}(x\Rightarrow x\,q)\,y\right)\nonumber \\ -\text{left identity law of }R:\quad & =m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\gunderline{\bef}\big(y\Rightarrow q\Rightarrow\text{flm}_{M}(x\Rightarrow x\,q)\gunderline{\,y}\big)\nonumber \\ -\triangleright\text{ notation}:\quad & =m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\gunderline{\triangleright\big(y\Rightarrow}q\Rightarrow\gunderline y\triangleright\text{flm}_{M}(x\Rightarrow x\,q)\big)\\ -\text{apply to argument }y:\quad & =q\Rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\triangleright\gunderline{\text{flm}_{M}}\left(x\Rightarrow x\,q\right)\nonumber \\ -\text{express }\text{flm}_{M}\text{ via }\text{ftn}_{M}:\quad & =q\Rightarrow m\triangleright\gunderline{\text{pu}_{M}^{\uparrow R\uparrow M}\bef(x\Rightarrow x\,q)^{\uparrow M}}\bef\text{ftn}_{M}\nonumber \\ -\text{composition law of }M:\quad & =q\Rightarrow m\triangleright\big(\text{pu}_{M}^{\uparrow R}\bef(x\Rightarrow x\,q)\big)^{\uparrow M}\bef\text{ftn}_{M}\quad.\label{eq:rigid-monad-swap-derivation2} +\text{use Eq.~(\ref{eq:rigid-monad-def-flm-t-via-flm-r})}:\quad & =m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\gunderline{\text{pu}_{R}\bef\text{flm}_{R}}\left(y\rightarrow q\rightarrow\text{flm}_{M}(x\rightarrow x\,q)\,y\right)\nonumber \\ +\text{left identity law of }R:\quad & =m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\gunderline{\bef}\big(y\rightarrow q\rightarrow\text{flm}_{M}(x\rightarrow x\,q)\gunderline{\,y}\big)\nonumber \\ +\triangleright\text{ notation}:\quad & =m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\gunderline{\triangleright\big(y\rightarrow}q\rightarrow\gunderline y\triangleright\text{flm}_{M}(x\rightarrow x\,q)\big)\\ +\text{apply to argument }y:\quad & =q\rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\triangleright\gunderline{\text{flm}_{M}}\left(x\rightarrow x\,q\right)\nonumber \\ +\text{express }\text{flm}_{M}\text{ via }\text{ftn}_{M}:\quad & =q\rightarrow m\triangleright\gunderline{\text{pu}_{M}^{\uparrow R\uparrow M}\bef(x\rightarrow x\,q)^{\uparrow M}}\bef\text{ftn}_{M}\nonumber \\ +\text{composition law of }M:\quad & =q\rightarrow m\triangleright\big(\text{pu}_{M}^{\uparrow R}\bef(x\rightarrow x\,q)\big)^{\uparrow M}\bef\text{ftn}_{M}\quad.\label{eq:rigid-monad-swap-derivation2} \end{align} \end_inset @@ -14915,9 +14912,9 @@ noprefix "false" \begin{align} & \text{sw}_{R,M}(m)=m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\gunderline{\bef\text{ftn}_{T}}\nonumber \\ \triangleright\text{ notation}:\quad & =\big(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\big)\triangleright\gunderline{\text{ftn}_{T}}\nonumber \\ -\text{use Eq.~(\ref{eq:rigid-monad-def-of-ftn-t-via-forward})}:\quad & =q\Rightarrow q\triangleright\bigg(\big(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\gunderline{\big)\triangleright\big(}\text{flm}_{M}(x\Rightarrow x\,q)\big)^{\uparrow R}\bigg)\nonumber \\ -\triangleright\text{ notation}:\quad & =q\Rightarrow q\triangleright\bigg(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\gunderline{\text{pu}_{R}\bef\big(\text{flm}_{M}(x\Rightarrow x\,q)\big)^{\uparrow R}}\bigg)\nonumber \\ -\text{pu}_{R}\text{'s naturality}:\quad & =q\Rightarrow q\triangleright\bigg(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{flm}_{M}(x\Rightarrow x\,q)\bef\text{pu}_{R}\bigg)\quad.\label{eq:rigid-monad-swap-derivation1} +\text{use Eq.~(\ref{eq:rigid-monad-def-of-ftn-t-via-forward})}:\quad & =q\rightarrow q\triangleright\bigg(\big(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\gunderline{\big)\triangleright\big(}\text{flm}_{M}(x\rightarrow x\,q)\big)^{\uparrow R}\bigg)\nonumber \\ +\triangleright\text{ notation}:\quad & =q\rightarrow q\triangleright\bigg(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\gunderline{\text{pu}_{R}\bef\big(\text{flm}_{M}(x\rightarrow x\,q)\big)^{\uparrow R}}\bigg)\nonumber \\ +\text{pu}_{R}\text{'s naturality}:\quad & =q\rightarrow q\triangleright\bigg(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{flm}_{M}(x\rightarrow x\,q)\bef\text{pu}_{R}\bigg)\quad.\label{eq:rigid-monad-swap-derivation1} \end{align} \end_inset @@ -14955,10 +14952,10 @@ noprefix "false" ) as \begin_inset Formula \begin{align*} -\text{Eq.~(\ref{eq:rigid-monad-swap-derivation1})}:\quad & q\Rightarrow q\triangleright\bigg(\big(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{flm}_{M}(x\Rightarrow x\,q)\gunderline{\big)\triangleright\text{pu}_{R}}\bigg)\\ -\text{use Eq.~(\ref{eq:rigid-monad-pure-t-simplification})}:\quad & =q\Rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\gunderline{\text{flm}_{M}(x\Rightarrow x\,q)}\\ -\text{express }\text{flm}_{M}\text{ via }\text{ftn}_{M}:\quad & =q\Rightarrow m\triangleright\gunderline{\text{pu}_{M}^{\uparrow R\uparrow M}\bef(x\Rightarrow x\,q)^{\uparrow M}}\bef\text{ftn}_{M}\\ -\text{composition law of }M:\quad & =q\Rightarrow m\triangleright\big(\text{pu}_{M}^{\uparrow R}\bef(x\Rightarrow x\,q)\big)^{\uparrow M}\bef\text{ftn}_{M}\quad. +\text{Eq.~(\ref{eq:rigid-monad-swap-derivation1})}:\quad & q\rightarrow q\triangleright\bigg(\big(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{flm}_{M}(x\rightarrow x\,q)\gunderline{\big)\triangleright\text{pu}_{R}}\bigg)\\ +\text{use Eq.~(\ref{eq:rigid-monad-pure-t-simplification})}:\quad & =q\rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\gunderline{\text{flm}_{M}(x\rightarrow x\,q)}\\ +\text{express }\text{flm}_{M}\text{ via }\text{ftn}_{M}:\quad & =q\rightarrow m\triangleright\gunderline{\text{pu}_{M}^{\uparrow R\uparrow M}\bef(x\rightarrow x\,q)^{\uparrow M}}\bef\text{ftn}_{M}\\ +\text{composition law of }M:\quad & =q\rightarrow m\triangleright\big(\text{pu}_{M}^{\uparrow R}\bef(x\rightarrow x\,q)\big)^{\uparrow M}\bef\text{ftn}_{M}\quad. \end{align*} \end_inset @@ -14970,13 +14967,13 @@ noprefix "false" It appears that simplifying this expression requires to rewrite the function -\begin_inset Formula $\text{pu}_{M}^{\uparrow R}\bef(x\Rightarrow x\,q)$ +\begin_inset Formula $\text{pu}_{M}^{\uparrow R}\bef(x\rightarrow x\,q)$ \end_inset . To proceed further, we need to use the definition of raising a function -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset to the functor @@ -14986,7 +14983,7 @@ It appears that simplifying this expression requires to rewrite the function , \begin_inset Formula \[ -f^{\uparrow R}\triangleq r^{:R^{A}}\Rightarrow f^{\downarrow H}\bef r\bef f\quad, +f^{\uparrow R}\triangleq r^{:R^{A}}\rightarrow f^{\downarrow H}\bef r\bef f\quad, \] \end_inset @@ -14994,10 +14991,10 @@ f^{\uparrow R}\triangleq r^{:R^{A}}\Rightarrow f^{\downarrow H}\bef r\bef f\quad so we can write \begin_inset Formula \begin{align} - & \text{pu}_{M}^{\uparrow R}\bef(x\Rightarrow x\,q)\nonumber \\ -\text{function composition}:\quad & =r\Rightarrow\gunderline{\text{pu}_{M}^{\uparrow R}r\,q}\nonumber \\ -\text{definition of }^{\uparrow R}:\quad & =\gunderline{r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\bef}\text{pu}_{M}\nonumber \\ -\text{forward composition}:\quad & =\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\bef\text{pu}_{M}\quad.\label{eq:rigid-monad-swap-derivation3} + & \text{pu}_{M}^{\uparrow R}\bef(x\rightarrow x\,q)\nonumber \\ +\text{function composition}:\quad & =r\rightarrow\gunderline{\text{pu}_{M}^{\uparrow R}r\,q}\nonumber \\ +\text{definition of }^{\uparrow R}:\quad & =\gunderline{r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\bef}\text{pu}_{M}\nonumber \\ +\text{forward composition}:\quad & =\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\bef\text{pu}_{M}\quad.\label{eq:rigid-monad-swap-derivation3} \end{align} \end_inset @@ -15019,7 +15016,7 @@ noprefix "false" ), we used the general property of the forward composition, \begin_inset Formula \[ -x\Rightarrow y\triangleright f(x,y)\bef g\quad=\quad\left(x\Rightarrow y\triangleright f(x,y)\right)\bef g\quad, +x\rightarrow y\triangleright f(x,y)\bef g\quad=\quad\left(x\rightarrow y\triangleright f(x,y)\right)\bef g\quad, \] \end_inset @@ -15054,11 +15051,11 @@ noprefix "false" ) as \begin_inset Formula \begin{align*} - & q\Rightarrow m\triangleright\big(\gunderline{\text{pu}_{M}^{\uparrow R}\bef(x\Rightarrow x\,q)}\big)^{\uparrow M}\bef\text{ftn}_{M}\\ -\text{use Eq.~(\ref{eq:rigid-monad-swap-derivation3})}:\quad & =q\Rightarrow m\triangleright\big(\gunderline{(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\bef\text{pu}_{M}}\big)^{\uparrow M}\bef\text{ftn}_{M}\\ -\text{functor composition for }M:\quad & =q\Rightarrow m\triangleright\big((r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\bef\gunderline{\text{pu}_{M}^{\uparrow M}\bef\text{ftn}_{M}}\\ -\text{identity law of }M:\quad & =q\Rightarrow\gunderline{m\triangleright\big(}(r\Rightarrow\gunderline{q\triangleright\text{pu}_{M}^{\downarrow H}\bef r})\big)^{\uparrow M}\\ -\triangleright\text{ notation}:\quad & =q\Rightarrow\big(r\Rightarrow r(\text{pu}_{M}^{\downarrow H}q)\big)^{\uparrow M}m\quad. + & q\rightarrow m\triangleright\big(\gunderline{\text{pu}_{M}^{\uparrow R}\bef(x\rightarrow x\,q)}\big)^{\uparrow M}\bef\text{ftn}_{M}\\ +\text{use Eq.~(\ref{eq:rigid-monad-swap-derivation3})}:\quad & =q\rightarrow m\triangleright\big(\gunderline{(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\bef\text{pu}_{M}}\big)^{\uparrow M}\bef\text{ftn}_{M}\\ +\text{functor composition for }M:\quad & =q\rightarrow m\triangleright\big((r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\bef\gunderline{\text{pu}_{M}^{\uparrow M}\bef\text{ftn}_{M}}\\ +\text{identity law of }M:\quad & =q\rightarrow\gunderline{m\triangleright\big(}(r\rightarrow\gunderline{q\triangleright\text{pu}_{M}^{\downarrow H}\bef r})\big)^{\uparrow M}\\ +\triangleright\text{ notation}:\quad & =q\rightarrow\big(r\rightarrow r(\text{pu}_{M}^{\downarrow H}q)\big)^{\uparrow M}m\quad. \end{align*} \end_inset @@ -15151,10 +15148,10 @@ noprefix "false" : \begin_inset Formula \begin{align*} - & q\triangleright\big(\gunderline{m\triangleright\big(m_{1}}\Rightarrow q_{1}\Rightarrow\big(r\Rightarrow r(\text{pu}_{M}^{\downarrow H}q_{1})\big)^{\uparrow M}\gunderline{m_{1}}\big)\big)\\ -\text{apply to argument }m:\quad & =\gunderline{q\triangleright\big(q_{1}}\Rightarrow m\triangleright\big(r\Rightarrow r(\text{pu}_{M}^{\downarrow H}\gunderline{q_{1}})\big)^{\uparrow M}\big)\\ -\text{apply to argument }q:\quad & =m\triangleright\big(r\Rightarrow\gunderline{r(\text{pu}_{M}^{\downarrow H}q)}\big)^{\uparrow M}\\ -\triangleright\text{ notation}:\quad & =m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\quad. + & q\triangleright\big(\gunderline{m\triangleright\big(m_{1}}\rightarrow q_{1}\rightarrow\big(r\rightarrow r(\text{pu}_{M}^{\downarrow H}q_{1})\big)^{\uparrow M}\gunderline{m_{1}}\big)\big)\\ +\text{apply to argument }m:\quad & =\gunderline{q\triangleright\big(q_{1}}\rightarrow m\triangleright\big(r\rightarrow r(\text{pu}_{M}^{\downarrow H}\gunderline{q_{1}})\big)^{\uparrow M}\big)\\ +\text{apply to argument }q:\quad & =m\triangleright\big(r\rightarrow\gunderline{r(\text{pu}_{M}^{\downarrow H}q)}\big)^{\uparrow M}\\ +\triangleright\text{ notation}:\quad & =m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\quad. \end{align*} \end_inset @@ -15244,7 +15241,7 @@ noprefix "false" \text{naturality of }\text{ftn}_{R}:\quad & =\gunderline{\text{sw}^{\uparrow R}\bef\text{ftn}_{M}^{\uparrow R\uparrow R}}\bef\text{ftn}_{R}\nonumber \\ \text{composition under }R:\quad & =\big(\text{sw}\bef\text{ftn}_{M}^{\uparrow R}\gunderline{\big)^{\uparrow R}\bef\text{ftn}_{R}}\nonumber \\ \text{relating }\text{flm}_{R}\text{ and }\text{ftn}_{R}:\quad & =\gunderline{\text{flm}_{R}(}\text{sw}\bef\text{ftn}_{M}^{\uparrow R})\nonumber \\ -\text{use Eq.~(\ref{eq:rigid-monad-flm-R-def})}:\quad & =t\Rightarrow q\Rightarrow(x^{:A}\Rightarrow(\text{sw}\bef\text{ftn}_{M}^{\uparrow R})\,x\,q)^{\uparrow R}\,t\,q\quad.\label{eq:rigid-monad-swap-ftn-derivation-4a} +\text{use Eq.~(\ref{eq:rigid-monad-flm-R-def})}:\quad & =t\rightarrow q\rightarrow(x^{:A}\rightarrow(\text{sw}\bef\text{ftn}_{M}^{\uparrow R})\,x\,q)^{\uparrow R}\,t\,q\quad.\label{eq:rigid-monad-swap-ftn-derivation-4a} \end{align} \end_inset @@ -15257,25 +15254,25 @@ To proceed, we need to transform \begin_inset Formula \begin{align} & \text{sw}\bef\text{ftn}_{M}^{\uparrow R}\nonumber \\ -\text{definitions}:\quad & =\big(m\Rightarrow q\Rightarrow m\triangleright\big((r\Rightarrow\gunderline q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\big)\bef(\gunderline{r\Rightarrow\text{ftn}_{M}^{\downarrow H}\bef r\bef\text{ftn}_{M}})\nonumber \\ -\text{composition}:\quad & =m\Rightarrow\gunderline{\text{ftn}_{M}^{\downarrow H}}\bef\big(q\Rightarrow m\triangleright\big((r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\big)\bef\text{ftn}_{M}\nonumber \\ -\text{expansion}:\quad & =m\Rightarrow\big(q\Rightarrow\gunderline{q\triangleright\text{ftn}_{M}^{\downarrow H}}\big)\bef\big(q\Rightarrow m\triangleright\big((r\Rightarrow\gunderline q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\big)\bef\text{ftn}_{M}\nonumber \\ -\text{composition}:\quad & =m\Rightarrow\big(q\Rightarrow m\triangleright\big((r\Rightarrow\gunderline{q\triangleright\text{ftn}_{M}^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r)\big)^{\uparrow M}\big)\bef\text{ftn}_{M}\quad.\label{eq:rigid-monad-swap-ftn-derivation4} +\text{definitions}:\quad & =\big(m\rightarrow q\rightarrow m\triangleright\big((r\rightarrow\gunderline q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\big)\bef(\gunderline{r\rightarrow\text{ftn}_{M}^{\downarrow H}\bef r\bef\text{ftn}_{M}})\nonumber \\ +\text{composition}:\quad & =m\rightarrow\gunderline{\text{ftn}_{M}^{\downarrow H}}\bef\big(q\rightarrow m\triangleright\big((r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\big)\bef\text{ftn}_{M}\nonumber \\ +\text{expansion}:\quad & =m\rightarrow\big(q\rightarrow\gunderline{q\triangleright\text{ftn}_{M}^{\downarrow H}}\big)\bef\big(q\rightarrow m\triangleright\big((r\rightarrow\gunderline q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\big)\bef\text{ftn}_{M}\nonumber \\ +\text{composition}:\quad & =m\rightarrow\big(q\rightarrow m\triangleright\big((r\rightarrow\gunderline{q\triangleright\text{ftn}_{M}^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r)\big)^{\uparrow M}\big)\bef\text{ftn}_{M}\quad.\label{eq:rigid-monad-swap-ftn-derivation4} \end{align} \end_inset We can transform the sub-expression -\begin_inset Formula $(r\Rightarrow q\triangleright\text{ftn}_{M}^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}\bef r)$ +\begin_inset Formula $(r\rightarrow q\triangleright\text{ftn}_{M}^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}\bef r)$ \end_inset to \begin_inset Formula \begin{align} -\triangleright\text{ notation}:\quad & r\Rightarrow q\triangleright\gunderline{\text{ftn}_{M}^{\downarrow H}\bef\text{pu}_{M}^{\downarrow H}}\bef r\nonumber \\ -\text{composition law of }H:\quad & =r\Rightarrow q\triangleright(\gunderline{\text{pu}_{M}\bef\text{ftn}_{M}})^{\downarrow H}\bef r\nonumber \\ -\text{left identity law of }M:\quad & =r\Rightarrow\gunderline{q\triangleright r}\nonumber \\ -\triangleright\text{ notation}:\quad & =r\Rightarrow r(q)\quad.\label{eq:rigid-monad-swap-ftn-derivation5} +\triangleright\text{ notation}:\quad & r\rightarrow q\triangleright\gunderline{\text{ftn}_{M}^{\downarrow H}\bef\text{pu}_{M}^{\downarrow H}}\bef r\nonumber \\ +\text{composition law of }H:\quad & =r\rightarrow q\triangleright(\gunderline{\text{pu}_{M}\bef\text{ftn}_{M}})^{\downarrow H}\bef r\nonumber \\ +\text{left identity law of }M:\quad & =r\rightarrow\gunderline{q\triangleright r}\nonumber \\ +\triangleright\text{ notation}:\quad & =r\rightarrow r(q)\quad.\label{eq:rigid-monad-swap-ftn-derivation5} \end{align} \end_inset @@ -15297,10 +15294,10 @@ noprefix "false" ) as \begin_inset Formula \begin{align*} - & m\Rightarrow\big(q\Rightarrow m\triangleright\big((r\Rightarrow\gunderline{q\triangleright\text{ftn}_{M}^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}\bef r})\big)^{\uparrow M}\big)\bef\text{ftn}_{M}\\ -\text{use Eq.~(\ref{eq:rigid-monad-swap-ftn-derivation5})}:\quad & =m\Rightarrow\gunderline{\big(}q\Rightarrow m\triangleright(r\Rightarrow r(q))^{\uparrow M}\gunderline{\big)\bef}\text{ftn}_{M}\\ -\text{composition}:\quad & =m\Rightarrow q\Rightarrow m\triangleright(r\Rightarrow r(q)\gunderline{)^{\uparrow M}\bef\text{ftn}_{M}}\\ -\text{relating }\text{flm}_{M}\text{ and }\text{ftn}_{M}:\quad & =m\Rightarrow q\Rightarrow\text{flm}_{M}\left(r\Rightarrow r(q)\right)m\quad. + & m\rightarrow\big(q\rightarrow m\triangleright\big((r\rightarrow\gunderline{q\triangleright\text{ftn}_{M}^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}\bef r})\big)^{\uparrow M}\big)\bef\text{ftn}_{M}\\ +\text{use Eq.~(\ref{eq:rigid-monad-swap-ftn-derivation5})}:\quad & =m\rightarrow\gunderline{\big(}q\rightarrow m\triangleright(r\rightarrow r(q))^{\uparrow M}\gunderline{\big)\bef}\text{ftn}_{M}\\ +\text{composition}:\quad & =m\rightarrow q\rightarrow m\triangleright(r\rightarrow r(q)\gunderline{)^{\uparrow M}\bef\text{ftn}_{M}}\\ +\text{relating }\text{flm}_{M}\text{ and }\text{ftn}_{M}:\quad & =m\rightarrow q\rightarrow\text{flm}_{M}\left(r\rightarrow r(q)\right)m\quad. \end{align*} \end_inset @@ -15326,8 +15323,8 @@ noprefix "false" ), we get \begin_inset Formula \begin{align*} - & \quad t\Rightarrow q\Rightarrow(x\Rightarrow(\gunderline{\text{sw}\bef\text{ftn}_{M}^{\uparrow R}})\,x\,q)^{\uparrow R}\,t\,q\\ - & =t\Rightarrow q\Rightarrow(x\Rightarrow\text{flm}_{M}\left(r\Rightarrow r(q)\right)x)^{\uparrow R}\,t\,q\quad. + & \quad t\rightarrow q\rightarrow(x\rightarrow(\gunderline{\text{sw}\bef\text{ftn}_{M}^{\uparrow R}})\,x\,q)^{\uparrow R}\,t\,q\\ + & =t\rightarrow q\rightarrow(x\rightarrow\text{flm}_{M}\left(r\rightarrow r(q)\right)x)^{\uparrow R}\,t\,q\quad. \end{align*} \end_inset @@ -15452,23 +15449,23 @@ Compute \begin_inset Formula \begin{align} & \text{pu}_{R}^{\uparrow M}\bef\gunderline{\text{sw}}\nonumber \\ -\text{use Eq.~(\ref{eq:rigid-monad-short-formula-for-swap})}:\quad & =\big(m\Rightarrow\gunderline{m\triangleright\text{pu}_{R}^{\uparrow M}}\big)\bef\big(m\Rightarrow q\Rightarrow\gunderline m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\big)\nonumber \\ -\text{function composition}:\quad & =m\Rightarrow q\Rightarrow m\triangleright\gunderline{\text{pu}_{R}^{\uparrow M}\bef\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}}\nonumber \\ -\text{functor law of }M:\quad & =m\Rightarrow q\Rightarrow m\triangleright\big(\text{pu}_{R}\bef\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\big)^{\uparrow M}\quad.\label{eq:swap-laws-derivation1a} +\text{use Eq.~(\ref{eq:rigid-monad-short-formula-for-swap})}:\quad & =\big(m\rightarrow\gunderline{m\triangleright\text{pu}_{R}^{\uparrow M}}\big)\bef\big(m\rightarrow q\rightarrow\gunderline m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\big)\nonumber \\ +\text{function composition}:\quad & =m\rightarrow q\rightarrow m\triangleright\gunderline{\text{pu}_{R}^{\uparrow M}\bef\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}}\nonumber \\ +\text{functor law of }M:\quad & =m\rightarrow q\rightarrow m\triangleright\big(\text{pu}_{R}\bef\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\big)^{\uparrow M}\quad.\label{eq:swap-laws-derivation1a} \end{align} \end_inset To proceed, we simplify the expression -\begin_inset Formula $\text{pu}_{R}\bef(r\Rightarrow...)$ +\begin_inset Formula $\text{pu}_{R}\bef(r\rightarrow...)$ \end_inset : \begin_inset Formula \begin{align} - & \text{pu}_{R}\bef\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\nonumber \\ -\text{argument expansion}:\quad & =(m\Rightarrow m\triangleright\text{pu}_{R})\bef\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright r\big)\nonumber \\ -\text{function composition}:\quad & =m\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright\left(m\triangleright\text{pu}_{R}\right)\quad.\label{eq:swap-laws-derivation1} + & \text{pu}_{R}\bef\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\nonumber \\ +\text{argument expansion}:\quad & =(m\rightarrow m\triangleright\text{pu}_{R})\bef\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright r\big)\nonumber \\ +\text{function composition}:\quad & =m\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright\left(m\triangleright\text{pu}_{R}\right)\quad.\label{eq:swap-laws-derivation1} \end{align} \end_inset @@ -15478,7 +15475,7 @@ We now have to use the definition of \end_inset , which is -\begin_inset Formula $\text{pu}_{R}=x\Rightarrow y\Rightarrow x$ +\begin_inset Formula $\text{pu}_{R}=x\rightarrow y\rightarrow x$ \end_inset , or in the pipe notation, @@ -15506,8 +15503,8 @@ noprefix "false" ) to \begin_inset Formula \begin{align*} - & m\Rightarrow\gunderline{q\triangleright\text{pu}_{M}^{\downarrow H}}\triangleright\left(m\triangleright\text{pu}_{R}\right)\\ -\text{use Eq.~(\ref{eq:rigid-monad-pure-t-simplification-1})}:\quad & =m\Rightarrow m=\text{id}\quad. + & m\rightarrow\gunderline{q\triangleright\text{pu}_{M}^{\downarrow H}}\triangleright\left(m\triangleright\text{pu}_{R}\right)\\ +\text{use Eq.~(\ref{eq:rigid-monad-pure-t-simplification-1})}:\quad & =m\rightarrow m=\text{id}\quad. \end{align*} \end_inset @@ -15529,9 +15526,9 @@ noprefix "false" ) becomes \begin_inset Formula \begin{align*} - & m\Rightarrow q\Rightarrow m\triangleright\gunderline{\big(\text{pu}_{R}\bef\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\big)^{\uparrow M}}\\ - & =(m\Rightarrow q\Rightarrow\gunderline{m\triangleright\text{id}})\\ - & =(m\Rightarrow q\Rightarrow m)=\text{pu}_{R}\quad. + & m\rightarrow q\rightarrow m\triangleright\gunderline{\big(\text{pu}_{R}\bef\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\big)^{\uparrow M}}\\ + & =(m\rightarrow q\rightarrow\gunderline{m\triangleright\text{id}})\\ + & =(m\rightarrow q\rightarrow m)=\text{pu}_{R}\quad. \end{align*} \end_inset @@ -15548,12 +15545,12 @@ The left-hand side of this law is \begin_inset Formula \begin{align*} & \text{pu}_{M}\bef\gunderline{\text{sw}}\\ -\text{Eq.~(\ref{eq:rigid-monad-short-formula-for-swap})}:\quad & =\big(m\Rightarrow\gunderline{m\triangleright\text{pu}_{M}}\big)\bef\big(m\Rightarrow q\Rightarrow\gunderline m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\big)\\ -\text{function composition}:\quad & =m\Rightarrow q\Rightarrow m\triangleright\gunderline{\text{pu}_{M}\bef\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}}\\ -\text{naturality of }\text{pu}_{M}:\quad & =m\Rightarrow q\Rightarrow m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\bef\text{pu}_{M}\\ -\triangleright\text{ notation}:\quad & =m\Rightarrow q\Rightarrow\gunderline{m\triangleright\big(r\Rightarrow}q\triangleright\text{pu}_{M}^{\downarrow H}\bef\gunderline r\bef\text{pu}_{M}\big)\\ -\text{apply function to }m:\quad & =m\Rightarrow\gunderline{q\Rightarrow q}\triangleright\text{pu}_{M}^{\downarrow H}\bef m\bef\text{pu}_{M}\\ -\text{argument expansion}:\quad & =m\Rightarrow\text{pu}_{M}^{\downarrow H}\bef m\bef\text{pu}_{M}\\ +\text{Eq.~(\ref{eq:rigid-monad-short-formula-for-swap})}:\quad & =\big(m\rightarrow\gunderline{m\triangleright\text{pu}_{M}}\big)\bef\big(m\rightarrow q\rightarrow\gunderline m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\big)\\ +\text{function composition}:\quad & =m\rightarrow q\rightarrow m\triangleright\gunderline{\text{pu}_{M}\bef\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}}\\ +\text{naturality of }\text{pu}_{M}:\quad & =m\rightarrow q\rightarrow m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\bef\text{pu}_{M}\\ +\triangleright\text{ notation}:\quad & =m\rightarrow q\rightarrow\gunderline{m\triangleright\big(r\rightarrow}q\triangleright\text{pu}_{M}^{\downarrow H}\bef\gunderline r\bef\text{pu}_{M}\big)\\ +\text{apply function to }m:\quad & =m\rightarrow\gunderline{q\rightarrow q}\triangleright\text{pu}_{M}^{\downarrow H}\bef m\bef\text{pu}_{M}\\ +\text{argument expansion}:\quad & =m\rightarrow\text{pu}_{M}^{\downarrow H}\bef m\bef\text{pu}_{M}\\ \text{definition of }{}^{\uparrow R}:\quad & =\text{pu}_{M}^{\uparrow R}\quad. \end{align*} @@ -15610,10 +15607,10 @@ noprefix "false" \begin_inset Formula \begin{align} \text{ftn}_{R} & =\text{flm}_{R}(\text{id})\nonumber \\ -\text{use Eq.~(\ref{eq:rigid-monad-flm-R-def})}:\quad & =t\Rightarrow q\Rightarrow(x\Rightarrow x\,q)^{\uparrow R}t\,q\nonumber \\ -\text{definition of }^{\uparrow R}:\quad & =t\Rightarrow q\Rightarrow\gunderline{\big(r\Rightarrow}(x\Rightarrow x\,q)^{\downarrow H}\bef r\bef(x\Rightarrow x\,)\gunderline{\big)\,t}\,q\nonumber \\ -\text{apply to argument}:\quad & =t\Rightarrow q\Rightarrow\big((x\Rightarrow q\triangleright x)^{\downarrow H}\bef t\bef(x\gunderline{\Rightarrow x\,q})\gunderline{\big)\,q}\nonumber \\ -\text{use }\triangleright\text{ notation}:\quad & =t\Rightarrow q\Rightarrow\gunderline{q\triangleright\big(q\triangleright(}x\Rightarrow q\triangleright x)^{\downarrow H}\bef t\big)\quad.\label{eq:ftn-R-simplified} +\text{use Eq.~(\ref{eq:rigid-monad-flm-R-def})}:\quad & =t\rightarrow q\rightarrow(x\rightarrow x\,q)^{\uparrow R}t\,q\nonumber \\ +\text{definition of }^{\uparrow R}:\quad & =t\rightarrow q\rightarrow\gunderline{\big(r\rightarrow}(x\rightarrow x\,q)^{\downarrow H}\bef r\bef(x\rightarrow x\,)\gunderline{\big)\,t}\,q\nonumber \\ +\text{apply to argument}:\quad & =t\rightarrow q\rightarrow\big((x\rightarrow q\triangleright x)^{\downarrow H}\bef t\bef(x\gunderline{\rightarrow x\,q})\gunderline{\big)\,q}\nonumber \\ +\text{use }\triangleright\text{ notation}:\quad & =t\rightarrow q\rightarrow\gunderline{q\triangleright\big(q\triangleright(}x\rightarrow q\triangleright x)^{\downarrow H}\bef t\big)\quad.\label{eq:ftn-R-simplified} \end{align} \end_inset @@ -15645,8 +15642,8 @@ noprefix "false" \begin{align*} & q\triangleright\big(m\triangleright\text{ftn}_{R}^{\uparrow M}\gunderline{\bef}\text{sw}\big)\\ \triangleright\text{ notation}: & =q\triangleright\big(m\triangleright\text{ftn}_{R}^{\uparrow M}\triangleright\gunderline{\text{sw}}\big)\\ -\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:\quad & =m\triangleright\gunderline{\text{ftn}_{R}^{\uparrow M}\bef(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)^{\uparrow M}}\\ -\text{composition law for }M:\quad & =m\triangleright\big(\text{ftn}_{R}\bef(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\quad. +\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:\quad & =m\triangleright\gunderline{\text{ftn}_{R}^{\uparrow M}\bef(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)^{\uparrow M}}\\ +\text{composition law for }M:\quad & =m\triangleright\big(\text{ftn}_{R}\bef(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\quad. \end{align*} \end_inset @@ -15658,11 +15655,11 @@ We now need to simplify the sub-expression under : \begin_inset Formula \begin{align*} - & \text{ftn}_{R}\gunderline{\bef(r}\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright r)\\ -\text{function composition}:\quad & =r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright\gunderline{\text{ftn}_{R}(r)}\\ -\text{use Eq.~(\ref{eq:ftn-R-simplified})}:\quad & =r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright\big(q\triangleright\gunderline{\text{pu}_{M}^{\downarrow H}\triangleright(x\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright x)^{\downarrow H}}\bef r\big)\\ -\text{composition law for }H:\quad & =r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef\big(q\triangleright(x\Rightarrow q\triangleright\gunderline{\text{pu}_{M}^{\downarrow H}\bef x\bef\text{pu}_{M}})^{\downarrow H}\bef r\big)\\ -\text{definition of }^{\uparrow R}:\quad & =r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef\big(q\triangleright(x\Rightarrow q\triangleright\text{pu}_{M}^{\uparrow R}(x))^{\downarrow H}\bef r\big)\quad. + & \text{ftn}_{R}\gunderline{\bef(r}\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright r)\\ +\text{function composition}:\quad & =r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright\gunderline{\text{ftn}_{R}(r)}\\ +\text{use Eq.~(\ref{eq:ftn-R-simplified})}:\quad & =r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright\big(q\triangleright\gunderline{\text{pu}_{M}^{\downarrow H}\triangleright(x\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright x)^{\downarrow H}}\bef r\big)\\ +\text{composition law for }H:\quad & =r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef\big(q\triangleright(x\rightarrow q\triangleright\gunderline{\text{pu}_{M}^{\downarrow H}\bef x\bef\text{pu}_{M}})^{\downarrow H}\bef r\big)\\ +\text{definition of }^{\uparrow R}:\quad & =r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef\big(q\triangleright(x\rightarrow q\triangleright\text{pu}_{M}^{\uparrow R}(x))^{\downarrow H}\bef r\big)\quad. \end{align*} \end_inset @@ -15684,7 +15681,7 @@ noprefix "false" ) then becomes \begin_inset Formula \[ -m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef\big(q\triangleright(x\Rightarrow q\triangleright\text{pu}_{M}^{\uparrow R}(x))^{\downarrow H}\bef r\big)\big)^{\uparrow M}\quad. +m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef\big(q\triangleright(x\rightarrow q\triangleright\text{pu}_{M}^{\uparrow R}(x))^{\downarrow H}\bef r\big)\big)^{\uparrow M}\quad. \] \end_inset @@ -15715,10 +15712,10 @@ noprefix "false" \begin_inset Formula \begin{align} & q\triangleright\big(m\triangleright\text{sw}\bef\gunderline{\text{sw}^{\uparrow R}}\bef\text{ftn}_{R}\big)\nonumber \\ -\text{definition of }^{\uparrow R}:\quad & =q\triangleright\big(\gunderline{m\triangleright\text{sw}\triangleright(x}\Rightarrow\text{sw}^{\downarrow H}\bef x\bef\text{sw})\triangleright\text{ftn}_{R}\big)\nonumber \\ +\text{definition of }^{\uparrow R}:\quad & =q\triangleright\big(\gunderline{m\triangleright\text{sw}\triangleright(x}\rightarrow\text{sw}^{\downarrow H}\bef x\bef\text{sw})\triangleright\text{ftn}_{R}\big)\nonumber \\ \text{apply to arguments}:\quad & =q\triangleright\big(\gunderline{\text{ftn}_{R}(}\text{sw}^{\downarrow H}\bef\text{sw}(m)\bef\text{sw})\big)\nonumber \\ -\text{use Eq.~(\ref{eq:ftn-R-simplified})}:\quad & =q\triangleright\big(q\triangleright\gunderline{(x\Rightarrow q\triangleright x)^{\downarrow H}\bef\text{sw}^{\downarrow H}}\bef\text{sw}(m)\bef\text{sw}\big)\nonumber \\ -\text{composition law of }H:\quad & =q\triangleright\big(q\triangleright\big(\gunderline{\text{sw}\bef(x\Rightarrow q\triangleright x)}\big)^{\downarrow H}\bef\text{sw}(m)\bef\text{sw}\big)\quad.\label{eq:swap-laws-derivation2} +\text{use Eq.~(\ref{eq:ftn-R-simplified})}:\quad & =q\triangleright\big(q\triangleright\gunderline{(x\rightarrow q\triangleright x)^{\downarrow H}\bef\text{sw}^{\downarrow H}}\bef\text{sw}(m)\bef\text{sw}\big)\nonumber \\ +\text{composition law of }H:\quad & =q\triangleright\big(q\triangleright\big(\gunderline{\text{sw}\bef(x\rightarrow q\triangleright x)}\big)^{\downarrow H}\bef\text{sw}(m)\bef\text{sw}\big)\quad.\label{eq:swap-laws-derivation2} \end{align} \end_inset @@ -15731,9 +15728,9 @@ To proceed, we simplify the sub-expression \begin_inset Formula \begin{align*} & \text{sw}(m)\bef\text{sw}\\ - & =(q_{1}\Rightarrow m\triangleright\big(r\Rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\gunderline{)\bef(}y\Rightarrow q_{2}\Rightarrow y\triangleright\big(r\Rightarrow q_{2}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M})\\ - & =q_{1}\Rightarrow q_{2}\Rightarrow(m\triangleright\big(r\Rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow M})\triangleright\big(}r\Rightarrow q_{2}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow M}}\\ - & =q_{1}\Rightarrow q_{2}\Rightarrow m\triangleright\big(\big(r\Rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)\bef\big(}r\Rightarrow q_{2}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)\big)^{\uparrow M}}\quad. + & =(q_{1}\rightarrow m\triangleright\big(r\rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\gunderline{)\bef(}y\rightarrow q_{2}\rightarrow y\triangleright\big(r\rightarrow q_{2}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M})\\ + & =q_{1}\rightarrow q_{2}\rightarrow(m\triangleright\big(r\rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow M})\triangleright\big(}r\rightarrow q_{2}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow M}}\\ + & =q_{1}\rightarrow q_{2}\rightarrow m\triangleright\big(\big(r\rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)\bef\big(}r\rightarrow q_{2}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)\big)^{\uparrow M}}\quad. \end{align*} \end_inset @@ -15745,8 +15742,8 @@ Using this formula, we can write, for any of a suitable type, \begin_inset Formula \begin{align} -q\triangleright(z\triangleright\text{sw}(m)\bef\text{sw}) & =m\triangleright\big(\big(r\Rightarrow z\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)\bef\big(r\Rightarrow}q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\big)^{\uparrow M}\nonumber \\ -\text{function composition}:\quad & =m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(z\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\quad.\label{eq:swap-law-3-derivation-1} +q\triangleright(z\triangleright\text{sw}(m)\bef\text{sw}) & =m\triangleright\big(\big(r\rightarrow z\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)\bef\big(r\rightarrow}q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\big)^{\uparrow M}\nonumber \\ +\text{function composition}:\quad & =m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(z\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\quad.\label{eq:swap-law-3-derivation-1} \end{align} \end_inset @@ -15768,11 +15765,11 @@ noprefix "false" ): \begin_inset Formula \begin{align*} - & q\triangleright\big(q\triangleright\big(\text{sw}\bef(x\Rightarrow q\triangleright x)\big)^{\downarrow H}\triangleright\gunderline{\text{sw}(m)\bef\text{sw}}\big)\\ -\text{use Eq.~(\ref{eq:swap-law-3-derivation-1})}:\quad & =m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(q\triangleright\gunderline{\big(\text{sw}\bef(x\Rightarrow q\triangleright x)\big)^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r)\big)^{\uparrow M}\\ -H\text{'s composition}:\quad & =m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(q\triangleright\big(\gunderline{\text{pu}_{M}\bef\text{sw}}\bef(x\Rightarrow q\triangleright x)\big)^{\downarrow H}\bef r)\big)^{\uparrow M}\\ -\text{outer-identity}:\quad & =m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(q\triangleright\big(\gunderline{\text{pu}_{M}^{\uparrow R}\bef(x\Rightarrow q\triangleright x)}\big)^{\downarrow H}\bef r)\big)^{\uparrow M}\\ -\text{composition}:\quad & =m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(q\triangleright\big(x\Rightarrow q\triangleright\text{pu}_{M}^{\uparrow R}(x)\big)^{\downarrow H}\bef r)\big)^{\uparrow M}\quad. + & q\triangleright\big(q\triangleright\big(\text{sw}\bef(x\rightarrow q\triangleright x)\big)^{\downarrow H}\triangleright\gunderline{\text{sw}(m)\bef\text{sw}}\big)\\ +\text{use Eq.~(\ref{eq:swap-law-3-derivation-1})}:\quad & =m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(q\triangleright\gunderline{\big(\text{sw}\bef(x\rightarrow q\triangleright x)\big)^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r)\big)^{\uparrow M}\\ +H\text{'s composition}:\quad & =m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(q\triangleright\big(\gunderline{\text{pu}_{M}\bef\text{sw}}\bef(x\rightarrow q\triangleright x)\big)^{\downarrow H}\bef r)\big)^{\uparrow M}\\ +\text{outer-identity}:\quad & =m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(q\triangleright\big(\gunderline{\text{pu}_{M}^{\uparrow R}\bef(x\rightarrow q\triangleright x)}\big)^{\downarrow H}\bef r)\big)^{\uparrow M}\\ +\text{composition}:\quad & =m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(q\triangleright\big(x\rightarrow q\triangleright\text{pu}_{M}^{\uparrow R}(x)\big)^{\downarrow H}\bef r)\big)^{\uparrow M}\quad. \end{align*} \end_inset @@ -15809,24 +15806,24 @@ We will apply both sides of the law to arbitrary \triangleright\text{ notation}:\quad & =q\triangleright\big((m\triangleright\text{sw}^{\uparrow M}\triangleright\text{sw})\triangleright\gunderline{\text{ftn}_{M}^{\uparrow R}}\big)\nonumber \\ \text{definition of }^{\uparrow R}:\quad & =q\triangleright\big(\text{ftn}_{M}^{\downarrow H}\gunderline{\bef}(m\triangleright\text{sw}^{\uparrow M}\triangleright\text{sw})\gunderline{\bef}\text{ftn}_{M}\big)\nonumber \\ \triangleright\text{ notation}:\quad & =\big(\gunderline{q\triangleright\text{ftn}_{M}^{\downarrow H}}\triangleright(\gunderline{m\triangleright\text{sw}^{\uparrow M}}\triangleright\gunderline{\text{sw}})\big)\triangleright\text{ftn}_{M}\nonumber \\ -\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:\quad & =\big(m\triangleright\gunderline{\text{sw}^{\uparrow M}}\triangleright\big(r\Rightarrow q\triangleright\gunderline{\text{ftn}_{M}^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r\gunderline{\big)^{\uparrow M}}\big)\triangleright\text{ftn}_{M}\nonumber \\ -\text{composition for }H\text{ and }M:\quad & =m\triangleright\big(\text{sw}\bef\big(r\Rightarrow q\triangleright(\gunderline{\text{pu}_{M}\bef\text{ftn}_{M}})^{\downarrow H}\bef r\big)\big)^{\uparrow M}\bef\text{ftn}_{M}\nonumber \\ -\text{left identity law of }M:\quad & =m\triangleright\big(\text{sw}\bef(r\Rightarrow q\triangleright r)\big)^{\uparrow M}\bef\text{ftn}_{M}\quad.\label{eq:rigid-monad-1-swap-law-4-derivation-5} +\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:\quad & =\big(m\triangleright\gunderline{\text{sw}^{\uparrow M}}\triangleright\big(r\rightarrow q\triangleright\gunderline{\text{ftn}_{M}^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r\gunderline{\big)^{\uparrow M}}\big)\triangleright\text{ftn}_{M}\nonumber \\ +\text{composition for }H\text{ and }M:\quad & =m\triangleright\big(\text{sw}\bef\big(r\rightarrow q\triangleright(\gunderline{\text{pu}_{M}\bef\text{ftn}_{M}})^{\downarrow H}\bef r\big)\big)^{\uparrow M}\bef\text{ftn}_{M}\nonumber \\ +\text{left identity law of }M:\quad & =m\triangleright\big(\text{sw}\bef(r\rightarrow q\triangleright r)\big)^{\uparrow M}\bef\text{ftn}_{M}\quad.\label{eq:rigid-monad-1-swap-law-4-derivation-5} \end{align} \end_inset Let us simplify the sub-expression -\begin_inset Formula $\text{sw}\bef(r\Rightarrow q\triangleright r)$ +\begin_inset Formula $\text{sw}\bef(r\rightarrow q\triangleright r)$ \end_inset separately: \begin_inset Formula \begin{align} - & \gunderline{\text{sw}}\bef\big(r\Rightarrow q\triangleright r\big)=(x\Rightarrow x\triangleright\text{sw})\bef(r\Rightarrow q\triangleright r)\nonumber \\ -\text{function composition}:\quad & =(x\Rightarrow\gunderline{q\triangleright(x\triangleright\text{sw})})\nonumber \\ -\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:\quad & =\gunderline{x\Rightarrow x\triangleright\big(}r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\nonumber \\ -\text{expand argument}:\quad & =\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\quad.\label{eq:rigid-monad-1-swap-derivation-6} + & \gunderline{\text{sw}}\bef\big(r\rightarrow q\triangleright r\big)=(x\rightarrow x\triangleright\text{sw})\bef(r\rightarrow q\triangleright r)\nonumber \\ +\text{function composition}:\quad & =(x\rightarrow\gunderline{q\triangleright(x\triangleright\text{sw})})\nonumber \\ +\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:\quad & =\gunderline{x\rightarrow x\triangleright\big(}r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\nonumber \\ +\text{expand argument}:\quad & =\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\quad.\label{eq:rigid-monad-1-swap-derivation-6} \end{align} \end_inset @@ -15848,9 +15845,9 @@ noprefix "false" ), we get \begin_inset Formula \begin{align*} - & m\triangleright\big(\gunderline{\text{sw}\bef(r\Rightarrow q\triangleright r)}\big)^{\uparrow M}\bef\text{ftn}_{M}\\ -\text{use Eq.~(\ref{eq:rigid-monad-1-swap-derivation-6})}:\quad & =m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow M\uparrow M}\bef\text{ftn}_{M}}\\ -\text{naturality of }\text{ftn}_{M}:\quad & =m\triangleright\text{ftn}_{M}\bef\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\quad. + & m\triangleright\big(\gunderline{\text{sw}\bef(r\rightarrow q\triangleright r)}\big)^{\uparrow M}\bef\text{ftn}_{M}\\ +\text{use Eq.~(\ref{eq:rigid-monad-1-swap-derivation-6})}:\quad & =m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow M\uparrow M}\bef\text{ftn}_{M}}\\ +\text{naturality of }\text{ftn}_{M}:\quad & =m\triangleright\text{ftn}_{M}\bef\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\quad. \end{align*} \end_inset @@ -15863,7 +15860,7 @@ Now write the left-hand side of the law: \begin_inset Formula \begin{align*} & q\triangleright\big(m\triangleright\text{ftn}_{M}\gunderline{\bef}\text{sw}\big)=q\triangleright\big(m\triangleright\text{ftn}_{M}\triangleright\gunderline{\text{sw}}\big)\\ -\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:\quad & =m\triangleright\text{ftn}_{M}\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\quad. +\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:\quad & =m\triangleright\text{ftn}_{M}\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\quad. \end{align*} \end_inset @@ -15984,7 +15981,7 @@ noprefix "false" ) gives \begin_inset Formula \[ -\text{sw}_{R,M}(m)=q\Rightarrow m\triangleright\big(\text{pu}_{M}^{\uparrow R}\bef(x\Rightarrow x\,q)\big)^{\uparrow M}\bef\text{ftn}_{M} +\text{sw}_{R,M}(m)=q\rightarrow m\triangleright\big(\text{pu}_{M}^{\uparrow R}\bef(x\rightarrow x\,q)\big)^{\uparrow M}\bef\text{ftn}_{M} \] \end_inset @@ -16020,8 +16017,8 @@ noprefix "false" \begin_inset Formula \begin{align*} & q\triangleright(m\triangleright\text{sw}_{R,\text{Id}})\\ -\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:\quad & =m\triangleright\big(r\Rightarrow q\triangleright\gunderline{\text{pu}_{M}^{\downarrow H}}\bef r\gunderline{\big)^{\uparrow M}}\\ -\text{use }M=\text{Id}\text{ and }\text{pu}_{M}=\text{id}:\quad & =\gunderline{m\triangleright(r\Rightarrow}q\triangleright r)\\ +\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:\quad & =m\triangleright\big(r\rightarrow q\triangleright\gunderline{\text{pu}_{M}^{\downarrow H}}\bef r\gunderline{\big)^{\uparrow M}}\\ +\text{use }M=\text{Id}\text{ and }\text{pu}_{M}=\text{id}:\quad & =\gunderline{m\triangleright(r\rightarrow}q\triangleright r)\\ \text{apply to argument }m:\quad & =q\triangleright\gunderline m=q\triangleright(m\triangleright\text{id})\quad. \end{align*} @@ -16058,10 +16055,10 @@ To verify the second law, apply both sides to arbitrary & q\triangleright\big(m\triangleright\text{sw}_{R,M}\gunderline{\bef}\phi^{\uparrow R}\big)=q\triangleright\big(m\triangleright\text{sw}_{R,M}\triangleright\gunderline{\phi^{\uparrow R}}\big)\\ \text{definition of }^{\uparrow R}:\quad & =q\triangleright\big(\phi^{\downarrow H}\bef(m\triangleright\text{sw}_{R,M})\bef\phi\big)\\ \triangleright\text{ notation}:\quad & =\gunderline{(q\triangleright\phi^{\downarrow H})}\triangleright(m\triangleright\gunderline{\text{sw}_{R,M}})\triangleright\phi\\ -\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:\quad & =m\triangleright\big(r\Rightarrow q\triangleright\gunderline{\phi^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r\big)^{\uparrow M}\triangleright\phi\\ -\text{composition law for }H:\quad & =m\triangleright\big(r\Rightarrow q\triangleright(\gunderline{\text{pu}_{M}\bef\phi})^{\downarrow H}\bef r\big)^{\uparrow M}\bef\phi\\ -\text{identity law for }\phi:\quad & =m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{N}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow M}\bef\phi}\\ -\text{naturality of }\phi:\quad & =m\triangleright\gunderline{\phi\bef\big(}r\Rightarrow q\triangleright\text{pu}_{N}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow N}}\quad. +\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:\quad & =m\triangleright\big(r\rightarrow q\triangleright\gunderline{\phi^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r\big)^{\uparrow M}\triangleright\phi\\ +\text{composition law for }H:\quad & =m\triangleright\big(r\rightarrow q\triangleright(\gunderline{\text{pu}_{M}\bef\phi})^{\downarrow H}\bef r\big)^{\uparrow M}\bef\phi\\ +\text{identity law for }\phi:\quad & =m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{N}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow M}\bef\phi}\\ +\text{naturality of }\phi:\quad & =m\triangleright\gunderline{\phi\bef\big(}r\rightarrow q\triangleright\text{pu}_{N}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow N}}\quad. \end{align*} \end_inset @@ -16078,7 +16075,7 @@ The right-hand side, when applied to \begin_inset Formula \begin{align*} & q\triangleright(m\triangleright\phi\bef\text{sw}_{R,N})=q\triangleright(m\triangleright\phi\triangleright\gunderline{\text{sw}_{R,N})}\\ -\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:\quad & =m\triangleright\phi\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{N}^{\downarrow H}\bef r\big)^{\uparrow N}\quad. +\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:\quad & =m\triangleright\phi\triangleright\big(r\rightarrow q\triangleright\text{pu}_{N}^{\downarrow H}\bef r\big)^{\uparrow N}\quad. \end{align*} \end_inset @@ -16111,7 +16108,7 @@ I could not find a fully rigorous proof of the third monadic naturality \begin_inset Formula \begin{align} & q\triangleright(m\triangleright\text{sw}_{R,M}\bef\theta)=q\triangleright(m\triangleright\text{sw}_{R,M}\triangleright\theta)\nonumber \\ - & =q\triangleright\big((q_{1}\Rightarrow m\triangleright\big(r\Rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M})\triangleright\theta\big)\quad.\label{eq:rigid-monad-1-derivation7} + & =q\triangleright\big((q_{1}\rightarrow m\triangleright\big(r\rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M})\triangleright\theta\big)\quad.\label{eq:rigid-monad-1-derivation7} \end{align} \end_inset @@ -16138,14 +16135,14 @@ The type of is \begin_inset Formula \[ -\theta:\forall A.\,(H^{A}\Rightarrow A)\Rightarrow A\quad. +\theta:\forall A.\,(H^{A}\rightarrow A)\rightarrow A\quad. \] \end_inset To implement a function of this type, we need to write code that takes an argument of type -\begin_inset Formula $H^{A}\Rightarrow A$ +\begin_inset Formula $H^{A}\rightarrow A$ \end_inset and returns a value of type @@ -16176,7 +16173,7 @@ To implement a function of this type, we need to write code that takes an \end_inset into the given argument of type -\begin_inset Formula $H^{A}\Rightarrow A$ +\begin_inset Formula $H^{A}\rightarrow A$ \end_inset , which will return the result of type @@ -16190,7 +16187,7 @@ status open \begin_layout Plain Layout This is where an argument is lacking: I did not prove that the type -\begin_inset Formula $\forall A.\,(H^{A}\Rightarrow A)\Rightarrow A$ +\begin_inset Formula $\forall A.\,(H^{A}\rightarrow A)\rightarrow A$ \end_inset is really @@ -16228,8 +16225,8 @@ equivalent : \begin_inset Formula \begin{align*} - & \forall A.\,H^{A}\cong\forall A.\,\gunderline{\bbnum 1}\Rightarrow H^{A}\\ -\text{use identity }(A\Rightarrow\bbnum 1)\cong\bbnum 1:\quad & \cong\forall A.\,(A\Rightarrow\bbnum 1)\Rightarrow H^{A}\\ + & \forall A.\,H^{A}\cong\forall A.\,\gunderline{\bbnum 1}\rightarrow H^{A}\\ +\text{use identity }(A\rightarrow\bbnum 1)\cong\bbnum 1:\quad & \cong\forall A.\,(A\rightarrow\bbnum 1)\rightarrow H^{A}\\ \text{contravariant Yoneda identity}:\quad & \cong H^{\bbnum 1}\quad. \end{align*} @@ -16254,7 +16251,7 @@ So, we can construct a as \begin_inset Formula \[ -h^{:H^{A}}=h_{1}^{:H^{1}}\triangleright(a^{:A}\Rightarrow1)^{\downarrow H}\quad. +h^{:H^{A}}=h_{1}^{:H^{1}}\triangleright(a^{:A}\rightarrow1)^{\downarrow H}\quad. \] \end_inset @@ -16270,7 +16267,7 @@ Given a fixed value is therefore \begin_inset Formula \begin{equation} -\big(r^{:H^{A}\Rightarrow A}\big)\triangleright\theta\triangleq h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}\triangleright r\quad.\label{eq:rigid-monad-base-runner-1} +\big(r^{:H^{A}\rightarrow A}\big)\triangleright\theta\triangleq h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}\triangleright r\quad.\label{eq:rigid-monad-base-runner-1} \end{equation} \end_inset @@ -16300,8 +16297,8 @@ The identity law, applied to an arbitrary \begin_inset Formula \begin{align*} & x\triangleright\text{pu}_{R}\bef\theta=(x\triangleright\text{pu}_{R}\gunderline{)\triangleright\theta}\\ -\text{definition of }r\triangleright\theta:\quad & =h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}\triangleright(\gunderline{x\triangleright\text{pu}_{R}})\\ -\text{definition of }x\triangleright\text{pu}_{R}:\quad & =\big(h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}\gunderline{\big)\triangleright(\_\Rightarrow}x)\\ +\text{definition of }r\triangleright\theta:\quad & =h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}\triangleright(\gunderline{x\triangleright\text{pu}_{R}})\\ +\text{definition of }x\triangleright\text{pu}_{R}:\quad & =\big(h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}\gunderline{\big)\triangleright(\_\rightarrow}x)\\ \text{function composition}:\quad & =x\quad. \end{align*} @@ -16320,11 +16317,11 @@ The composition law, applied to an arbitrary \begin_inset Formula \begin{align*} & r\triangleright\text{ftn}_{R}\bef\theta=\gunderline{r\triangleright\text{ftn}_{R}}\triangleright\theta\\ -\text{definition of }\text{ftn}_{R}:\quad & =\gunderline{r\triangleright\big(t\Rightarrow}q\Rightarrow q\triangleright\big(q\triangleright(x\Rightarrow q\triangleright x)^{\downarrow H}\bef t\big)\big)\triangleright\theta\\ -\text{apply to }r:\quad & =\big(q\Rightarrow q\triangleright\big(q\triangleright(x\Rightarrow q\triangleright x)^{\downarrow H}\bef r\big)\gunderline{\big)\triangleright\theta}\\ -\text{definition~(\ref{eq:rigid-monad-base-runner-1}) of }\theta:\quad & =h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}\triangleright\gunderline{\big(q\Rightarrow}q\triangleright\big(q\triangleright(x\Rightarrow q\triangleright x)^{\downarrow H}\bef r\big)\big)\\ -\text{apply to }h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}:\quad & =h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}\triangleright\big(h_{1}\triangleright\gunderline{(\_\Rightarrow1)^{\downarrow H}\bef(x\Rightarrow...)^{\downarrow H}}\bef r\big)\\ -\text{composition under }H:\quad & =\gunderline{h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}}\triangleright\big(\gunderline{h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}}\triangleright r\big)\\ +\text{definition of }\text{ftn}_{R}:\quad & =\gunderline{r\triangleright\big(t\rightarrow}q\rightarrow q\triangleright\big(q\triangleright(x\rightarrow q\triangleright x)^{\downarrow H}\bef t\big)\big)\triangleright\theta\\ +\text{apply to }r:\quad & =\big(q\rightarrow q\triangleright\big(q\triangleright(x\rightarrow q\triangleright x)^{\downarrow H}\bef r\big)\gunderline{\big)\triangleright\theta}\\ +\text{definition~(\ref{eq:rigid-monad-base-runner-1}) of }\theta:\quad & =h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}\triangleright\gunderline{\big(q\rightarrow}q\triangleright\big(q\triangleright(x\rightarrow q\triangleright x)^{\downarrow H}\bef r\big)\big)\\ +\text{apply to }h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}:\quad & =h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}\triangleright\big(h_{1}\triangleright\gunderline{(\_\rightarrow1)^{\downarrow H}\bef(x\rightarrow...)^{\downarrow H}}\bef r\big)\\ +\text{composition under }H:\quad & =\gunderline{h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}}\triangleright\big(\gunderline{h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}}\triangleright r\big)\\ \text{definition~(\ref{eq:rigid-monad-base-runner-1}) of }\theta:\quad & =r\triangleright\theta\triangleright\theta=r\triangleright\theta\bef\theta\quad. \end{align*} @@ -16382,11 +16379,11 @@ noprefix "false" ) and is rewritten as \begin_inset Formula \begin{align*} - & q\triangleright\big((q_{1}\Rightarrow m\triangleright\big(r\Rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\gunderline{)\triangleright\theta}\big)\\ -\text{definition of }\theta:\quad & =q\triangleright\big(h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}\gunderline{\triangleright(q_{1}\Rightarrow}m\triangleright\big(r\Rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M})\big)\\ -\text{apply to argument}:\quad & =q\triangleright\big(m\triangleright\big(r\Rightarrow h_{1}\triangleright\gunderline{(\_\Rightarrow1)^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r\big)^{\uparrow M}\big)\\ -H\text{'s composition law}:\quad & =q\triangleright\big(m\triangleright\big(r\Rightarrow h_{1}\triangleright(\gunderline{\text{pu}_{M}\bef(\_\Rightarrow1)})^{\downarrow H}\bef r\big)^{\uparrow M}\big)\\ -\text{compose functions}:\quad & =q\triangleright\big(m\triangleright\big(r\Rightarrow h_{1}\triangleright(\gunderline{\_\Rightarrow1})^{\downarrow H}\triangleright r\big)^{\uparrow M}\big)\quad. + & q\triangleright\big((q_{1}\rightarrow m\triangleright\big(r\rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\gunderline{)\triangleright\theta}\big)\\ +\text{definition of }\theta:\quad & =q\triangleright\big(h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}\gunderline{\triangleright(q_{1}\rightarrow}m\triangleright\big(r\rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M})\big)\\ +\text{apply to argument}:\quad & =q\triangleright\big(m\triangleright\big(r\rightarrow h_{1}\triangleright\gunderline{(\_\rightarrow1)^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r\big)^{\uparrow M}\big)\\ +H\text{'s composition law}:\quad & =q\triangleright\big(m\triangleright\big(r\rightarrow h_{1}\triangleright(\gunderline{\text{pu}_{M}\bef(\_\rightarrow1)})^{\downarrow H}\bef r\big)^{\uparrow M}\big)\\ +\text{compose functions}:\quad & =q\triangleright\big(m\triangleright\big(r\rightarrow h_{1}\triangleright(\gunderline{\_\rightarrow1})^{\downarrow H}\triangleright r\big)^{\uparrow M}\big)\quad. \end{align*} \end_inset @@ -16395,8 +16392,8 @@ The right-hand side is \begin_inset Formula \begin{align*} & q\triangleright(m\triangleright\gunderline{\theta}^{\uparrow M})\\ -\text{function expansion}:\quad & =q\triangleright\big(m\triangleright\big(r\Rightarrow\gunderline{r\triangleright\theta}\big)^{\uparrow M}\big)\\ -\text{definition~(\ref{eq:rigid-monad-base-runner-1}) of }\theta:\quad & =q\triangleright\big(m\triangleright\big(r\Rightarrow h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}\triangleright r\big)^{\uparrow M}\big)\quad. +\text{function expansion}:\quad & =q\triangleright\big(m\triangleright\big(r\rightarrow\gunderline{r\triangleright\theta}\big)^{\uparrow M}\big)\\ +\text{definition~(\ref{eq:rigid-monad-base-runner-1}) of }\theta:\quad & =q\triangleright\big(m\triangleright\big(r\rightarrow h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}\triangleright r\big)^{\uparrow M}\big)\quad. \end{align*} \end_inset @@ -16414,7 +16411,7 @@ Statement 4. \begin_layout Plain Layout The rigid monad -\begin_inset Formula $R^{A}\triangleq H^{A}\Rightarrow A$ +\begin_inset Formula $R^{A}\triangleq H^{A}\rightarrow A$ \end_inset satisfies the two compatibility laws with respect to any monad @@ -16453,8 +16450,8 @@ Denote for brevity Then the two laws that we need to prove are \begin_inset Formula \begin{align*} -\text{flm}_{R}f^{:A\Rightarrow R^{M^{B}}} & =\text{pure}_{M}^{\uparrow R}\bef\text{flm}_{T}f\quad\text{as functions }R^{A}\Rightarrow R^{M^{B}},\\ -\big(\text{flm}_{M}f^{A\Rightarrow M^{B}}\big)^{\uparrow R} & =\text{pure}_{R}^{\uparrow T}\bef\text{flm}_{T}\big(f^{\uparrow R}\big)\quad\text{as functions }R^{M^{A}}\Rightarrow R^{M^{B}}. +\text{flm}_{R}f^{:A\rightarrow R^{M^{B}}} & =\text{pure}_{M}^{\uparrow R}\bef\text{flm}_{T}f\quad\text{as functions }R^{A}\rightarrow R^{M^{B}},\\ +\big(\text{flm}_{M}f^{A\rightarrow M^{B}}\big)^{\uparrow R} & =\text{pure}_{R}^{\uparrow T}\bef\text{flm}_{T}\big(f^{\uparrow R}\big)\quad\text{as functions }R^{M^{A}}\rightarrow R^{M^{B}}. \end{align*} \end_inset @@ -16487,8 +16484,8 @@ A definition of : \begin_inset Formula \begin{align*} -\text{flm}_{T}f^{:A\Rightarrow R^{M^{B}}} & =t^{:R^{M^{A}}}\Rightarrow q^{H^{M^{B}}}\Rightarrow\left(\text{flm}_{M}\left(x^{:A}\Rightarrow f\,x\,q\right)\right)^{\uparrow R}t\,q\quad;\\ -\text{flm}_{R}f^{:A\Rightarrow R^{B}} & =r^{:R^{A}}\Rightarrow q^{H^{B}}\Rightarrow\left(x^{:A}\Rightarrow f\,x\,q\right)^{\uparrow R}r\,q\quad. +\text{flm}_{T}f^{:A\rightarrow R^{M^{B}}} & =t^{:R^{M^{A}}}\rightarrow q^{H^{M^{B}}}\rightarrow\left(\text{flm}_{M}\left(x^{:A}\rightarrow f\,x\,q\right)\right)^{\uparrow R}t\,q\quad;\\ +\text{flm}_{R}f^{:A\rightarrow R^{B}} & =r^{:R^{A}}\rightarrow q^{H^{B}}\rightarrow\left(x^{:A}\rightarrow f\,x\,q\right)^{\uparrow R}r\,q\quad. \end{align*} \end_inset @@ -16497,10 +16494,10 @@ To prove the first compatibility law, rewrite its right-hand side as \begin_inset Formula \begin{align*} & \text{pure}_{M}^{\uparrow R}\bef\text{flm}_{T}f\\ -\text{definition of }\text{flm}_{T}:\quad & =\left(r^{:R^{A}}\Rightarrow\text{pure}_{M}^{\uparrow R}r\right)\bef\left(r\Rightarrow q\Rightarrow\left(\text{flm}_{M}\left(x\Rightarrow f\,x\,q\right)\right)^{\uparrow R}r\,q\right)\\ -\text{expand }\bef\text{and simplify}:\quad & =r\Rightarrow q\Rightarrow\left(\text{flm}_{M}\left(x\Rightarrow f\,x\,q\right)\right)^{\uparrow R}\left(\text{pure}_{M}^{\uparrow R}r\right)\,q\\ -\text{composition law for }R:\quad & =r\Rightarrow q\Rightarrow\left(\text{pure}_{M}\bef\text{flm}_{M}\left(x\Rightarrow f\,x\,q\right)\right)^{\uparrow R}r\,q\\ -\text{left identity law for }M:\quad & =r\Rightarrow q\Rightarrow\left(x\Rightarrow f\,x\,q\right)^{\uparrow R}r\,q\\ +\text{definition of }\text{flm}_{T}:\quad & =\left(r^{:R^{A}}\rightarrow\text{pure}_{M}^{\uparrow R}r\right)\bef\left(r\rightarrow q\rightarrow\left(\text{flm}_{M}\left(x\rightarrow f\,x\,q\right)\right)^{\uparrow R}r\,q\right)\\ +\text{expand }\bef\text{and simplify}:\quad & =r\rightarrow q\rightarrow\left(\text{flm}_{M}\left(x\rightarrow f\,x\,q\right)\right)^{\uparrow R}\left(\text{pure}_{M}^{\uparrow R}r\right)\,q\\ +\text{composition law for }R:\quad & =r\rightarrow q\rightarrow\left(\text{pure}_{M}\bef\text{flm}_{M}\left(x\rightarrow f\,x\,q\right)\right)^{\uparrow R}r\,q\\ +\text{left identity law for }M:\quad & =r\rightarrow q\rightarrow\left(x\rightarrow f\,x\,q\right)^{\uparrow R}r\,q\\ \text{definition of }\text{flm}_{R}:\quad & =\text{flm}_{R}f\quad. \end{align*} @@ -16514,13 +16511,13 @@ To prove the second compatibility law, rewrite its right-hand side as \begin_inset Formula \begin{align*} & \text{pure}_{R}^{\uparrow T}\bef\text{flm}_{T}\big(f^{\uparrow R}\big)\\ -\text{definition of }\text{flm}_{T}\big(f^{\uparrow R}\big):\quad & =\left(t^{:T^{A}}\Rightarrow\text{pure}_{R}^{\uparrow T}t\right)\bef\left(t\Rightarrow q\Rightarrow\left(\text{flm}_{M}\left(x\Rightarrow f^{\uparrow R}x\,q\right)\right)^{\uparrow R}t\,q\right)\\ -\text{expand }\bef\text{ and simplify}:\quad & =t^{:T^{A}}\Rightarrow q\Rightarrow\left(\text{flm}_{M}\left(x^{:R^{A}}\Rightarrow f^{\uparrow R}x\,q\right)\right)^{\uparrow R}\left(\text{pure}_{R}^{\uparrow M\uparrow R}t\right)\,q\\ -\text{composition law for }R:\quad & =t\Rightarrow q\Rightarrow\left(\text{pure}_{R}^{\uparrow M}\bef\text{flm}_{M}\left(x^{:R^{A}}\Rightarrow f^{\uparrow R}x\,q\right)\right)^{\uparrow R}t\,q\\ -\text{left naturality of }\text{flm}_{M}:\quad & =t\Rightarrow q\Rightarrow\left(\text{flm}_{M}\left(x^{:A}\Rightarrow\left(\text{pure}_{R}\bef f^{\uparrow R}\right)x\,q\right)\right)^{\uparrow R}t\,q\\ -\text{naturality of }\text{pure}_{R}:\quad & =t\Rightarrow q\Rightarrow\left(\text{flm}_{M}\left(x^{:A}\Rightarrow\text{pure}_{R}\left(f\,x\right)\,q\right)\right)^{\uparrow R}t\,q\\ -\text{definition of }\text{pure}_{R}:\quad & =t\Rightarrow q\Rightarrow\left(\text{flm}_{M}\left(x^{:A}\Rightarrow f\,x\right)\right)^{\uparrow R}t\,q\\ -\text{unapply }f\text{ and }\text{flm}_{M}f:\quad & =t\Rightarrow q\Rightarrow\left(\text{flm}_{M}f\right)^{\uparrow R}t\,q=\left(\text{flm}_{M}f\right)^{\uparrow R}\quad. +\text{definition of }\text{flm}_{T}\big(f^{\uparrow R}\big):\quad & =\left(t^{:T^{A}}\rightarrow\text{pure}_{R}^{\uparrow T}t\right)\bef\left(t\rightarrow q\rightarrow\left(\text{flm}_{M}\left(x\rightarrow f^{\uparrow R}x\,q\right)\right)^{\uparrow R}t\,q\right)\\ +\text{expand }\bef\text{ and simplify}:\quad & =t^{:T^{A}}\rightarrow q\rightarrow\left(\text{flm}_{M}\left(x^{:R^{A}}\rightarrow f^{\uparrow R}x\,q\right)\right)^{\uparrow R}\left(\text{pure}_{R}^{\uparrow M\uparrow R}t\right)\,q\\ +\text{composition law for }R:\quad & =t\rightarrow q\rightarrow\left(\text{pure}_{R}^{\uparrow M}\bef\text{flm}_{M}\left(x^{:R^{A}}\rightarrow f^{\uparrow R}x\,q\right)\right)^{\uparrow R}t\,q\\ +\text{left naturality of }\text{flm}_{M}:\quad & =t\rightarrow q\rightarrow\left(\text{flm}_{M}\left(x^{:A}\rightarrow\left(\text{pure}_{R}\bef f^{\uparrow R}\right)x\,q\right)\right)^{\uparrow R}t\,q\\ +\text{naturality of }\text{pure}_{R}:\quad & =t\rightarrow q\rightarrow\left(\text{flm}_{M}\left(x^{:A}\rightarrow\text{pure}_{R}\left(f\,x\right)\,q\right)\right)^{\uparrow R}t\,q\\ +\text{definition of }\text{pure}_{R}:\quad & =t\rightarrow q\rightarrow\left(\text{flm}_{M}\left(x^{:A}\rightarrow f\,x\right)\right)^{\uparrow R}t\,q\\ +\text{unapply }f\text{ and }\text{flm}_{M}f:\quad & =t\rightarrow q\rightarrow\left(\text{flm}_{M}f\right)^{\uparrow R}t\,q=\left(\text{flm}_{M}f\right)^{\uparrow R}\quad. \end{align*} \end_inset @@ -16579,8 +16576,8 @@ runners \begin{align*} \text{lift}:M^{\bullet}\leadsto R^{M^{\bullet}} & \triangleq\text{pure}_{R}\quad,\\ \text{blift}:R^{\bullet}\leadsto R^{M^{\bullet}} & \triangleq\text{pure}_{M}^{\uparrow R}\quad,\\ -\text{mrun}\,\big(\phi^{:M^{\bullet}\leadsto N^{\bullet}}\big):R^{M^{\bullet}}\Rightarrow R^{N^{\bullet}} & \triangleq\phi^{\uparrow R}\quad,\\ -\text{brun}\,\theta^{:R^{\bullet}\leadsto\bullet}:R^{M^{\bullet}}\Rightarrow M^{\bullet} & \triangleq\theta^{:R^{M^{\bullet}}\leadsto M^{\bullet}}\quad, +\text{mrun}\,\big(\phi^{:M^{\bullet}\leadsto N^{\bullet}}\big):R^{M^{\bullet}}\rightarrow R^{N^{\bullet}} & \triangleq\phi^{\uparrow R}\quad,\\ +\text{brun}\,\theta^{:R^{\bullet}\leadsto\bullet}:R^{M^{\bullet}}\rightarrow M^{\bullet} & \triangleq\theta^{:R^{M^{\bullet}}\leadsto M^{\bullet}}\quad, \end{align*} \end_inset @@ -16720,7 +16717,7 @@ Statement 6. \begin_layout Plain Layout A monad transformer for the rigid monad -\begin_inset Formula $R^{A}\triangleq H^{A}\Rightarrow A$ +\begin_inset Formula $R^{A}\triangleq H^{A}\rightarrow A$ \end_inset is @@ -16801,9 +16798,9 @@ The identity laws follow from Statement It remains to verify the composition laws, \begin_inset Formula \begin{align*} -\left(f^{:A\Rightarrow M^{B}}\bef\text{lift}\right)\diamond_{R^{M}}\left(g^{:B\Rightarrow M^{C}}\bef\text{lift}\right) & =\left(f\diamond_{M}g\right)\bef\text{lift}\quad,\\ -\left(f^{:A\Rightarrow R^{M^{B}}}\bef\text{mrun}\,\phi\right)\diamond_{R^{N}}\left(g^{:B\Rightarrow R^{M^{C}}}\bef\text{mrun}\,\phi\right) & =\left(f\diamond_{R^{M}}g\right)\bef\text{mrun}\,\phi\quad,\\ -\left(f^{:A\Rightarrow R^{M^{B}}}\bef\text{brun}\,\theta\right)\diamond_{M}\left(g^{:B\Rightarrow R^{M^{C}}}\bef\text{brun}\,\theta\right) & =\left(f\diamond_{R^{M}}g\right)\bef\text{brun}\,\theta\quad. +\left(f^{:A\rightarrow M^{B}}\bef\text{lift}\right)\diamond_{R^{M}}\left(g^{:B\rightarrow M^{C}}\bef\text{lift}\right) & =\left(f\diamond_{M}g\right)\bef\text{lift}\quad,\\ +\left(f^{:A\rightarrow R^{M^{B}}}\bef\text{mrun}\,\phi\right)\diamond_{R^{N}}\left(g^{:B\rightarrow R^{M^{C}}}\bef\text{mrun}\,\phi\right) & =\left(f\diamond_{R^{M}}g\right)\bef\text{mrun}\,\phi\quad,\\ +\left(f^{:A\rightarrow R^{M^{B}}}\bef\text{brun}\,\theta\right)\diamond_{M}\left(g^{:B\rightarrow R^{M^{C}}}\bef\text{brun}\,\theta\right) & =\left(f\diamond_{R^{M}}g\right)\bef\text{brun}\,\theta\quad. \end{align*} \end_inset @@ -16819,7 +16816,7 @@ For the first law, we need to use the definition of , which is \begin_inset Formula \[ -\text{pure}_{R}x^{:A}\triangleq\_^{:H^{A}}\Rightarrow x\quad. +\text{pure}_{R}x^{:A}\triangleq\_^{:H^{A}}\rightarrow x\quad. \] \end_inset @@ -16831,7 +16828,7 @@ So the definition of can be written as \begin_inset Formula \[ -f\bef\text{lift}=x^{:A}\Rightarrow\_^{:H^{M^{B}}}\Rightarrow f\,x +f\bef\text{lift}=x^{:A}\rightarrow\_^{:H^{M^{B}}}\rightarrow f\,x \] \end_inset @@ -16863,17 +16860,17 @@ noprefix "false" We compute \begin_inset Formula \begin{align*} - & \left(f^{:A\Rightarrow M^{B}}\bef\text{lift}\right)\tilde{\diamond}_{R^{M}}\left(g^{:B\Rightarrow M^{C}}\bef\text{lift}\right)\\ -\text{definition of }\text{lift}:\quad & =\left(\_\Rightarrow f\right)\tilde{\diamond}_{R^{M}}\left(\_\Rightarrow g\right)\\ -\text{eq. (\ref{eq:def-flipped-kleisli})}:\quad & =q^{:H^{M^{B}}}\Rightarrow\left(\_\Rightarrow f\right)\left(\left(\text{flm}_{M}\left(\left(\_\Rightarrow g\right)\,q\right)\right)^{\downarrow H}q\right)\diamond_{M}\left(\left(\_\Rightarrow g\right)\,q\right)\\ -\text{expanding the functions}:\quad & =q\Rightarrow f\diamond_{M}g\\ -\text{unflipping the definition of }\text{lift}:\quad & =q\Rightarrow x\Rightarrow\left(\left(f\diamond_{M}g\right)\bef\text{lift}\right)a\,x\quad. + & \left(f^{:A\rightarrow M^{B}}\bef\text{lift}\right)\tilde{\diamond}_{R^{M}}\left(g^{:B\rightarrow M^{C}}\bef\text{lift}\right)\\ +\text{definition of }\text{lift}:\quad & =\left(\_\rightarrow f\right)\tilde{\diamond}_{R^{M}}\left(\_\rightarrow g\right)\\ +\text{eq. (\ref{eq:def-flipped-kleisli})}:\quad & =q^{:H^{M^{B}}}\rightarrow\left(\_\rightarrow f\right)\left(\left(\text{flm}_{M}\left(\left(\_\rightarrow g\right)\,q\right)\right)^{\downarrow H}q\right)\diamond_{M}\left(\left(\_\rightarrow g\right)\,q\right)\\ +\text{expanding the functions}:\quad & =q\rightarrow f\diamond_{M}g\\ +\text{unflipping the definition of }\text{lift}:\quad & =q\rightarrow x\rightarrow\left(\left(f\diamond_{M}g\right)\bef\text{lift}\right)a\,x\quad. \end{align*} \end_inset Note that the last function, of type -\begin_inset Formula $H^{M^{B}}\Rightarrow A\Rightarrow M^{B}$ +\begin_inset Formula $H^{M^{B}}\rightarrow A\rightarrow M^{B}$ \end_inset , ignores its first argument. @@ -16898,8 +16895,8 @@ For the second and third laws, we need to use the composition laws for , which can be written as \begin_inset Formula \begin{align*} -\left(f^{:A\Rightarrow M^{B}}\bef\phi\right)\diamond_{N}\left(g^{:B\Rightarrow M^{C}}\bef\phi\right) & =\left(f\diamond_{M}g\right)\bef\phi\quad,\\ -\left(f^{:A\Rightarrow R^{B}}\bef\theta\right)\bef\left(g^{:B\Rightarrow M^{C}}\bef\theta\right) & =\left(f\diamond_{M}g\right)\bef\theta\quad. +\left(f^{:A\rightarrow M^{B}}\bef\phi\right)\diamond_{N}\left(g^{:B\rightarrow M^{C}}\bef\phi\right) & =\left(f\diamond_{M}g\right)\bef\phi\quad,\\ +\left(f^{:A\rightarrow R^{B}}\bef\theta\right)\bef\left(g^{:B\rightarrow M^{C}}\bef\theta\right) & =\left(f\diamond_{M}g\right)\bef\theta\quad. \end{align*} \end_inset @@ -17085,7 +17082,7 @@ Search \end_inset monad -\begin_inset Formula $R_{1}^{A}\triangleq\left(A\Rightarrow Q\right)\Rightarrow A$ +\begin_inset Formula $R_{1}^{A}\triangleq\left(A\rightarrow Q\right)\rightarrow A$ \end_inset and the @@ -17101,13 +17098,13 @@ Reader \end_inset monad -\begin_inset Formula $R_{2}^{A}\triangleq Z\Rightarrow A$ +\begin_inset Formula $R_{2}^{A}\triangleq Z\rightarrow A$ \end_inset : \begin_inset Formula \[ -P^{A}\triangleq((Z\Rightarrow A)\Rightarrow Q)\Rightarrow Z\Rightarrow A\quad. +P^{A}\triangleq((Z\rightarrow A)\rightarrow Q)\rightarrow Z\rightarrow A\quad. \] \end_inset @@ -17142,7 +17139,7 @@ noprefix "false" is \begin_inset Formula \[ -T^{A}\triangleq((Z\Rightarrow M^{A})\Rightarrow Q)\Rightarrow Z\Rightarrow M^{A}\quad. +T^{A}\triangleq((Z\rightarrow M^{A})\rightarrow Q)\rightarrow Z\rightarrow M^{A}\quad. \] \end_inset @@ -17215,7 +17212,7 @@ noprefix "false" \end_inset is chosen to be -\begin_inset Formula $H^{A}\triangleq A\Rightarrow Q$ +\begin_inset Formula $H^{A}\triangleq A\rightarrow Q$ \end_inset and @@ -18359,7 +18356,7 @@ runner A suitable function of this type is \begin_inset Formula \[ -\text{pu}_{S}^{\uparrow R}:R^{A}\Rightarrow R^{S^{A}}\quad. +\text{pu}_{S}^{\uparrow R}:R^{A}\rightarrow R^{S^{A}}\quad. \] \end_inset @@ -18369,7 +18366,7 @@ So, \end_inset has the correct type signature, -\begin_inset Formula $R^{A}\Rightarrow A$ +\begin_inset Formula $R^{A}\rightarrow A$ \end_inset . @@ -18378,7 +18375,7 @@ So, \end_inset has the correct type signature, -\begin_inset Formula $S^{A}\Rightarrow A$ +\begin_inset Formula $S^{A}\rightarrow A$ \end_inset . @@ -18621,7 +18618,7 @@ selector monad selector monad \series default -\begin_inset Formula $S^{A}\triangleq F^{A\Rightarrow R^{Q}}\Rightarrow R^{A}$ +\begin_inset Formula $S^{A}\triangleq F^{A\rightarrow R^{Q}}\rightarrow R^{A}$ \end_inset is rigid if @@ -18720,7 +18717,7 @@ fuseIn ) with the type signature \begin_inset Formula \[ -\text{fi}_{R}:\forall(A,B).\,(A\Rightarrow R^{B})\Rightarrow R^{A\Rightarrow B} +\text{fi}_{R}:\forall(A,B).\,(A\rightarrow R^{B})\rightarrow R^{A\rightarrow B} \] \end_inset @@ -18764,7 +18761,7 @@ fuseIn is not rigid because the required type signature \begin_inset Formula \[ -\forall(A,B).\,\left(A\Rightarrow Z+B\right)\Rightarrow Z+\left(A\Rightarrow B\right) +\forall(A,B).\,\left(A\rightarrow Z+B\right)\rightarrow Z+\left(A\rightarrow B\right) \] \end_inset @@ -18793,8 +18790,8 @@ fuseOut ), defined by \begin_inset Formula \begin{align} -\text{fo} & :\forall(A,B).\,R^{A\Rightarrow B}\Rightarrow A\Rightarrow R^{B}\quad,\nonumber \\ -\text{fo} & \left(r\right)=a\Rightarrow\big(f^{:A\Rightarrow B}\Rightarrow f\left(a\right)\big)^{\uparrow R}r\quad.\label{eq:fuseOut-def} +\text{fo} & :\forall(A,B).\,R^{A\rightarrow B}\rightarrow A\rightarrow R^{B}\quad,\nonumber \\ +\text{fo} & \left(r\right)=a\rightarrow\big(f^{:A\rightarrow B}\rightarrow f\left(a\right)\big)^{\uparrow R}r\quad.\label{eq:fuseOut-def} \end{align} \end_inset @@ -18814,7 +18811,7 @@ fuseIn must satisfy the nondegeneracy law \begin_inset Formula \begin{equation} -\text{fi}_{R}\bef\text{fo}_{R}=\text{id}^{:(A\Rightarrow R^{B})\Rightarrow(A\Rightarrow R^{B})}\quad.\label{eq:rigid-non-degeneracy-law} +\text{fi}_{R}\bef\text{fo}_{R}=\text{id}^{:(A\rightarrow R^{B})\rightarrow(A\rightarrow R^{B})}\quad.\label{eq:rigid-non-degeneracy-law} \end{equation} \end_inset @@ -18872,7 +18869,7 @@ Reader monad, \begin_inset Formula \[ -\text{sw}_{R,M}:M^{R^{A}}\Rightarrow R^{M^{A}}\cong(Z\Rightarrow R^{A})\Rightarrow R^{Z\Rightarrow A}\text{ if we set }M^{A}\triangleq Z\Rightarrow A\quad. +\text{sw}_{R,M}:M^{R^{A}}\rightarrow R^{M^{A}}\cong(Z\rightarrow R^{A})\rightarrow R^{Z\rightarrow A}\text{ if we set }M^{A}\triangleq Z\rightarrow A\quad. \] \end_inset @@ -19034,7 +19031,7 @@ Reader \end_inset monad, -\begin_inset Formula $M^{B}\triangleq A\Rightarrow B$ +\begin_inset Formula $M^{B}\triangleq A\rightarrow B$ \end_inset , with the fixed environment type @@ -19044,7 +19041,7 @@ Reader : \begin_inset Formula \begin{equation} -\text{fi}_{R}(f^{:A\Rightarrow R^{B}})=\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\bef\text{ftn}_{T}\label{eq:rigid-monad-fuseIn-def} +\text{fi}_{R}(f^{:A\rightarrow R^{B}})=\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\bef\text{ftn}_{T}\label{eq:rigid-monad-fuseIn-def} \end{equation} \end_inset @@ -19052,8 +19049,8 @@ Reader \begin_inset Formula \[ -\xymatrix{\xyScaleY{2pc}\xyScaleX{4pc}A\Rightarrow R^{B}\ar[r]\sp(0.5){\text{pu}_{M}^{\uparrow R\uparrow M}}\ar[rrd]\sb(0.5){\text{fi}_{R}\triangleq} & A\Rightarrow R^{A\Rightarrow B}\ar[r]\sp(0.5){\text{pu}_{R}} & R^{A\Rightarrow R^{A\Rightarrow B}}\ar[d]\sp(0.45){\text{ftn}_{T}}\\ - & & R^{A\Rightarrow B} +\xymatrix{\xyScaleY{2pc}\xyScaleX{4pc}A\rightarrow R^{B}\ar[r]\sp(0.5){\text{pu}_{M}^{\uparrow R\uparrow M}}\ar[rrd]\sb(0.5){\text{fi}_{R}\triangleq} & A\rightarrow R^{A\rightarrow B}\ar[r]\sp(0.5){\text{pu}_{R}} & R^{A\rightarrow R^{A\rightarrow B}}\ar[d]\sp(0.45){\text{ftn}_{T}}\\ + & & R^{A\rightarrow B} } \] @@ -19082,7 +19079,7 @@ Reader , we have \begin_inset Formula \[ -\text{pu}_{M}(x)=(\_^{:A}\Rightarrow x)\quad,\quad\quad(f^{:X\Rightarrow Y})^{\uparrow M}(r^{:A\Rightarrow X})=r\bef f\quad. +\text{pu}_{M}(x)=(\_^{:A}\rightarrow x)\quad,\quad\quad(f^{:X\rightarrow Y})^{\uparrow M}(r^{:A\rightarrow X})=r\bef f\quad. \] \end_inset @@ -19102,7 +19099,7 @@ fuseOut , \begin_inset Formula \[ -\text{fo}:R^{A\Rightarrow B}\Rightarrow A\Rightarrow R^{B}\quad, +\text{fo}:R^{A\rightarrow B}\rightarrow A\rightarrow R^{B}\quad, \] \end_inset @@ -19168,7 +19165,7 @@ runner is \begin_inset Formula \begin{equation} -\phi_{a}^{:M^{X}\Rightarrow X}=\big(m^{A\Rightarrow X}\Rightarrow m(a)\big)\quad.\label{eq:runner-phi-def} +\phi_{a}^{:M^{X}\rightarrow X}=\big(m^{A\rightarrow X}\rightarrow m(a)\big)\quad.\label{eq:runner-phi-def} \end{equation} \end_inset @@ -19284,7 +19281,7 @@ fuseOut ), \begin_inset Formula \[ -\text{fo}_{R}=\big(r\Rightarrow a\Rightarrow r\triangleright\phi_{a}^{\uparrow R}\big)\quad, +\text{fo}_{R}=\big(r\rightarrow a\rightarrow r\triangleright\phi_{a}^{\uparrow R}\big)\quad, \] \end_inset @@ -19307,13 +19304,13 @@ noprefix "false" \begin_inset Formula \begin{align*} \text{expect to equal }m:\quad & m^{:M^{R^{B}}}\triangleright\text{fi}_{R}\bef\text{fo}_{R}=\left(m\triangleright\text{fi}_{R}\right)\triangleright\gunderline{\text{fo}_{R}}\\ -\text{use Eq.~(\ref{eq:fuseOut-def})}:\quad & =a\Rightarrow m\triangleright\gunderline{\text{fi}_{R}}\triangleright\phi_{a}^{\uparrow R}\\ -\text{use Eq.~(\ref{eq:rigid-monad-fuseIn-def})}:\quad & =a\Rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\bef\gunderline{\text{ftn}_{T}\bef\phi_{a}^{\uparrow R}}\\ -\text{use Eq.~(\ref{eq:rigid-monad-is-rigid-functor-derivation1})}:\quad & =a\Rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\gunderline{\text{pu}_{R}\bef\phi_{a}^{\uparrow R\uparrow M\uparrow R}\bef\phi_{a}^{\uparrow R}}\bef\text{ftn}_{R}\\ -\text{naturality of }\text{pu}_{R}:\quad & =a\Rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\phi_{a}^{\uparrow R\uparrow M}\bef\phi_{a}\bef\gunderline{\text{pu}_{R}\bef\text{ftn}_{R}}\\ -\text{left identity law of }R:\quad & =a\Rightarrow m\triangleright\gunderline{(\text{pu}_{M}\bef\phi_{a})}^{\uparrow R\uparrow M}\bef\phi_{a}\\ -\text{identity law for }\phi_{a}:\quad & =a\Rightarrow m\triangleright\gunderline{\phi_{a}}\\ -\text{definition~(\ref{eq:runner-phi-def}) for }\phi_{a}:\quad & =\gunderline{\left(a\Rightarrow m(a)\right)}=m\quad. +\text{use Eq.~(\ref{eq:fuseOut-def})}:\quad & =a\rightarrow m\triangleright\gunderline{\text{fi}_{R}}\triangleright\phi_{a}^{\uparrow R}\\ +\text{use Eq.~(\ref{eq:rigid-monad-fuseIn-def})}:\quad & =a\rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\bef\gunderline{\text{ftn}_{T}\bef\phi_{a}^{\uparrow R}}\\ +\text{use Eq.~(\ref{eq:rigid-monad-is-rigid-functor-derivation1})}:\quad & =a\rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\gunderline{\text{pu}_{R}\bef\phi_{a}^{\uparrow R\uparrow M\uparrow R}\bef\phi_{a}^{\uparrow R}}\bef\text{ftn}_{R}\\ +\text{naturality of }\text{pu}_{R}:\quad & =a\rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\phi_{a}^{\uparrow R\uparrow M}\bef\phi_{a}\bef\gunderline{\text{pu}_{R}\bef\text{ftn}_{R}}\\ +\text{left identity law of }R:\quad & =a\rightarrow m\triangleright\gunderline{(\text{pu}_{M}\bef\phi_{a})}^{\uparrow R\uparrow M}\bef\phi_{a}\\ +\text{identity law for }\phi_{a}:\quad & =a\rightarrow m\triangleright\gunderline{\phi_{a}}\\ +\text{definition~(\ref{eq:runner-phi-def}) for }\phi_{a}:\quad & =\gunderline{\left(a\rightarrow m(a)\right)}=m\quad. \end{align*} \end_inset @@ -19325,7 +19322,7 @@ Here we used the monadic morphism identity law for , \begin_inset Formula \[ -\text{pu}_{M}\bef\phi_{a}=\big(x\Rightarrow(\_\Rightarrow x)\big)\bef(m\Rightarrow a\triangleright m)=\left(x\Rightarrow a\triangleright(\_\Rightarrow x)\right)=\left(x\Rightarrow x\right)=\text{id}\quad. +\text{pu}_{M}\bef\phi_{a}=\big(x\rightarrow(\_\rightarrow x)\big)\bef(m\rightarrow a\triangleright m)=\left(x\rightarrow a\triangleright(\_\rightarrow x)\right)=\left(x\rightarrow x\right)=\text{id}\quad. \] \end_inset @@ -19367,11 +19364,11 @@ solved examples \begin_layout Standard To show that the opposite of the non-degeneracy law does not always hold, consider the rigid monads -\begin_inset Formula $P^{A}\triangleq Z\Rightarrow A$ +\begin_inset Formula $P^{A}\triangleq Z\rightarrow A$ \end_inset and -\begin_inset Formula $R^{A}\triangleq\left(A\Rightarrow Q\right)\Rightarrow A$ +\begin_inset Formula $R^{A}\triangleq\left(A\rightarrow Q\right)\rightarrow A$ \end_inset , where @@ -19461,8 +19458,8 @@ To show that : \begin_inset Formula \begin{align*} -\text{fo}_{P} & :P^{A\Rightarrow B}\Rightarrow A\Rightarrow P^{B}\cong\left(Z\Rightarrow A\Rightarrow B\right)\Rightarrow\left(A\Rightarrow Z\Rightarrow B\right)\quad,\\ -\text{fi}_{P} & :\big(A\Rightarrow P^{B}\big)\Rightarrow P^{A\Rightarrow B}\cong\left(A\Rightarrow Z\Rightarrow B\right)\Rightarrow\left(Z\Rightarrow A\Rightarrow B\right)\quad. +\text{fo}_{P} & :P^{A\rightarrow B}\rightarrow A\rightarrow P^{B}\cong\left(Z\rightarrow A\rightarrow B\right)\rightarrow\left(A\rightarrow Z\rightarrow B\right)\quad,\\ +\text{fi}_{P} & :\big(A\rightarrow P^{B}\big)\rightarrow P^{A\rightarrow B}\cong\left(A\rightarrow Z\rightarrow B\right)\rightarrow\left(Z\rightarrow A\rightarrow B\right)\quad. \end{align*} \end_inset @@ -19498,14 +19495,14 @@ The implementations of these functions are derived uniquely from type signatures , \begin_inset Formula \[ -\big(\text{fo}_{P}\bef\text{fi}_{P}\big):P^{A\Rightarrow B}\Rightarrow P^{A\Rightarrow B}\cong\left(Z\Rightarrow A\Rightarrow B\right)\Rightarrow\left(Z\Rightarrow A\Rightarrow B\right)\quad. +\big(\text{fo}_{P}\bef\text{fi}_{P}\big):P^{A\rightarrow B}\rightarrow P^{A\rightarrow B}\cong\left(Z\rightarrow A\rightarrow B\right)\rightarrow\left(Z\rightarrow A\rightarrow B\right)\quad. \] \end_inset There is only one implementation for this type signature as a natural transforma tion, namely the identity function -\begin_inset Formula $\text{id}^{Z\Rightarrow A\Rightarrow B}$ +\begin_inset Formula $\text{id}^{Z\rightarrow A\rightarrow B}$ \end_inset . @@ -19527,8 +19524,8 @@ For the monad are \begin_inset Formula \begin{align*} -\text{fi}_{R} & :\left(A\Rightarrow\left(B\Rightarrow Q\right)\Rightarrow B\right)\Rightarrow\left(\left(A\Rightarrow B\right)\Rightarrow Q\right)\Rightarrow A\Rightarrow B\quad,\\ -\text{fo}_{R} & :\left(\left(\left(A\Rightarrow B\right)\Rightarrow Q\right)\Rightarrow A\Rightarrow B\right)\Rightarrow A\Rightarrow\left(B\Rightarrow Q\right)\Rightarrow B\quad, +\text{fi}_{R} & :\left(A\rightarrow\left(B\rightarrow Q\right)\rightarrow B\right)\rightarrow\left(\left(A\rightarrow B\right)\rightarrow Q\right)\rightarrow A\rightarrow B\quad,\\ +\text{fo}_{R} & :\left(\left(\left(A\rightarrow B\right)\rightarrow Q\right)\rightarrow A\rightarrow B\right)\rightarrow A\rightarrow\left(B\rightarrow Q\right)\rightarrow B\quad, \end{align*} \end_inset @@ -19536,8 +19533,8 @@ For the monad and the implementations are again derived uniquely from type signatures, \begin_inset Formula \begin{align*} -f^{:A\Rightarrow\left(B\Rightarrow Q\right)\Rightarrow B} & \triangleright\text{fi}_{R}=x^{:\left(A\Rightarrow B\right)\Rightarrow Q}\Rightarrow a^{:A}\Rightarrow f(a)(b^{:B}\Rightarrow x(\_\Rightarrow b))\quad,\\ -g^{:\left(\left(A\Rightarrow B\right)\Rightarrow Q\right)\Rightarrow A\Rightarrow B} & \triangleright\text{fo}_{R}=a^{:A}\Rightarrow y^{:B\Rightarrow Q}\Rightarrow g(h^{:A\Rightarrow B}\Rightarrow y(h(a)))(a)\quad. +f^{:A\rightarrow\left(B\rightarrow Q\right)\rightarrow B} & \triangleright\text{fi}_{R}=x^{:\left(A\rightarrow B\right)\rightarrow Q}\rightarrow a^{:A}\rightarrow f(a)(b^{:B}\rightarrow x(\_\rightarrow b))\quad,\\ +g^{:\left(\left(A\rightarrow B\right)\rightarrow Q\right)\rightarrow A\rightarrow B} & \triangleright\text{fo}_{R}=a^{:A}\rightarrow y^{:B\rightarrow Q}\rightarrow g(h^{:A\rightarrow B}\rightarrow y(h(a)))(a)\quad. \end{align*} \end_inset @@ -19547,7 +19544,7 @@ We notice that the implementation of \end_inset uses a constant function, -\begin_inset Formula $\left(\_\Rightarrow b\right)$ +\begin_inset Formula $\left(\_\rightarrow b\right)$ \end_inset , which is likely to lose information. @@ -19559,9 +19556,9 @@ We notice that the implementation of \begin_inset Formula \begin{align*} \text{expect \emph{not} to equal }g:\quad & g\triangleright\text{fo}_{R}\bef\text{fi}_{R}=\left(g\triangleright\text{fo}_{R}\right)\triangleright\gunderline{\text{fi}_{R}}\\ -\text{definition of }\text{fi}_{R}:\quad & =x\Rightarrow a\Rightarrow\gunderline{\text{fo}_{R}}(g)(a)(b\Rightarrow x(\_\Rightarrow b))\\ -\text{definition of }\text{fo}_{R}:\quad & =x\Rightarrow a\Rightarrow g\big(h^{:A\Rightarrow B}\Rightarrow h(a)\triangleright\gunderline{(b\Rightarrow}x(\_\Rightarrow b))\big)(a)\\ -\text{apply to argument }b:\quad & =x\Rightarrow a\Rightarrow g\big(h\Rightarrow x(\_\Rightarrow h(a))\big)(a)\quad. +\text{definition of }\text{fi}_{R}:\quad & =x\rightarrow a\rightarrow\gunderline{\text{fo}_{R}}(g)(a)(b\rightarrow x(\_\rightarrow b))\\ +\text{definition of }\text{fo}_{R}:\quad & =x\rightarrow a\rightarrow g\big(h^{:A\rightarrow B}\rightarrow h(a)\triangleright\gunderline{(b\rightarrow}x(\_\rightarrow b))\big)(a)\\ +\text{apply to argument }b:\quad & =x\rightarrow a\rightarrow g\big(h\rightarrow x(\_\rightarrow h(a))\big)(a)\quad. \end{align*} \end_inset @@ -19579,7 +19576,7 @@ We cannot simplify the last line any further: the functions \end_inset are unknown, and we cannot calculate symbolically, say, the value of -\begin_inset Formula $x(\_\Rightarrow h(a))$ +\begin_inset Formula $x(\_\rightarrow h(a))$ \end_inset . @@ -19588,7 +19585,7 @@ We cannot simplify the last line any further: the functions \end_inset , we would expect it to be -\begin_inset Formula $x\Rightarrow a\Rightarrow g(x)(a)$ +\begin_inset Formula $x\rightarrow a\rightarrow g(x)(a)$ \end_inset . @@ -19597,7 +19594,7 @@ We cannot simplify the last line any further: the functions \end_inset , namely we have -\begin_inset Formula $h\Rightarrow x(\_\Rightarrow h(a))$ +\begin_inset Formula $h\rightarrow x(\_\rightarrow h(a))$ \end_inset instead of @@ -19609,13 +19606,13 @@ We cannot simplify the last line any further: the functions had \begin_inset Formula \[ -\left(h\Rightarrow x(h)\right)=\left(h\Rightarrow x(k\Rightarrow h(k))\right) +\left(h\rightarrow x(h)\right)=\left(h\rightarrow x(k\rightarrow h(k))\right) \] \end_inset instead of -\begin_inset Formula $h\Rightarrow x(\_\Rightarrow h(a))$ +\begin_inset Formula $h\rightarrow x(\_\rightarrow h(a))$ \end_inset . @@ -19624,11 +19621,11 @@ instead of \end_inset in the two last expressions: -\begin_inset Formula $k\Rightarrow h(a)$ +\begin_inset Formula $k\rightarrow h(a)$ \end_inset instead of -\begin_inset Formula $k\Rightarrow h(k)$ +\begin_inset Formula $k\rightarrow h(k)$ \end_inset . @@ -19641,15 +19638,15 @@ instead of \end_inset is an arbitrary function of type -\begin_inset Formula $A\Rightarrow B$ +\begin_inset Formula $A\rightarrow B$ \end_inset ), the two expressions -\begin_inset Formula $k\Rightarrow h(a)$ +\begin_inset Formula $k\rightarrow h(a)$ \end_inset and -\begin_inset Formula $k\Rightarrow h(k)$ +\begin_inset Formula $k\rightarrow h(k)$ \end_inset are generally not equal. @@ -19751,7 +19748,7 @@ noprefix "false" \begin_layout Standard Show that the functor -\begin_inset Formula $F^{A}\triangleq\left(A\Rightarrow Z\right)\Rightarrow Z$ +\begin_inset Formula $F^{A}\triangleq\left(A\rightarrow Z\right)\rightarrow Z$ \end_inset is not rigid. @@ -19794,7 +19791,7 @@ noprefix "false" \begin_layout Standard The functor -\begin_inset Formula $S^{\bullet}\triangleq H^{\bullet}\Rightarrow P^{\bullet}$ +\begin_inset Formula $S^{\bullet}\triangleq H^{\bullet}\rightarrow P^{\bullet}$ \end_inset is rigid when @@ -19848,8 +19845,8 @@ noprefix "false" is then defined by \begin_inset Formula \begin{align*} -\text{fi}_{S} & :\big(A\Rightarrow H^{B}\Rightarrow P^{B}\big)\Rightarrow H^{A\Rightarrow B}\Rightarrow P^{A\Rightarrow B}\quad,\\ -\text{fi}_{S} & =f^{:A\Rightarrow H^{B}\Rightarrow P^{B}}\Rightarrow h^{:H^{A\Rightarrow B}}\Rightarrow\text{fi}_{P}\big(a\Rightarrow f(a)\big(\left(b\Rightarrow\_\Rightarrow b\right)^{\downarrow H}h\big)\big)\quad, +\text{fi}_{S} & :\big(A\rightarrow H^{B}\rightarrow P^{B}\big)\rightarrow H^{A\rightarrow B}\rightarrow P^{A\rightarrow B}\quad,\\ +\text{fi}_{S} & =f^{:A\rightarrow H^{B}\rightarrow P^{B}}\rightarrow h^{:H^{A\rightarrow B}}\rightarrow\text{fi}_{P}\big(a\rightarrow f(a)\big(\left(b\rightarrow\_\rightarrow b\right)^{\downarrow H}h\big)\big)\quad, \end{align*} \end_inset @@ -19857,7 +19854,7 @@ noprefix "false" or, using the forwarding notation, \begin_inset Formula \[ -h\triangleright\text{fi}_{S}(f)=\big(a\Rightarrow h\triangleright\left(b\Rightarrow\_\Rightarrow b\right)^{\downarrow H}\triangleright f(a)\big)\triangleright\text{fi}_{P}\quad. +h\triangleright\text{fi}_{S}(f)=\big(a\rightarrow h\triangleright\left(b\rightarrow\_\rightarrow b\right)^{\downarrow H}\triangleright f(a)\big)\triangleright\text{fi}_{P}\quad. \] \end_inset @@ -19869,8 +19866,8 @@ Let us write the definition of as well, \begin_inset Formula \begin{align*} -\text{fo}_{S} & :\big(H^{A\Rightarrow B}\Rightarrow P^{A\Rightarrow B}\big)\Rightarrow A\Rightarrow H^{B}\Rightarrow P^{B}\quad,\\ -\text{fo}_{S} & =g^{:H^{A\Rightarrow B}\Rightarrow P^{A\Rightarrow B}}\Rightarrow a^{:A}\Rightarrow h^{:H^{B}}\Rightarrow\text{fo}_{P}\bigg(g\big(\left(p^{:A\Rightarrow B}\Rightarrow p(a)\right)^{\downarrow H}h\big)\bigg)(a)\quad, +\text{fo}_{S} & :\big(H^{A\rightarrow B}\rightarrow P^{A\rightarrow B}\big)\rightarrow A\rightarrow H^{B}\rightarrow P^{B}\quad,\\ +\text{fo}_{S} & =g^{:H^{A\rightarrow B}\rightarrow P^{A\rightarrow B}}\rightarrow a^{:A}\rightarrow h^{:H^{B}}\rightarrow\text{fo}_{P}\bigg(g\big(\left(p^{:A\rightarrow B}\rightarrow p(a)\right)^{\downarrow H}h\big)\bigg)(a)\quad, \end{align*} \end_inset @@ -19878,7 +19875,7 @@ Let us write the definition of or, using the forwarding notation, \begin_inset Formula \[ -\text{fo}_{S}(g)=a\triangleright\big(h\triangleright\left(p\Rightarrow p(a)\right)^{\downarrow H}\bef g\bef\text{fo}_{P}\big)\quad. +\text{fo}_{S}(g)=a\triangleright\big(h\triangleright\left(p\rightarrow p(a)\right)^{\downarrow H}\bef g\bef\text{fo}_{P}\big)\quad. \] \end_inset @@ -19896,7 +19893,7 @@ To verify the non-degeneracy law for \end_inset for an arbitrary -\begin_inset Formula $f:A\Rightarrow H^{B}\Rightarrow P^{B}$ +\begin_inset Formula $f:A\rightarrow H^{B}\rightarrow P^{B}$ \end_inset . @@ -19918,9 +19915,9 @@ To verify the non-degeneracy law for \begin_inset Formula \begin{align*} \quad & \left(f\triangleright\text{fi}_{S}\bef\text{fo}_{S}\right)(a)(h)=(f\triangleright\text{fi}_{S}\triangleright\gunderline{\text{fo}_{S}})(a)(h)\\ -\text{expand }\text{fo}_{S}:\quad & =a\triangleright\big(h\triangleright\left(p\Rightarrow a\triangleright p\right)^{\downarrow H}\triangleright\gunderline{\text{fi}_{S}(f)}\triangleright\text{fo}_{P}\big)\\ -\text{expand }\text{fi}_{S}:\quad & =a\triangleright\big(\big(a\Rightarrow h\triangleright\gunderline{\left(p\Rightarrow p(a)\right)^{\downarrow H}\bef\left(b\Rightarrow\_\Rightarrow b\right)^{\downarrow H}}\bef f(a)\big)\triangleright\text{fi}_{P}\triangleright\text{fo}_{P}\big)\\ -\text{compose }^{\downarrow H}:\quad & =a\triangleright\big(\big(a\Rightarrow h\triangleright\gunderline{\left((b\Rightarrow\_\Rightarrow b)\bef(p\Rightarrow p(a))\right)^{\downarrow H}}\bef f(a)\big)\triangleright\text{fi}_{P}\gunderline{\triangleright}\text{fo}_{P}\big)\quad. +\text{expand }\text{fo}_{S}:\quad & =a\triangleright\big(h\triangleright\left(p\rightarrow a\triangleright p\right)^{\downarrow H}\triangleright\gunderline{\text{fi}_{S}(f)}\triangleright\text{fo}_{P}\big)\\ +\text{expand }\text{fi}_{S}:\quad & =a\triangleright\big(\big(a\rightarrow h\triangleright\gunderline{\left(p\rightarrow p(a)\right)^{\downarrow H}\bef\left(b\rightarrow\_\rightarrow b\right)^{\downarrow H}}\bef f(a)\big)\triangleright\text{fi}_{P}\triangleright\text{fo}_{P}\big)\\ +\text{compose }^{\downarrow H}:\quad & =a\triangleright\big(\big(a\rightarrow h\triangleright\gunderline{\left((b\rightarrow\_\rightarrow b)\bef(p\rightarrow p(a))\right)^{\downarrow H}}\bef f(a)\big)\triangleright\text{fi}_{P}\gunderline{\triangleright}\text{fo}_{P}\big)\quad. \end{align*} \end_inset @@ -19928,7 +19925,7 @@ To verify the non-degeneracy law for Computing the function composition \begin_inset Formula \[ -(b\Rightarrow\_\Rightarrow b)\bef(p\Rightarrow p(a))=(b\Rightarrow(\_\Rightarrow b)(a))=(b\Rightarrow b)=\text{id}\quad, +(b\rightarrow\_\rightarrow b)\bef(p\rightarrow p(a))=(b\rightarrow(\_\rightarrow b)(a))=(b\rightarrow b)=\text{id}\quad, \] \end_inset @@ -19940,9 +19937,9 @@ and using the non-degeneracy law , we can simplify further: \begin_inset Formula \begin{align*} - & a\triangleright\big(\big(a\Rightarrow h\triangleright\gunderline{\left((b\Rightarrow\_\Rightarrow b)\bef(p\Rightarrow p(a))\right)^{\downarrow H}}\bef f(a)\big)\triangleright\text{fi}_{P}\gunderline{\triangleright}\text{fo}_{P}\big)\\ -\text{identity law for }H:\quad & =a\triangleright\big(\big(a\Rightarrow h\triangleright f(a)\big)\triangleright\gunderline{\text{fi}_{P}\bef\text{fo}_{P}}\big)\\ -\text{non-degeneracy}:\quad & =\gunderline{a\triangleright\big(a\Rightarrow}h\triangleright f(a)\big)=h\triangleright f(a)\quad. + & a\triangleright\big(\big(a\rightarrow h\triangleright\gunderline{\left((b\rightarrow\_\rightarrow b)\bef(p\rightarrow p(a))\right)^{\downarrow H}}\bef f(a)\big)\triangleright\text{fi}_{P}\gunderline{\triangleright}\text{fo}_{P}\big)\\ +\text{identity law for }H:\quad & =a\triangleright\big(\big(a\rightarrow h\triangleright f(a)\big)\triangleright\gunderline{\text{fi}_{P}\bef\text{fo}_{P}}\big)\\ +\text{non-degeneracy}:\quad & =\gunderline{a\triangleright\big(a\rightarrow}h\triangleright f(a)\big)=h\triangleright f(a)\quad. \end{align*} \end_inset @@ -20013,19 +20010,19 @@ Since it is given that \begin_layout Plain Layout Flip the curried arguments of the function type -\begin_inset Formula $A\Rightarrow T^{B}\triangleq A\Rightarrow H^{M^{B}}\Rightarrow M^{B}$ +\begin_inset Formula $A\rightarrow T^{B}\triangleq A\rightarrow H^{M^{B}}\rightarrow M^{B}$ \end_inset , to obtain -\begin_inset Formula $H^{M^{B}}\Rightarrow A\Rightarrow M^{B}$ +\begin_inset Formula $H^{M^{B}}\rightarrow A\rightarrow M^{B}$ \end_inset , and note that -\begin_inset Formula $A\Rightarrow M^{B}$ +\begin_inset Formula $A\rightarrow M^{B}$ \end_inset can be mapped to -\begin_inset Formula $M^{A\Rightarrow B}$ +\begin_inset Formula $M^{A\rightarrow B}$ \end_inset using @@ -20044,10 +20041,10 @@ Flip the curried arguments of the function type : \begin_inset Formula \begin{align*} -\tilde{\text{fi}}_{T} & :\big(H^{M^{B}}\Rightarrow A\Rightarrow M^{B}\big)\Rightarrow H^{M^{A\Rightarrow B}}\Rightarrow M^{A\Rightarrow B}\\ -\tilde{\text{fi}}_{T} & =f\Rightarrow h\Rightarrow\text{fi}_{M}\left(f\big(\left(b\Rightarrow\_\Rightarrow b\right)^{\uparrow M\downarrow H}h\big)\right)\\ -\tilde{\text{fo}}_{T} & :\left(H^{M^{A\Rightarrow B}}\Rightarrow M^{A\Rightarrow B}\right)\Rightarrow H^{M^{B}}\Rightarrow A\Rightarrow M^{B}\\ -\tilde{\text{fo}}_{T} & =g\Rightarrow h\Rightarrow a\Rightarrow\text{fo}_{M}\left(g\big(\left(p^{:A\Rightarrow B}\Rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)\right)a +\tilde{\text{fi}}_{T} & :\big(H^{M^{B}}\rightarrow A\rightarrow M^{B}\big)\rightarrow H^{M^{A\rightarrow B}}\rightarrow M^{A\rightarrow B}\\ +\tilde{\text{fi}}_{T} & =f\rightarrow h\rightarrow\text{fi}_{M}\left(f\big(\left(b\rightarrow\_\rightarrow b\right)^{\uparrow M\downarrow H}h\big)\right)\\ +\tilde{\text{fo}}_{T} & :\left(H^{M^{A\rightarrow B}}\rightarrow M^{A\rightarrow B}\right)\rightarrow H^{M^{B}}\rightarrow A\rightarrow M^{B}\\ +\tilde{\text{fo}}_{T} & =g\rightarrow h\rightarrow a\rightarrow\text{fo}_{M}\left(g\big(\left(p^{:A\rightarrow B}\rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)\right)a \end{align*} \end_inset @@ -20060,11 +20057,11 @@ To show the non-degeneracy law for \begin_inset Formula \begin{align*} & \tilde{\text{fo}}_{T}\left(\tilde{\text{fi}}_{T}f\right)h^{:H^{M^{B}}}a^{:A}\\ -\text{insert the definition of }\tilde{\text{fo}}_{T}\text{: }\quad & =\text{fo}_{M}\left(\left(\tilde{\text{fi}}_{T}f\right)\big(\left(p\Rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)\right)a\\ -\text{insert the definition of }\tilde{\text{fi}}_{T}\text{: }\quad & =\text{fo}_{M}\left(\text{fi}_{M}\left(f\big(\left(b\Rightarrow\_\Rightarrow b\right)^{\uparrow M\downarrow H}\left(p\Rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)\right)\right)a\\ -\text{nondegeneracy law for }\text{fi}_{M}\text{: }\quad & =f\big(\left(b\Rightarrow\_\Rightarrow b\right)^{\uparrow M\downarrow H}\left(p\Rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)a\\ -\text{composition laws for }M,H\text{: }\quad & =f\big(\left(b\Rightarrow\_\Rightarrow b\bef p\Rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)a\\ -\text{simplify }\text{: }\quad & =f\left(\left(b\Rightarrow b\right)^{\uparrow M\downarrow H}h\right)a\\ +\text{insert the definition of }\tilde{\text{fo}}_{T}\text{: }\quad & =\text{fo}_{M}\left(\left(\tilde{\text{fi}}_{T}f\right)\big(\left(p\rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)\right)a\\ +\text{insert the definition of }\tilde{\text{fi}}_{T}\text{: }\quad & =\text{fo}_{M}\left(\text{fi}_{M}\left(f\big(\left(b\rightarrow\_\rightarrow b\right)^{\uparrow M\downarrow H}\left(p\rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)\right)\right)a\\ +\text{nondegeneracy law for }\text{fi}_{M}\text{: }\quad & =f\big(\left(b\rightarrow\_\rightarrow b\right)^{\uparrow M\downarrow H}\left(p\rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)a\\ +\text{composition laws for }M,H\text{: }\quad & =f\big(\left(b\rightarrow\_\rightarrow b\bef p\rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)a\\ +\text{simplify }\text{: }\quad & =f\left(\left(b\rightarrow b\right)^{\uparrow M\downarrow H}h\right)a\\ \text{identity laws for }M,H\text{: }\quad & =f\,h\,a\quad. \end{align*} @@ -20095,14 +20092,14 @@ Trying the triangle notation: It seems that \end_inset is not so useful, we could just write -\begin_inset Formula $\left(f\Rightarrow f(a)\right)$ +\begin_inset Formula $\left(f\rightarrow f(a)\right)$ \end_inset instead. \begin_inset Formula \begin{align*} -\tilde{\text{fi}}\left(f\right) & =f\triangleright\tilde{\text{fi}}=\left(b\Rightarrow\_\Rightarrow b\right)^{\downarrow H}\bef f\quad,\\ -\tilde{\text{fo}}\left(g\right) & =g\triangleright\tilde{\text{fo}}=h\Rightarrow a\Rightarrow g((a\triangleright)^{\downarrow H}h)a=h\Rightarrow a\Rightarrow h\triangleright(a\triangleright)^{\downarrow H}\bef g\bef\left(a\triangleright\right)\quad. +\tilde{\text{fi}}\left(f\right) & =f\triangleright\tilde{\text{fi}}=\left(b\rightarrow\_\rightarrow b\right)^{\downarrow H}\bef f\quad,\\ +\tilde{\text{fo}}\left(g\right) & =g\triangleright\tilde{\text{fo}}=h\rightarrow a\rightarrow g((a\triangleright)^{\downarrow H}h)a=h\rightarrow a\rightarrow h\triangleright(a\triangleright)^{\downarrow H}\bef g\bef\left(a\triangleright\right)\quad. \end{align*} \end_inset @@ -20111,11 +20108,11 @@ Then \begin_inset Formula \begin{align*} & f\triangleright\tilde{\text{fi}}\triangleright\tilde{\text{fo}}\\ - & =h\Rightarrow a\Rightarrow h\triangleright(a\triangleright)^{\downarrow H}\bef\left(f\triangleright\tilde{\text{fi}}\right)\bef\left(a\triangleright\right)\\ - & =h\Rightarrow a\Rightarrow h\triangleright(a\triangleright)^{\downarrow H}\bef\left(b\Rightarrow\_\Rightarrow b\right)^{\downarrow H}\bef f\bef\left(a\triangleright\right)\\ - & =h\Rightarrow a\Rightarrow h\triangleright\left(b\Rightarrow\_\Rightarrow b\bef\left(a\triangleright\right)\right)^{\downarrow H}\bef f\bef\left(a\triangleright\right)\\ - & =h\Rightarrow a\Rightarrow h\triangleright f\bef\left(a\triangleright\right)=h\Rightarrow a\Rightarrow h\triangleright f\triangleright\left(a\triangleright\right)\\ - & =h\Rightarrow a\Rightarrow f(h)(a)=f + & =h\rightarrow a\rightarrow h\triangleright(a\triangleright)^{\downarrow H}\bef\left(f\triangleright\tilde{\text{fi}}\right)\bef\left(a\triangleright\right)\\ + & =h\rightarrow a\rightarrow h\triangleright(a\triangleright)^{\downarrow H}\bef\left(b\rightarrow\_\rightarrow b\right)^{\downarrow H}\bef f\bef\left(a\triangleright\right)\\ + & =h\rightarrow a\rightarrow h\triangleright\left(b\rightarrow\_\rightarrow b\bef\left(a\triangleright\right)\right)^{\downarrow H}\bef f\bef\left(a\triangleright\right)\\ + & =h\rightarrow a\rightarrow h\triangleright f\bef\left(a\triangleright\right)=h\rightarrow a\rightarrow h\triangleright f\triangleright\left(a\triangleright\right)\\ + & =h\rightarrow a\rightarrow f(h)(a)=f \end{align*} \end_inset @@ -20123,8 +20120,8 @@ Then What are the simplification rules? \begin_inset Formula \begin{align*} - & a\Rightarrow x\triangleright\left(a\triangleright\right)=x\quad,\\ - & a\Rightarrow a\triangleright f=f\quad,\\ + & a\rightarrow x\triangleright\left(a\triangleright\right)=x\quad,\\ + & a\rightarrow a\triangleright f=f\quad,\\ & x\triangleright\left(a\triangleright\right)=x(a)=a\triangleright x\quad,\\ & x\triangleright y\triangleright\left(a\triangleright\right)=a\triangleright\left(x\triangleright y\right)\quad. \end{align*} @@ -20180,7 +20177,7 @@ pure can be defined as \begin_inset Formula \[ -\text{pu}_{R}(x^{:A})\triangleq\text{id}^{:R^{A}\Rightarrow R^{A}}\triangleright\text{fi}_{R}\triangleright(\_\Rightarrow x)^{\uparrow R}\quad. +\text{pu}_{R}(x^{:A})\triangleq\text{id}^{:R^{A}\rightarrow R^{A}}\triangleright\text{fi}_{R}\triangleright(\_\rightarrow x)^{\uparrow R}\quad. \] \end_inset @@ -20204,7 +20201,7 @@ wrapped unit ), computed as \begin_inset Formula \begin{equation} -r_{1}\triangleq\text{pu}_{R}(1)=\text{id}\triangleright\text{fi}_{R}\triangleright(\_\Rightarrow1)^{\uparrow R}\quad.\label{eq:rigid-functor-def-of-wrapped-unit} +r_{1}\triangleq\text{pu}_{R}(1)=\text{id}\triangleright\text{fi}_{R}\triangleright(\_\rightarrow1)^{\uparrow R}\quad.\label{eq:rigid-functor-def-of-wrapped-unit} \end{equation} \end_inset @@ -20218,7 +20215,7 @@ Proof \begin_layout Standard The method -\begin_inset Formula $\text{fi}_{R}:(X\Rightarrow R^{Y})\Rightarrow R^{X\Rightarrow Y}$ +\begin_inset Formula $\text{fi}_{R}:(X\rightarrow R^{Y})\rightarrow R^{X\rightarrow Y}$ \end_inset with type parameters @@ -20234,24 +20231,24 @@ The method \end_inset , considered as a value of type -\begin_inset Formula $X\Rightarrow R^{Y}$ +\begin_inset Formula $X\rightarrow R^{Y}$ \end_inset . The result is a value \begin_inset Formula \[ -\text{fi}_{R}(\text{id}):R^{R^{A}\Rightarrow A}\quad. +\text{fi}_{R}(\text{id}):R^{R^{A}\rightarrow A}\quad. \] \end_inset The result is transformed via the raised constant function -\begin_inset Formula $\left(\_\Rightarrow x\right)^{\uparrow R}$ +\begin_inset Formula $\left(\_\rightarrow x\right)^{\uparrow R}$ \end_inset , which takes -\begin_inset Formula $R^{R^{A}\Rightarrow A}$ +\begin_inset Formula $R^{R^{A}\rightarrow A}$ \end_inset and returns @@ -20262,7 +20259,7 @@ The result is transformed via the raised constant function The resulting code can be written as \begin_inset Formula \[ -\text{pu}_{R}(x)\triangleq(\_\Rightarrow x)^{\uparrow R}(\text{fi}_{R}(\text{id}))=\text{id}\triangleright\text{fi}_{R}\triangleright(\_\Rightarrow x)^{\uparrow R}\quad. +\text{pu}_{R}(x)\triangleq(\_\rightarrow x)^{\uparrow R}(\text{fi}_{R}(\text{id}))=\text{id}\triangleright\text{fi}_{R}\triangleright(\_\rightarrow x)^{\uparrow R}\quad. \] \end_inset @@ -20422,7 +20419,7 @@ noprefix "false" \end_inset is the function -\begin_inset Formula $\left(1\Rightarrow r_{1}\right)$ +\begin_inset Formula $\left(1\rightarrow r_{1}\right)$ \end_inset . @@ -20438,7 +20435,7 @@ The plan of the proof is to apply both sides of the non-degeneracy law \end_inset to the identity function of type -\begin_inset Formula $R^{\bbnum 1}\Rightarrow R^{\bbnum 1}$ +\begin_inset Formula $R^{\bbnum 1}\rightarrow R^{\bbnum 1}$ \end_inset . @@ -20449,7 +20446,7 @@ The plan of the proof is to apply both sides of the non-degeneracy law , \begin_inset Formula \[ -\big(\text{fi}_{R}\bef\text{fo}_{R}\big):(A\Rightarrow R^{B})\Rightarrow(A\Rightarrow R^{B})\quad, +\big(\text{fi}_{R}\bef\text{fo}_{R}\big):(A\rightarrow R^{B})\rightarrow(A\rightarrow R^{B})\quad, \] \end_inset @@ -20465,11 +20462,11 @@ and set . The left-hand side of the law can be now applied to the identity function -\begin_inset Formula $\text{id}:R^{\bbnum 1}\Rightarrow R^{\bbnum 1}$ +\begin_inset Formula $\text{id}:R^{\bbnum 1}\rightarrow R^{\bbnum 1}$ \end_inset , which yields a value of type -\begin_inset Formula $R^{\bbnum 1}\Rightarrow R^{\bbnum 1}$ +\begin_inset Formula $R^{\bbnum 1}\rightarrow R^{\bbnum 1}$ \end_inset , i.e. @@ -20479,7 +20476,7 @@ and set a function \begin_inset Formula \[ -f_{1}:R^{\bbnum 1}\Rightarrow R^{\bbnum 1}\quad,\quad\quad f_{1}\triangleq\text{fo}_{R}(\text{fi}_{R}(\text{id}))\quad. +f_{1}:R^{\bbnum 1}\rightarrow R^{\bbnum 1}\quad,\quad\quad f_{1}\triangleq\text{fo}_{R}(\text{fi}_{R}(\text{id}))\quad. \] \end_inset @@ -20489,7 +20486,7 @@ We will show that \end_inset is a constant function, -\begin_inset Formula $f_{1}=(\_\Rightarrow r_{1})$ +\begin_inset Formula $f_{1}=(\_\rightarrow r_{1})$ \end_inset , always returning the same value @@ -20516,7 +20513,7 @@ noprefix "false" \end_inset is the identity function of type -\begin_inset Formula $R^{\bbnum 1}\Rightarrow R^{\bbnum 1}$ +\begin_inset Formula $R^{\bbnum 1}\rightarrow R^{\bbnum 1}$ \end_inset . @@ -20526,7 +20523,7 @@ noprefix "false" . If the identity function of type -\begin_inset Formula $R^{\bbnum 1}\Rightarrow R^{\bbnum 1}$ +\begin_inset Formula $R^{\bbnum 1}\rightarrow R^{\bbnum 1}$ \end_inset always returns the same value ( @@ -20550,7 +20547,7 @@ To begin the proof, note that for any fixed type \end_inset , the function type -\begin_inset Formula $A\Rightarrow\bbnum 1$ +\begin_inset Formula $A\rightarrow\bbnum 1$ \end_inset is equivalent to @@ -20559,20 +20556,20 @@ To begin the proof, note that for any fixed type . This is so because there exists only one pure function of type -\begin_inset Formula $A\Rightarrow\bbnum 1$ +\begin_inset Formula $A\rightarrow\bbnum 1$ \end_inset , namely -\begin_inset Formula $(\_\Rightarrow1)$ +\begin_inset Formula $(\_\rightarrow1)$ \end_inset . In other words, there is only one distinct value of the type -\begin_inset Formula $A\Rightarrow\bbnum 1$ +\begin_inset Formula $A\rightarrow\bbnum 1$ \end_inset , and the value is the function -\begin_inset Formula $\left(\_\Rightarrow1\right)$ +\begin_inset Formula $\left(\_\rightarrow1\right)$ \end_inset . @@ -20581,7 +20578,7 @@ To begin the proof, note that for any fixed type \begin_layout Standard The isomorphism between the types -\begin_inset Formula $A\Rightarrow\bbnum 1$ +\begin_inset Formula $A\rightarrow\bbnum 1$ \end_inset and @@ -20589,11 +20586,11 @@ The isomorphism between the types \end_inset is realized by the functions -\begin_inset Formula $u:\bbnum 1\Rightarrow A\Rightarrow\bbnum 1$ +\begin_inset Formula $u:\bbnum 1\rightarrow A\rightarrow\bbnum 1$ \end_inset and -\begin_inset Formula $v:\left(A\Rightarrow\bbnum 1\right)\Rightarrow\bbnum 1$ +\begin_inset Formula $v:\left(A\rightarrow\bbnum 1\right)\rightarrow\bbnum 1$ \end_inset . @@ -20601,7 +20598,7 @@ The isomorphism between the types s: \begin_inset Formula \[ -u=\big(1\Rightarrow\_^{:A}\Rightarrow1\big)\quad,\quad\quad v=\big(\_^{:A\Rightarrow\bbnum 1}\Rightarrow1\big)\quad. +u=\big(1\rightarrow\_^{:A}\rightarrow1\big)\quad,\quad\quad v=\big(\_^{:A\rightarrow\bbnum 1}\rightarrow1\big)\quad. \] \end_inset @@ -20615,7 +20612,7 @@ Applying \end_inset to the identity function of type -\begin_inset Formula $R^{\bbnum 1}\Rightarrow R^{\bbnum 1}$ +\begin_inset Formula $R^{\bbnum 1}\rightarrow R^{\bbnum 1}$ \end_inset , we obtain a value @@ -20625,13 +20622,13 @@ Applying , \begin_inset Formula \[ -g:R^{R^{\bbnum 1}\Rightarrow\bbnum 1}\quad,\quad\quad g\triangleq\text{id}\triangleright\text{fi}_{R}\quad. +g:R^{R^{\bbnum 1}\rightarrow\bbnum 1}\quad,\quad\quad g\triangleq\text{id}\triangleright\text{fi}_{R}\quad. \] \end_inset Since the type -\begin_inset Formula $R^{\bbnum 1}\Rightarrow\bbnum 1$ +\begin_inset Formula $R^{\bbnum 1}\rightarrow\bbnum 1$ \end_inset is equivalent to @@ -20639,7 +20636,7 @@ Since the type \end_inset , the type -\begin_inset Formula $R^{R^{\bbnum 1}\Rightarrow\bbnum 1}$ +\begin_inset Formula $R^{R^{\bbnum 1}\rightarrow\bbnum 1}$ \end_inset is equivalent to @@ -20661,7 +20658,7 @@ Since the type . The isomorphism will then map -\begin_inset Formula $g:R^{R^{\bbnum 1}\Rightarrow\bbnum 1}$ +\begin_inset Formula $g:R^{R^{\bbnum 1}\rightarrow\bbnum 1}$ \end_inset to some @@ -20695,7 +20692,7 @@ Substituting the definitions of : \begin_inset Formula \[ -g_{1}=\text{id}\triangleright\text{fi}_{R}\triangleright v^{\uparrow R}=\text{id}\triangleright\text{fi}_{R}\triangleright(\_\Rightarrow1)^{\uparrow R}=r_{1}\quad. +g_{1}=\text{id}\triangleright\text{fi}_{R}\triangleright v^{\uparrow R}=\text{id}\triangleright\text{fi}_{R}\triangleright(\_\rightarrow1)^{\uparrow R}=r_{1}\quad. \] \end_inset @@ -20716,7 +20713,7 @@ We can now map \begin_inset Formula \begin{align} g & =g_{1}\triangleright u^{\uparrow R}=r_{1}\triangleright u^{\uparrow R}\nonumber \\ -\text{definition of }u:\quad & =r_{1}\triangleright\big(1\Rightarrow\_\Rightarrow1\big)^{\uparrow R}\quad.\label{eq:rigid-functor-derivation1} +\text{definition of }u:\quad & =r_{1}\triangleright\big(1\rightarrow\_\rightarrow1\big)^{\uparrow R}\quad.\label{eq:rigid-functor-derivation1} \end{align} \end_inset @@ -20729,10 +20726,10 @@ Compute \begin_inset Formula \begin{align*} & \text{fo}_{R}(g)=g\triangleright\text{fo}_{R}\\ -\text{use Eq.~(\ref{eq:fuseOut-def})}:\quad & =a^{:R^{\bbnum 1}}\Rightarrow g\triangleright\big(f^{:A\Rightarrow\bbnum 1}\Rightarrow f\left(a\right)\big)^{\uparrow R}\\ -\text{use Eq.~(\ref{eq:rigid-functor-derivation1})}:\quad & =a\Rightarrow r_{1}\triangleright(1\Rightarrow\_^{:A}\Rightarrow1)^{\uparrow R}\triangleright\big(f^{:A\Rightarrow\bbnum 1}\Rightarrow f\left(a\right)\big)^{\uparrow R}\\ -\text{composition under }^{\uparrow R}:\quad & =a\Rightarrow r_{1}\triangleright(\gunderline{1\Rightarrow1})^{\uparrow R}\\ -(1\Rightarrow1)\text{ is identity}:\quad & =(a\Rightarrow r_{1}\triangleright\text{id})=(a^{:R^{\bbnum 1}}\Rightarrow r_{1})=(\_^{:R^{\bbnum 1}}\Rightarrow r_{1})\quad. +\text{use Eq.~(\ref{eq:fuseOut-def})}:\quad & =a^{:R^{\bbnum 1}}\rightarrow g\triangleright\big(f^{:A\rightarrow\bbnum 1}\rightarrow f\left(a\right)\big)^{\uparrow R}\\ +\text{use Eq.~(\ref{eq:rigid-functor-derivation1})}:\quad & =a\rightarrow r_{1}\triangleright(1\rightarrow\_^{:A}\rightarrow1)^{\uparrow R}\triangleright\big(f^{:A\rightarrow\bbnum 1}\rightarrow f\left(a\right)\big)^{\uparrow R}\\ +\text{composition under }^{\uparrow R}:\quad & =a\rightarrow r_{1}\triangleright(\gunderline{1\rightarrow1})^{\uparrow R}\\ +(1\rightarrow1)\text{ is identity}:\quad & =(a\rightarrow r_{1}\triangleright\text{id})=(a^{:R^{\bbnum 1}}\rightarrow r_{1})=(\_^{:R^{\bbnum 1}}\rightarrow r_{1})\quad. \end{align*} \end_inset @@ -20742,7 +20739,7 @@ So, \end_inset is a function of type -\begin_inset Formula $R^{\bbnum 1}\Rightarrow R^{\bbnum 1}$ +\begin_inset Formula $R^{\bbnum 1}\rightarrow R^{\bbnum 1}$ \end_inset that ignores its argument and always returns the same value @@ -20759,7 +20756,7 @@ By virtue of the non-degeneracy law, . We see that the identity function -\begin_inset Formula $\text{id}:R^{\bbnum 1}\Rightarrow R^{\bbnum 1}$ +\begin_inset Formula $\text{id}:R^{\bbnum 1}\rightarrow R^{\bbnum 1}$ \end_inset always returns the same value @@ -20774,7 +20771,7 @@ By virtue of the non-degeneracy law, , we get \begin_inset Formula \[ -x=x\triangleright\text{id}=x\triangleright\text{fo}_{R}(g)=x\triangleright(\_\Rightarrow r_{1})=r_{1}\quad. +x=x\triangleright\text{id}=x\triangleright\text{fo}_{R}(g)=x\triangleright(\_\rightarrow r_{1})=r_{1}\quad. \] \end_inset @@ -20789,7 +20786,7 @@ It means that all values of type . So the function -\begin_inset Formula $1\Rightarrow r_{1}$ +\begin_inset Formula $1\rightarrow r_{1}$ \end_inset is indeed an isomorphism between the types @@ -21039,7 +21036,7 @@ flatMap can be defined, \begin_inset Formula \[ -\text{rflm}_{M,R}:(A\Rightarrow R^{M^{B}})\Rightarrow M^{A}\Rightarrow R^{M^{B}}\quad. +\text{rflm}_{M,R}:(A\rightarrow R^{M^{B}})\rightarrow M^{A}\rightarrow R^{M^{B}}\quad. \] \end_inset @@ -21090,17 +21087,17 @@ noprefix "false" , a refactoring function can be implemented, \begin_inset Formula \[ -\text{refactor}:((A\Rightarrow B)\Rightarrow C)\Rightarrow(A\Rightarrow R^{B})\Rightarrow R^{C}\quad. +\text{refactor}:((A\rightarrow B)\rightarrow C)\rightarrow(A\rightarrow R^{B})\rightarrow R^{C}\quad. \] \end_inset This function transforms a program -\begin_inset Formula $p(f^{:A\Rightarrow B}):C$ +\begin_inset Formula $p(f^{:A\rightarrow B}):C$ \end_inset into a program -\begin_inset Formula $\tilde{p}(\tilde{f}^{:A\Rightarrow R^{B}}):R^{C}$ +\begin_inset Formula $\tilde{p}(\tilde{f}^{:A\rightarrow R^{B}}):R^{C}$ \end_inset . @@ -21203,7 +21200,7 @@ codensity monad is defined as \begin_inset Formula \[ -\text{Cod}^{F,A}\triangleq\forall B.\left(A\Rightarrow F^{B}\right)\Rightarrow F^{B} +\text{Cod}^{F,A}\triangleq\forall B.\left(A\rightarrow F^{B}\right)\rightarrow F^{B} \] \end_inset @@ -21250,7 +21247,7 @@ If A monad transformer for the codensity monad is \begin_inset Formula \[ -T_{\text{Cod}}^{M,A}=\forall B.\left(A\Rightarrow M^{F^{B}}\right)\Rightarrow M^{F^{B}} +T_{\text{Cod}}^{M,A}=\forall B.\left(A\rightarrow M^{F^{B}}\right)\rightarrow M^{F^{B}} \] \end_inset @@ -21258,7 +21255,7 @@ T_{\text{Cod}}^{M,A}=\forall B.\left(A\Rightarrow M^{F^{B}}\right)\Rightarrow M^ However, this transformer does not have the base lifting morphism \begin_inset Formula \[ -\text{blift}:\left(\forall B.\left(A\Rightarrow F^{B}\right)\Rightarrow F^{B}\right)\Rightarrow\forall C.\left(A\Rightarrow M^{F^{C}}\right)\Rightarrow M^{F^{C}} +\text{blift}:\left(\forall B.\left(A\rightarrow F^{B}\right)\rightarrow F^{B}\right)\rightarrow\forall C.\left(A\rightarrow M^{F^{C}}\right)\rightarrow M^{F^{C}} \] \end_inset @@ -21283,8 +21280,8 @@ runner , \begin_inset Formula \begin{align*} -\text{mrun} & :\left(M^{\bullet}\leadsto N^{\bullet}\right)\Rightarrow\left(\forall B.\left(A\Rightarrow M^{F^{B}}\right)\Rightarrow M^{F^{B}}\right)\Rightarrow\forall C.\left(A\Rightarrow N^{F^{C}}\right)\Rightarrow N^{F^{C}}\quad,\\ -\text{brun} & :\left(\left(\forall B.\left(A\Rightarrow F^{B}\right)\Rightarrow F^{B}\right)\Rightarrow A\right)\Rightarrow\left(\forall C.\left(A\Rightarrow M^{F^{C}}\right)\Rightarrow M^{F^{C}}\right)\Rightarrow M^{A}\quad. +\text{mrun} & :\left(M^{\bullet}\leadsto N^{\bullet}\right)\rightarrow\left(\forall B.\left(A\rightarrow M^{F^{B}}\right)\rightarrow M^{F^{B}}\right)\rightarrow\forall C.\left(A\rightarrow N^{F^{C}}\right)\rightarrow N^{F^{C}}\quad,\\ +\text{brun} & :\left(\left(\forall B.\left(A\rightarrow F^{B}\right)\rightarrow F^{B}\right)\rightarrow A\right)\rightarrow\left(\forall C.\left(A\rightarrow M^{F^{C}}\right)\rightarrow M^{F^{C}}\right)\rightarrow M^{A}\quad. \end{align*} \end_inset @@ -21486,11 +21483,11 @@ noprefix "false" \begin_layout Standard Show that there exist monadic morphisms between the selection -\begin_inset Formula $\left(A\Rightarrow R\right)\Rightarrow A$ +\begin_inset Formula $\left(A\rightarrow R\right)\rightarrow A$ \end_inset and the continuation -\begin_inset Formula $\left(A\Rightarrow R\right)\Rightarrow R$ +\begin_inset Formula $\left(A\rightarrow R\right)\rightarrow R$ \end_inset monads. diff --git a/sofp-src/sofp-transformers.tex b/sofp-src/sofp-transformers.tex index c87377bc4..3051046bb 100644 --- a/sofp-src/sofp-transformers.tex +++ b/sofp-src/sofp-transformers.tex @@ -11,7 +11,7 @@ \subsection{Computations within a functor context: Combining monads} Programs often need to combine monadic effects (see code) -``Effect'' $\triangleq$ what else happens in {\footnotesize{}$A\Rightarrow M^{B}$} +``Effect'' $\triangleq$ what else happens in {\footnotesize{}$A\rightarrow M^{B}$} besides computing $B$ from $A$ Examples of effects for some standard monads: @@ -57,11 +57,11 @@ \subsection{Computations within a functor context: Combining monads} \begin{lyxcode} \textcolor{blue}{\footnotesize{}~~}\textcolor{darkgray}{\footnotesize{}//~This~is~not~valid~Scala!}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}(1~to~n).flatMap~\{~i~$\Rightarrow$}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}(1~to~n).flatMap~\{~i~$\rightarrow$}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}~~~Future(q(i)).flatMap~\{~j~$\Rightarrow$}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}~~~Future(q(i)).flatMap~\{~j~$\rightarrow$}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}~~~~~maybeError(j).map~\{~k~$\Rightarrow$}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}~~~~~maybeError(j).map~\{~k~$\rightarrow$}{\footnotesize\par} \textcolor{blue}{\footnotesize{}~~~~~~~f(k)}{\footnotesize\par} @@ -98,13 +98,13 @@ \subsection{Combining monadic effects I. Trial and error} Examples and counterexamples for functor composition: -Combine $Z\Rightarrow A$ and $\text{List}^{A}$ as $Z\Rightarrow\text{List}^{A}$ +Combine $Z\rightarrow A$ and $\text{List}^{A}$ as $Z\rightarrow\text{List}^{A}$ Combine \texttt{\textcolor{blue}{\footnotesize{}Future{[}A{]}}} and \texttt{\textcolor{blue}{\footnotesize{}Option{[}A{]}}} as \texttt{\textcolor{blue}{\footnotesize{}Future{[}Option{[}A{]}{]}}} But \texttt{\textcolor{blue}{\footnotesize{}Either{[}Z, Future{[}A{]}{]}}} -and \texttt{\textcolor{blue}{\footnotesize{}Option{[}Z $\Rightarrow$ +and \texttt{\textcolor{blue}{\footnotesize{}Option{[}Z $\rightarrow$ A{]}}} are not monads Neither \texttt{\textcolor{blue}{\footnotesize{}Future{[}State{[}A{]}{]}}} @@ -155,11 +155,11 @@ \subsection{Combining monadic effects II. Lifting into a larger monad} \textrm{\textcolor{darkgray}{\footnotesize{}~//~required~``lifting''~functions:}}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}def~lift$_{1}${[}A{]}:~Seq{[}A{]}~$\Rightarrow$~BigM{[}A{]}~=~???}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}def~lift$_{1}${[}A{]}:~Seq{[}A{]}~$\rightarrow$~BigM{[}A{]}~=~???}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}def~lift$_{2}${[}A{]}:~Future{[}A{]}~$\Rightarrow$~BigM{[}A{]}~=~???}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}def~lift$_{2}${[}A{]}:~Future{[}A{]}~$\rightarrow$~BigM{[}A{]}~=~???}{\footnotesize\par} -\textcolor{blue}{\footnotesize{}def~lift$_{3}${[}A{]}:~Try{[}A{]}~$\Rightarrow$~BigM{[}A{]}~=~???~~~}{\footnotesize\par} +\textcolor{blue}{\footnotesize{}def~lift$_{3}${[}A{]}:~Try{[}A{]}~$\rightarrow$~BigM{[}A{]}~=~???~~~}{\footnotesize\par} \end{lyxcode} % \end{minipage}\texttt{\textcolor{blue}{\footnotesize{}\medskip{} @@ -169,22 +169,22 @@ \subsection{Combining monadic effects II. Lifting into a larger monad} = Future{[}Option{[}A{]}{]}}} with liftings: {\footnotesize{}\vspace{-0.4cm}}\texttt{\textcolor{blue}{\footnotesize{}def -lift$_{1}${[}A{]}: Option{[}A{]} $\Rightarrow$ Future{[}Option{[}A{]}{]} +lift$_{1}${[}A{]}: Option{[}A{]} $\rightarrow$ Future{[}Option{[}A{]}{]} = Future.successful(\_)}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}def lift$_{2}${[}A{]}: Future{[}A{]} -$\Rightarrow$ Future{[}Option{[}A{]}{]} = \_.map(x $\Rightarrow$ +$\rightarrow$ Future{[}Option{[}A{]}{]} = \_.map(x $\rightarrow$ Some(x))}}{\footnotesize\par} {\footnotesize{}\vspace{-0.15cm}}Example 2: combining as \texttt{\textcolor{blue}{\footnotesize{}BigM{[}A{]} = List{[}Try{[}A{]}{]}}} with liftings: {\footnotesize{}\vspace{-0.05cm}}\texttt{\textcolor{blue}{\footnotesize{}def -lift$_{1}${[}A{]}: Try{[}A{]} $\Rightarrow$ List{[}Try{[}A{]}{]} -= x $\Rightarrow$ List(x)}}{\footnotesize\par} +lift$_{1}${[}A{]}: Try{[}A{]} $\rightarrow$ List{[}Try{[}A{]}{]} += x $\rightarrow$ List(x)}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}def lift$_{2}${[}A{]}: List{[}A{]} -$\Rightarrow$ List{[}Try{[}A{]}{]} = \_.map(x $\Rightarrow$ Success(x))}}{\footnotesize\par} +$\rightarrow$ List{[}Try{[}A{]}{]} = \_.map(x $\rightarrow$ Success(x))}}{\footnotesize\par} {\footnotesize{}\vspace{-0.1cm}}Remains to be understood: @@ -237,8 +237,8 @@ \subsection{Laws for monad liftings I. Identity laws} lift$_{1}$(M$_{1}$.pure(x)).flatMap(b) = b(x)}} \textemdash{} in terms of Kleisli composition $\left(\diamond\right)$: \begin{center} -{\footnotesize{}\vspace{-0.2cm}\hspace{-0.0cm}$\left(\text{pure}_{M_{1}}\bef\text{lift}_{1}\right)^{:X\Rightarrow\text{BigM}^{X}}\diamond b^{:X\Rightarrow\text{BigM}^{Y}}=b$\hspace*{\fill}with -$f^{:X\Rightarrow M^{Y}}\diamond g^{:Y\Rightarrow M^{Z}}\triangleq x\Rightarrow f(x).\text{flatMap}(g)$}{\footnotesize\par} +{\footnotesize{}\vspace{-0.2cm}\hspace{-0.0cm}$\left(\text{pure}_{M_{1}}\bef\text{lift}_{1}\right)^{:X\rightarrow\text{BigM}^{X}}\diamond b^{:X\rightarrow\text{BigM}^{Y}}=b$\hspace*{\fill}with +$f^{:X\rightarrow M^{Y}}\diamond g^{:Y\rightarrow M^{Z}}\triangleq x\rightarrow f(x).\text{flatMap}(g)$}{\footnotesize\par} \par\end{center} {\footnotesize{}\vspace{-0.2cm}\hspace{-0.0cm}}Right identity law @@ -268,7 +268,7 @@ \subsection{Laws for monad liftings I. Identity laws} b.flatMap(M$_{1}$.pure andThen lift$_{1}$) = b}} \textemdash{} in terms of Kleisli composition: \begin{center} -{\footnotesize{}\vspace{-0.1cm}\hspace{-0.0cm}$b^{:X\Rightarrow\text{BigM}^{Y}}\diamond\left(\text{pure}_{M_{1}}\bef\text{lift}_{1}\right)^{:Y\Rightarrow\text{BigM}^{Y}}=b$}{\footnotesize\par} +{\footnotesize{}\vspace{-0.1cm}\hspace{-0.0cm}$b^{:X\rightarrow\text{BigM}^{Y}}\diamond\left(\text{pure}_{M_{1}}\bef\text{lift}_{1}\right)^{:Y\rightarrow\text{BigM}^{Y}}=b$}{\footnotesize\par} \par\end{center} {\footnotesize{}\vspace{-0.15cm}\hspace{-0.0cm}}The same identity @@ -321,25 +321,25 @@ \subsection{Laws for monad liftings II. Simplifying the laws} lift$_{1}$(p).flatMap(q andThen lift$_{1}$) = lift$_{1}$(p flatMap q)}}{\footnotesize\par} -Rewritten equivalently through {\footnotesize{}$\text{flm}_{M}:\left(A\Rightarrow M^{B}\right)\Rightarrow M^{A}\Rightarrow M^{B}$} +Rewritten equivalently through {\footnotesize{}$\text{flm}_{M}:\left(A\rightarrow M^{B}\right)\rightarrow M^{A}\rightarrow M^{B}$} as \begin{center} {\footnotesize{}\vspace{-0.2cm}\hspace{-0.0cm}$\text{lift}_{1}\bef\text{flm}_{\text{BigM}}\left(q\bef\text{lift}_{1}\right)=\text{flm}_{M_{1}}q\bef\text{lift}_{1}$ -\textendash{} both sides are functions $M_{1}^{A}\Rightarrow\text{BigM}^{B}$}{\footnotesize\par} +\textendash{} both sides are functions $M_{1}^{A}\rightarrow\text{BigM}^{B}$}{\footnotesize\par} \par\end{center} {\footnotesize{}\vspace{-0.3cm}\hspace{-0.0cm}}Rewritten equivalently -through {\footnotesize{}$\text{ftn}_{M}:M^{M^{A}}\Rightarrow M^{A}$,} +through {\footnotesize{}$\text{ftn}_{M}:M^{M^{A}}\rightarrow M^{A}$,} the law is \begin{center} {\footnotesize{}\vspace{-0.2cm}\hspace{-0.0cm}$\text{lift}_{1}\bef\text{fmap}_{\text{BigM}}\text{lift}_{1}\bef\text{ftn}_{\text{BigM}}=\text{ftn}_{M_{1}}\bef\text{lift}_{1}$ -\textendash{} both sides are functions $M_{1}^{M_{1}^{A}}\Rightarrow\text{BigM}^{A}$}{\footnotesize\par} +\textendash{} both sides are functions $M_{1}^{M_{1}^{A}}\rightarrow\text{BigM}^{A}$}{\footnotesize\par} \par\end{center} {\footnotesize{}\vspace{-0.3cm}\hspace{-0.0cm}}In terms of Kleisli composition $\diamond_{M}$ it becomes the \textbf{composition law}: \begin{center} -{\footnotesize{}\vspace{-0.2cm}\hspace{-0.0cm}$\big(b^{:X\Rightarrow M_{1}^{Y}}\bef\text{lift}_{1}\big)\diamond_{\text{BigM}}\big(c^{:Y\Rightarrow M_{1}^{Z}}\bef\text{lift}_{1}\big)=\left(b\diamond_{M_{1}}c\right)\bef\text{lift}_{1}$}{\footnotesize\par} +{\footnotesize{}\vspace{-0.2cm}\hspace{-0.0cm}$\big(b^{:X\rightarrow M_{1}^{Y}}\bef\text{lift}_{1}\big)\diamond_{\text{BigM}}\big(c^{:Y\rightarrow M_{1}^{Z}}\bef\text{lift}_{1}\big)=\left(b\diamond_{M_{1}}c\right)\bef\text{lift}_{1}$}{\footnotesize\par} \par\end{center} {\footnotesize{}\vspace{-0.3cm}\hspace{-0.0cm}}Liftings $\text{lift}_{1}$ @@ -351,7 +351,7 @@ \subsection{Laws for monad liftings II. Simplifying the laws} \subsection{Laws for monad liftings III. The naturality law} -Show that $\text{lift}_{1}:M_{1}^{A}\Rightarrow\text{BigM}^{A}$ is +Show that $\text{lift}_{1}:M_{1}^{A}\rightarrow\text{BigM}^{A}$ is a natural transformation It maps $\text{pure}_{M_{1}}$ to $\text{pure}_{\text{BigM}}$ and @@ -360,16 +360,16 @@ \subsection{Laws for monad liftings III. The naturality law} $\text{lift}_{1}$ is a \textbf{monadic morphism} between monads $M_{1}^{\bullet}$ and $\text{BigM}^{\bullet}$ -example: monad ``interpreters'' $M^{A}\Rightarrow N^{A}$ are monadic +example: monad ``interpreters'' $M^{A}\rightarrow N^{A}$ are monadic morphisms -The (functor) naturality law: for any $f:X\Rightarrow Y$, {\footnotesize{}\vspace{-0.1cm}} +The (functor) naturality law: for any $f:X\rightarrow Y$, {\footnotesize{}\vspace{-0.1cm}} \[ \text{lift}_{1}\bef\text{fmap}_{\text{BigM}}f=\text{fmap}_{M_{1}}f\bef\text{lift}_{1} \] {\footnotesize{}\vspace{-0.5cm} \[ -\xymatrix{\xyScaleY{2pc}\xyScaleX{3pc}M_{1}^{X}\ar[d]\sb(0.45){\text{fmap}_{M_{1}}\,f^{:X\Rightarrow Y}}\ar[r]\sp(0.45){\ \text{lift}_{1}} & \text{BigM}^{X}\ar[d]\sp(0.45){\text{fmap}_{\text{BigM}}\,f^{:X\Rightarrow Y}}\\ +\xymatrix{\xyScaleY{2pc}\xyScaleX{3pc}M_{1}^{X}\ar[d]\sb(0.45){\text{fmap}_{M_{1}}\,f^{:X\rightarrow Y}}\ar[r]\sp(0.45){\ \text{lift}_{1}} & \text{BigM}^{X}\ar[d]\sp(0.45){\text{fmap}_{\text{BigM}}\,f^{:X\rightarrow Y}}\\ M_{1}^{Y}\ar[r]\sp(0.45){\text{lift}_{1}} & \text{BigM}^{Y} } \] @@ -378,7 +378,7 @@ \subsection{Laws for monad liftings III. The naturality law} Express $\text{fmap}$ as $\text{fmap}_{M}f\triangleq f^{\uparrow M}=\text{flm}_{M}\left(f\bef\text{pure}_{M}\right)$ for both monads -Given $f^{:X\Rightarrow Y}$, use the law {\footnotesize{}$\text{flm}_{M_{1}}q\bef\text{lift}_{1}=\text{lift}_{1}\bef\text{flm}_{\text{BigM}}\left(q\bef\text{lift}_{1}\right)$} +Given $f^{:X\rightarrow Y}$, use the law {\footnotesize{}$\text{flm}_{M_{1}}q\bef\text{lift}_{1}=\text{lift}_{1}\bef\text{flm}_{\text{BigM}}\left(q\bef\text{lift}_{1}\right)$} to compute {\footnotesize{}$\text{flm}_{M_{1}}\left(f\bef\text{pure}_{M_{1}}\right)\bef\text{lift}_{1}=\text{lift}_{1}\bef\text{flm}_{\text{BigM}}\left(f\bef\text{pure}_{M_{1}}\bef\text{lift}_{1}\right)=\text{lift}_{1}\bef\text{flm}_{\text{BigM}}\left(f\bef\text{pure}_{\text{BigM}}\right)=\text{lift}_{1}\bef\text{fmap}_{\text{BigM}}f$}{\footnotesize\par} A monadic morphism is always also a natural transformation of the @@ -387,15 +387,15 @@ \subsection{Laws for monad liftings III. The naturality law} \subsection{Monad transformers I: Motivation} -{\footnotesize{}\vspace{-0.2cm}}Combine $Z\Rightarrow A$ and $1+A$: -only $Z\Rightarrow1+A$ works, not $1+\left(Z\Rightarrow A\right)$ +{\footnotesize{}\vspace{-0.2cm}}Combine $Z\rightarrow A$ and $1+A$: +only $Z\rightarrow1+A$ works, not $1+\left(Z\rightarrow A\right)$ It is not possible to combine monads via a natural bifunctor $B^{M_{1},M_{2}}$ It is not possible to combine arbitrary monads as $M_{1}^{M_{2}^{\bullet}}$ or $M_{2}^{M_{1}^{\bullet}}$ -Example: state monad $\text{St}_{S}^{A}\triangleq S\Rightarrow A\times S$ +Example: state monad $\text{St}_{S}^{A}\triangleq S\rightarrow A\times S$ does not compose The trick: for a fixed \textbf{base }monad $L^{\bullet}$, let $M^{\bullet}$ @@ -460,20 +460,20 @@ \subsection{Monad transformers II: The requirements} For any monad $N^{\bullet}$ and a monadic morphism $f:M^{\bullet}\leadsto N^{\bullet}$ we need to have a monadic morphism $T_{L}^{M,\bullet}\leadsto T_{L}^{N,\bullet}$ -for the transformed monads: $\text{mrun}_{L}^{M}:\left(M^{\bullet}\leadsto N^{\bullet}\right)\Rightarrow T_{L}^{M,\bullet}\leadsto T_{L}^{N,\bullet}$ +for the transformed monads: $\text{mrun}_{L}^{M}:\left(M^{\bullet}\leadsto N^{\bullet}\right)\rightarrow T_{L}^{M,\bullet}\leadsto T_{L}^{N,\bullet}$ with the ``lifting'' laws If we implement $T_{L}^{M,\bullet}$ only via $M$'s monad methods, naturality will hold -Cf.~\texttt{\textcolor{blue}{\footnotesize{}traverse}}{\small{}$:L^{A}\Rightarrow(A\Rightarrow F^{B})\Rightarrow F^{L^{B}}$ +Cf.~\texttt{\textcolor{blue}{\footnotesize{}traverse}}{\small{}$:L^{A}\rightarrow(A\rightarrow F^{B})\rightarrow F^{L^{B}}$ \textendash{} natural w.r.t.~applicative $F^{\bullet}$}{\small\par} This can be used for lifting a ``runner'' $M^{A}\leadsto A$ to $T_{L}^{M,\bullet}\leadsto T_{L}^{\text{Id},\bullet}=L^{\bullet}$ ``Base runner'': lifts $L^{A}\leadsto A$ into a monadic morphism -$T_{L}^{M,\bullet}\leadsto M^{\bullet}$; so $\text{brun}_{L}^{M}:\left(L^{\bullet}\leadsto\bullet\right)\Rightarrow T_{L}^{M,\bullet}\leadsto M^{\bullet}$, +$T_{L}^{M,\bullet}\leadsto M^{\bullet}$; so $\text{brun}_{L}^{M}:\left(L^{\bullet}\leadsto\bullet\right)\rightarrow T_{L}^{M,\bullet}\leadsto M^{\bullet}$, must commute with \texttt{\textcolor{blue}{\footnotesize{}lift}} and \texttt{\textcolor{blue}{\footnotesize{}blift}} @@ -482,7 +482,7 @@ \subsection{Monad transformers III: First examples} {\footnotesize{}\vspace{-0.15cm}}Recall these monad constructions: -If $M^{A}$ is a monad then $R\Rightarrow M^{A}$ is also a monad +If $M^{A}$ is a monad then $R\rightarrow M^{A}$ is also a monad (for a fixed type $R$) If $M^{A}$ is a monad then $M^{Z+A\times W}$ is also a monad (for @@ -492,7 +492,7 @@ \subsection{Monad transformers III: First examples} \texttt{\textcolor{blue}{\footnotesize{}Writer}}, \texttt{\textcolor{blue}{\footnotesize{}Either}}: \texttt{\textcolor{blue}{\footnotesize{}type ReaderT{[}R, M{[}\_{]}, -A{]} = R $\Rightarrow$ M{[}A{]}}}{\footnotesize\par} +A{]} = R $\rightarrow$ M{[}A{]}}}{\footnotesize\par} \texttt{\textcolor{blue}{\footnotesize{}type EitherT{[}Z, M{[}\_{]}, A{]} = M{[}Either{[}Z, A{]}{]}}}{\footnotesize\par} @@ -542,7 +542,7 @@ \subsection{Monad transformers IV: The zoology of \emph{ad hoc} methods} Examples: \texttt{\textcolor{blue}{\footnotesize{}ReaderT}}; \texttt{\textcolor{blue}{\footnotesize{}SearchT}} for search monad \texttt{\textcolor{blue}{\footnotesize{}S{[}A{]} -= (A $\Rightarrow$ Z) $\Rightarrow$ A}} += (A $\rightarrow$ Z) $\rightarrow$ A}} More generally: all \textbf{rigid} monads have ``outside'' transformers @@ -556,7 +556,7 @@ \subsection{Monad transformers IV: The zoology of \emph{ad hoc} methods} Product monads $L_{1}^{A}\times L_{2}^{A}$ \textendash{} product transformer $T_{L_{1}}^{M,A}\times T_{L_{2}}^{M,A}$ -``Contrafunctor-choice'' $H^{A}\Rightarrow A$ \textendash{} composed-outside +``Contrafunctor-choice'' $H^{A}\rightarrow A$ \textendash{} composed-outside transformer Free pointed monads $A+L^{A}$ \textendash{} transformer $M^{A+T_{L}^{M,A}}$ @@ -564,11 +564,11 @@ \subsection{Monad transformers IV: The zoology of \emph{ad hoc} methods} ``Irregular'': none of the above constructions work, need something else -{\footnotesize{}$T_{\text{State}}^{M,A}=S\Rightarrow M^{S\times A}$}; -{\footnotesize{}$T_{\text{Cont}}^{M,A}=\left(A\Rightarrow M^{R}\right)\Rightarrow M^{R}$}; -``selector'' {\footnotesize{}$F^{A\Rightarrow P^{Q}}\Rightarrow P^{A}$} -\textendash{} transformer $F^{A\Rightarrow T_{P}^{M,Q}}\Rightarrow T_{P}^{M,A}$; -codensity {\footnotesize{}$\forall R.\left(A\Rightarrow M^{R}\right)\Rightarrow M^{R}$}{\footnotesize\par} +{\footnotesize{}$T_{\text{State}}^{M,A}=S\rightarrow M^{S\times A}$}; +{\footnotesize{}$T_{\text{Cont}}^{M,A}=\left(A\rightarrow M^{R}\right)\rightarrow M^{R}$}; +``selector'' {\footnotesize{}$F^{A\rightarrow P^{Q}}\rightarrow P^{A}$} +\textendash{} transformer $F^{A\rightarrow T_{P}^{M,Q}}\rightarrow T_{P}^{M,A}$; +codensity {\footnotesize{}$\forall R.\left(A\rightarrow M^{R}\right)\rightarrow M^{R}$}{\footnotesize\par} Examples of monads $K^{A}$ for which no transformers exist? (not known) @@ -595,7 +595,7 @@ \subsection{Laws of monad transformers\label{subsec:Laws-of-monad-transformers}} via a monadic isomorphism, where $\text{Id}$ is the identity monad, $\text{Id}^{A}\triangleq A$. \item \textbf{Lifting law}:\index{monad transformers!lifting law} For any -monad $M$, the function $\text{lift}:M^{A}\Rightarrow T_{L}^{M,A}$ +monad $M$, the function $\text{lift}:M^{A}\rightarrow T_{L}^{M,A}$ is a monadic morphism. (In a shorter notation, $\text{lift}:M\leadsto T_{L}^{M}$.) \item \textbf{Runner laws}:\index{monad transformers!runner laws} For any monads $M$, $N$ and any monadic morphism $\phi:M\leadsto N$, the @@ -613,7 +613,7 @@ \subsection{Laws of monad transformers\label{subsec:Laws-of-monad-transformers}} \text{mrun}\left(\text{pu}_{M}\right):T_{L}^{\text{Id}}\leadsto T_{L}^{M}=L\leadsto T_{L}^{M}. \] This function is called the \textbf{\index{monad transformers!base lifting}base -lifting}, $\text{mrun}\left(\text{pu}_{M}\right)\triangleq\text{blift}:L^{A}\Rightarrow T_{L}^{M,A}$. +lifting}, $\text{mrun}\left(\text{pu}_{M}\right)\triangleq\text{blift}:L^{A}\rightarrow T_{L}^{M,A}$. The base lifting automatically satisfies the non-degeneracy law, \[ \text{blift}\bef\text{mrun}\left(\phi^{:M\leadsto\text{Id}}\right)=\text{id}\quad, @@ -661,7 +661,7 @@ \subsection{Examples of incorrect monad transformers} So, the fake ``transformer'' satisfies almost all of the monad transformer laws! However, the identity law $T_{L}^{\text{Id}}\cong L$ and the non-degeneracy law $\text{lift}\bef\text{brun}\left(\theta\right)=\text{id}$ -are violated since $T_{L}^{\text{Id}}=\bbnum 1\not\cong L$ and $\text{lift}\bef\text{brun}\left(\theta\right)=\left(\_\Rightarrow1\right)\neq\text{id}$. +are violated since $T_{L}^{\text{Id}}=\bbnum 1\not\cong L$ and $\text{lift}\bef\text{brun}\left(\theta\right)=\left(\_\rightarrow1\right)\neq\text{id}$. For this reason, the unit monad is not a lawful monad transformer. This simple example demonstrates the importance of the monad transformer @@ -703,9 +703,9 @@ \subsection{Examples of failure to define a generic monad transformer} only in a certain order; so it cannot work as a generic monad transformer. A simple counter-example is $L^{A}\triangleq\bbnum 1+A$ and $M^{A}\triangleq A\times A$ where $M^{L^{A}}$ is a monad but $L^{M^{A}}$ is not (see Section~???). -Another counter-example is the \lstinline!State! monad, $\text{State}_{S}^{A}\triangleq S\Rightarrow S\times A$, +Another counter-example is the \lstinline!State! monad, $\text{State}_{S}^{A}\triangleq S\rightarrow S\times A$, for which we have already shown that $\bbnum 1+\text{State}_{S}^{A}$ -is not a monad and $\text{State}_{S}^{Z\Rightarrow A}$ is not a monad +is not a monad and $\text{State}_{S}^{Z\rightarrow A}$ is not a monad (see Section~???). In other words, the \lstinline!State! monad does not compose with arbitrary monads $M$ in either order. @@ -713,8 +713,8 @@ \subsection{Examples of failure to define a generic monad transformer} The functor disjunction $L^{\bullet}+M^{\bullet}$ is in general not a monad when $L$ and $M$ are arbitrary monads. An immediate counter-example -is found by using two \lstinline!Reader! monads, $L^{A}\triangleq R\Rightarrow A$ -and $M^{A}\triangleq S\Rightarrow A$. The disjunction $\left(R\Rightarrow A\right)+\left(S\Rightarrow A\right)$ +is found by using two \lstinline!Reader! monads, $L^{A}\triangleq R\rightarrow A$ +and $M^{A}\triangleq S\rightarrow A$. The disjunction $\left(R\rightarrow A\right)+\left(S\rightarrow A\right)$ is a functor that is not a monad (and not even applicative, see Section~???). \paragraph{Functor product} @@ -738,7 +738,7 @@ \subsection{Examples of failure to define a generic monad transformer} \[ \text{Free}^{L^{\text{Id}^{\bullet}}}\cong\text{Free}^{L^{\bullet}}\not\cong L\quad,\quad\quad\text{Free}^{L^{\bullet}+\text{Id}^{\bullet}}\not\cong L\quad, \] -and the lifting laws are also violated because $\text{lift}:M^{A}\Rightarrow\text{Free}^{L^{\bullet}+M^{\bullet},A}$ +and the lifting laws are also violated because $\text{lift}:M^{A}\rightarrow\text{Free}^{L^{\bullet}+M^{\bullet},A}$ is not a monad morphism because it maps $\text{pu}_{M}$ into a non-pure value of the free monad. Nevertheless, these constructions are not useless. Once we run the free monad into a concrete (non-free) monad, @@ -750,61 +750,61 @@ \subsection{Examples of failure to define a generic monad transformer} The construction called ``\textbf{monoidal convolution\index{monoidal convolution}}'' defines a new functor $L\star M$ via \begin{equation} -\left(L\star M\right)^{A}\triangleq\exists P\exists Q.\left(P\times Q\Rightarrow A\right)\times L^{P}\times M^{Q}\quad.\label{eq:definition-of-monoidal-convolution} +\left(L\star M\right)^{A}\triangleq\exists P\exists Q.\left(P\times Q\rightarrow A\right)\times L^{P}\times M^{Q}\quad.\label{eq:definition-of-monoidal-convolution} \end{equation} This formula can be seen as a combination of the co-Yoneda identities \[ -L^{A}\cong\exists P.L^{P}\times\left(P\Rightarrow A\right)\quad,\quad\quad M^{A}\cong\exists Q.M^{Q}\times\left(Q\Rightarrow A\right)\quad. +L^{A}\cong\exists P.L^{P}\times\left(P\rightarrow A\right)\quad,\quad\quad M^{A}\cong\exists Q.M^{Q}\times\left(Q\rightarrow A\right)\quad. \] The functor product $L\times M$ is equivalent to \begin{align} & L^{A}\times M^{A}\nonumber \\ -{\color{greenunder}\text{co-Yoneda identities for }L^{A}\text{ and }M^{A}:}\quad & \cong\exists P.L^{P}\times\gunderline{\left(P\Rightarrow A\right)}\times\exists Q.M^{Q}\times\gunderline{\left(Q\Rightarrow A\right)}\nonumber \\ -{\color{greenunder}\text{equivalence in Eq.~(\ref{eq:equivalence-pq-a-for-monoidal-convolution})}:}\quad & \cong\exists P.\exists Q.L^{P}\times M^{Q}\times\left(P+Q\Rightarrow A\right)\label{eq:product-l-m-for-monoidal-convolution} +{\color{greenunder}\text{co-Yoneda identities for }L^{A}\text{ and }M^{A}:}\quad & \cong\exists P.L^{P}\times\gunderline{\left(P\rightarrow A\right)}\times\exists Q.M^{Q}\times\gunderline{\left(Q\rightarrow A\right)}\nonumber \\ +{\color{greenunder}\text{equivalence in Eq.~(\ref{eq:equivalence-pq-a-for-monoidal-convolution})}:}\quad & \cong\exists P.\exists Q.L^{P}\times M^{Q}\times\left(P+Q\rightarrow A\right)\label{eq:product-l-m-for-monoidal-convolution} \end{align} where we used the type equivalence \begin{equation} -\left(P\Rightarrow A\right)\times\left(Q\Rightarrow A\right)\cong P+Q\Rightarrow A\quad.\label{eq:equivalence-pq-a-for-monoidal-convolution} +\left(P\rightarrow A\right)\times\left(Q\rightarrow A\right)\cong P+Q\rightarrow A\quad.\label{eq:equivalence-pq-a-for-monoidal-convolution} \end{equation} -If we (arbitrarily) replace $P+Q\Rightarrow A$ by $P\times Q\Rightarrow A$ +If we (arbitrarily) replace $P+Q\rightarrow A$ by $P\times Q\rightarrow A$ in Eq.~(\ref{eq:product-l-m-for-monoidal-convolution}), we will obtain Eq.~(\ref{eq:definition-of-monoidal-convolution}). The monoidal convolution $L\star M$ always produces a functor since Eq.~(\ref{eq:definition-of-monoidal-convolution}) is covariant in $A$. An example where the monoidal convolution fails to produce a -monad transformer is $L^{A}\triangleq1+A$ and $M^{A}\triangleq R\Rightarrow A$. +monad transformer is $L^{A}\triangleq1+A$ and $M^{A}\triangleq R\rightarrow A$. We compute the functor $L\star M$ and establish that it is not a monad: \begin{align*} & \left(L\star M\right)^{A}\\ -{\color{greenunder}\text{definitions of }L,M,\star:}\quad & \cong\exists P\exists Q.\gunderline{\left(P\times Q\Rightarrow A\right)}\times\left(\bbnum 1+P\right)\times\left(R\Rightarrow Q\right)\\ -{\color{greenunder}\text{curry the arguments, move quantifier}:}\quad & \cong\exists P.\left(\bbnum 1+P\right)\times\gunderline{\exists Q.\left(Q\Rightarrow P\Rightarrow A\right)\times\left(R\Rightarrow Q\right)}\\ -{\color{greenunder}\text{co-Yoneda identity with }\exists Q:}\quad & \cong\exists P.\left(\bbnum 1+P\right)\times\left(\gunderline{R\Rightarrow P}\Rightarrow A\right)\\ -{\color{greenunder}\text{swap curried arguments}:}\quad & \cong\exists P.\left(\bbnum 1+P\right)\times\left(P\Rightarrow R\Rightarrow A\right)\\ -{\color{greenunder}\text{co-Yoneda identity with }\exists P:}\quad & \cong\bbnum 1+\left(R\Rightarrow A\right)\quad. +{\color{greenunder}\text{definitions of }L,M,\star:}\quad & \cong\exists P\exists Q.\gunderline{\left(P\times Q\rightarrow A\right)}\times\left(\bbnum 1+P\right)\times\left(R\rightarrow Q\right)\\ +{\color{greenunder}\text{curry the arguments, move quantifier}:}\quad & \cong\exists P.\left(\bbnum 1+P\right)\times\gunderline{\exists Q.\left(Q\rightarrow P\rightarrow A\right)\times\left(R\rightarrow Q\right)}\\ +{\color{greenunder}\text{co-Yoneda identity with }\exists Q:}\quad & \cong\exists P.\left(\bbnum 1+P\right)\times\left(\gunderline{R\rightarrow P}\rightarrow A\right)\\ +{\color{greenunder}\text{swap curried arguments}:}\quad & \cong\exists P.\left(\bbnum 1+P\right)\times\left(P\rightarrow R\rightarrow A\right)\\ +{\color{greenunder}\text{co-Yoneda identity with }\exists P:}\quad & \cong\bbnum 1+\left(R\rightarrow A\right)\quad. \end{align*} This functor is not a monad (see Section~???). \paragraph{Codensity tricks{*}{*}{*}} \begin{itemize} -\item codensity monad over $L^{M^{\bullet}}$: $F^{A}\triangleq\forall B.\,\big(A\Rightarrow L^{M^{B}}\big)\Rightarrow L^{M^{B}}$ +\item codensity monad over $L^{M^{\bullet}}$: $F^{A}\triangleq\forall B.\,\big(A\rightarrow L^{M^{B}}\big)\rightarrow L^{M^{B}}$ \textendash{} no lift -\item Codensity-$L$ transformer: $\text{Cod}_{L}^{M,A}\triangleq\forall B.\left(A\Rightarrow L^{B}\right)\Rightarrow L^{M^{B}}$ +\item Codensity-$L$ transformer: $\text{Cod}_{L}^{M,A}\triangleq\forall B.\left(A\rightarrow L^{B}\right)\rightarrow L^{M^{B}}$ \textendash{} no lift \begin{itemize} -\item applies the continuation transformer to $M^{A}\cong\forall B.\left(A\Rightarrow B\right)\Rightarrow M^{B}$ +\item applies the continuation transformer to $M^{A}\cong\forall B.\left(A\rightarrow B\right)\rightarrow M^{B}$ \end{itemize} -\item Codensity composition: $F^{A}\triangleq\forall B.\left(M^{A}\Rightarrow L^{B}\right)\Rightarrow L^{B}$ +\item Codensity composition: $F^{A}\triangleq\forall B.\left(M^{A}\rightarrow L^{B}\right)\rightarrow L^{B}$ \textendash{} not a monad \begin{itemize} -\item Counterexample: $M^{A}\triangleq R\Rightarrow A$ and $L^{A}\triangleq S\Rightarrow A$ +\item Counterexample: $M^{A}\triangleq R\rightarrow A$ and $L^{A}\triangleq S\rightarrow A$ \end{itemize} \end{itemize} \subsection{Properties of monadic morphisms} -A natural transformation $\phi^{A}:M^{A}\Rightarrow N^{A}$, equivalently +A natural transformation $\phi^{A}:M^{A}\rightarrow N^{A}$, equivalently written as $\phi:M^{\bullet}\leadsto N^{\bullet}$, is called a \textbf{monadic morphism}\index{monadic morphism} between monads $M$ and $N$ if the following two laws hold: @@ -816,7 +816,7 @@ \subsection{Properties of monadic morphisms} \subsubsection{Statement \label{subsec:Statement-pure-M-is-monadic-morphism}\ref{subsec:Statement-pure-M-is-monadic-morphism}} -For any monad $M$, the method $\text{pu}_{M}:A\Rightarrow M^{A}$ +For any monad $M$, the method $\text{pu}_{M}:A\rightarrow M^{A}$ is a monadic morphism $\text{pu}_{M}:\text{Id}\leadsto M$ between the identity monad and $M$. @@ -841,21 +841,21 @@ \subsubsection{Exercise \label{subsec:Exercise-fmap-is-not-monadic-morphism}\ref $m:M^{Z}$ is given. \textbf{(a)} Consider the function $f$ defined as \begin{align*} - & f:\left(Z\Rightarrow A\right)\Rightarrow M^{A}\quad,\\ - & f\left(q^{:Z\Rightarrow A}\right)\triangleq q^{\uparrow M}m\quad. + & f:\left(Z\rightarrow A\right)\rightarrow M^{A}\quad,\\ + & f\left(q^{:Z\rightarrow A}\right)\triangleq q^{\uparrow M}m\quad. \end{align*} Prove that $f$ is \emph{not} a monadic morphism from the reader monad -$R^{A}\triangleq Z\Rightarrow A$ to the monad $M$, despite having +$R^{A}\triangleq Z\rightarrow A$ to the monad $M$, despite having the correct type signature. \textbf{(b)} Under the same assumptions, consider the function $\phi$ defined as \begin{align*} - & \phi:\left(Z\Rightarrow M^{A}\right)\Rightarrow M^{A}\quad,\\ - & \phi\left(q^{:Z\Rightarrow M^{A}}\right)\triangleq\text{flm}_{M}\left(q\right)\left(m\right)\quad. + & \phi:\left(Z\rightarrow M^{A}\right)\rightarrow M^{A}\quad,\\ + & \phi\left(q^{:Z\rightarrow M^{A}}\right)\triangleq\text{flm}_{M}\left(q\right)\left(m\right)\quad. \end{align*} Show that $\phi$ is \emph{not} a monadic morphism from the monad -$Q^{A}\triangleq Z\Rightarrow M^{A}$ to $M$. +$Q^{A}\triangleq Z\rightarrow M^{A}$ to $M$. \subsubsection{Statement \label{subsec:Statement-monadic-morphism-composition}\ref{subsec:Statement-monadic-morphism-composition}} @@ -883,7 +883,7 @@ \subsubsection{Statement \label{subsec:Statement-monadic-morphism-composition}\r \subsubsection{Statement \label{subsec:Statement-M-to-M-times-M-is-monadic-morphism}\ref{subsec:Statement-M-to-M-times-M-is-monadic-morphism}} -For any monad $M$, the function $\Delta:M^{A}\Rightarrow M^{A}\times M^{A}$ +For any monad $M$, the function $\Delta:M^{A}\rightarrow M^{A}\times M^{A}$ is a monadic morphism between monads $M$ and $M\times M$. \subparagraph{Proof} @@ -900,7 +900,7 @@ \subsubsection{Statement \label{subsec:Statement-M-to-M-times-M-is-monadic-morph \] we use the definition of $\text{ftn}_{M\times M}$, \[ -\text{ftn}_{M\times M}:M^{M^{\bullet}\times M^{\bullet}}\times M^{M^{\bullet}\times M^{\bullet}}\Rightarrow M^{\bullet}\times M^{\bullet}=\big(\nabla_{1}^{\uparrow M}\bef\text{ftn}_{M}\big)\boxtimes\big(\nabla_{2}^{\uparrow M}\bef\text{ftn}_{M}\big)\quad, +\text{ftn}_{M\times M}:M^{M^{\bullet}\times M^{\bullet}}\times M^{M^{\bullet}\times M^{\bullet}}\rightarrow M^{\bullet}\times M^{\bullet}=\big(\nabla_{1}^{\uparrow M}\bef\text{ftn}_{M}\big)\boxtimes\big(\nabla_{2}^{\uparrow M}\bef\text{ftn}_{M}\big)\quad, \] and compute \begin{align*} @@ -937,7 +937,7 @@ \subsubsection{Statement \label{subsec:Statement-product-of-monadic-morphisms}\r To verify the composition law for $\phi\boxtimes\chi$, we use the definitions \begin{align*} - & \text{ftn}_{K\times L}=\big(\nabla_{1}^{\uparrow K}\bef\text{ftn}_{K}\big)^{:K^{K^{\bullet}\times L^{\bullet}}\Rightarrow K^{\bullet}}\boxtimes\big(\nabla_{2}^{\uparrow L}\bef\text{ftn}_{L}\big)^{:L^{K^{\bullet}\times L^{\bullet}}\Rightarrow L^{\bullet}}\quad,\\ + & \text{ftn}_{K\times L}=\big(\nabla_{1}^{\uparrow K}\bef\text{ftn}_{K}\big)^{:K^{K^{\bullet}\times L^{\bullet}}\rightarrow K^{\bullet}}\boxtimes\big(\nabla_{2}^{\uparrow L}\bef\text{ftn}_{L}\big)^{:L^{K^{\bullet}\times L^{\bullet}}\rightarrow L^{\bullet}}\quad,\\ & \text{ftn}_{M\times N}=\big(\nabla_{1}^{\uparrow M}\bef\text{ftn}_{M}\big)\boxtimes\big(\nabla_{2}^{\uparrow N}\bef\text{ftn}_{N}\big)\quad. \end{align*} Denote $\psi\triangleq\phi\boxtimes\chi$ for brevity. The required @@ -1026,7 +1026,7 @@ \subsection{Functor composition with transformed monads} a single layer of the transformed monad $T$. In this example, we will have a natural transformation \[ -T^{M^{T^{L^{M^{L^{A}}}}}}\Rightarrow T^{A}\quad. +T^{M^{T^{L^{M^{L^{A}}}}}}\rightarrow T^{A}\quad. \] To achieve this, we first use the methods $\text{blift}$ and $\text{lift}$ to convert each layer of $L$ or $M$ to a layer of $T$, lifting @@ -1122,7 +1122,7 @@ \subsection{Stacking two monads\label{subsec:Stacking-two-monads}} We need to show that there exists a lawful lifting \[ -\text{mrun}_{R}:\left(M\leadsto N\right)\Rightarrow T_{P}^{T_{Q}^{M}}\leadsto T_{P}^{T_{Q}^{N}}\quad. +\text{mrun}_{R}:\left(M\leadsto N\right)\rightarrow T_{P}^{T_{Q}^{M}}\leadsto T_{P}^{T_{Q}^{N}}\quad. \] First, we have to define $\text{mrun}_{R}\phi$ for any given $\phi:M\leadsto N$. We use the lifting law for $T_{Q}$ to get a monadic morphism @@ -1167,12 +1167,12 @@ \subsection{Stacking two monads\label{subsec:Stacking-two-monads}} use the base runners for $T_{P}$ and $T_{Q}$. The base runner for $T_{Q}$ has the type signature \[ -\text{brun}_{Q}:\left(Q\leadsto\text{Id}\right)\Rightarrow T_{Q}^{M}\leadsto M\quad. +\text{brun}_{Q}:\left(Q\leadsto\text{Id}\right)\rightarrow T_{Q}^{M}\leadsto M\quad. \] We can apply the base runner for $T_{P}$ to $T_{Q}^{M}$ as the foreign monad, \[ -\text{brun}_{P}:\left(P\leadsto\text{Id}\right)\Rightarrow T_{P}^{T_{Q}^{M}}\leadsto T_{Q}^{M}\quad. +\text{brun}_{P}:\left(P\leadsto\text{Id}\right)\rightarrow T_{P}^{T_{Q}^{M}}\leadsto T_{Q}^{M}\quad. \] It is now clear that we could obtain a monadic morphism $T_{P}^{T_{Q}^{M}}\leadsto M$ if we had some monadic morphisms $\phi:P\leadsto\text{Id}$ and $\chi:Q\leadsto\text{Id}$, @@ -1270,7 +1270,7 @@ \section{Monad transformers via functor composition: General properties\label{se which puts the base monad $L$ \emph{inside} the monad $M$, and the \lstinline!ReaderT! transformer, \[ -L^{A}\triangleq R\Rightarrow A,\quad\quad T_{L}^{M,A}\triangleq L^{M^{A}}=R\Rightarrow M^{A}\quad, +L^{A}\triangleq R\rightarrow A,\quad\quad T_{L}^{M,A}\triangleq L^{M^{A}}=R\rightarrow M^{A}\quad, \] which puts the base monad $L$ \emph{outside} the foreign monad $M$. @@ -1304,7 +1304,7 @@ \subsection{Motivation for the \texttt{swap} function} and \texttt{}\lstinline!flatten! (short notation ``$\text{ftn}_{T}$''), with the type signatures \[ -\text{pu}_{T}:A\Rightarrow L^{M^{A}}\quad,\quad\text{ftn}_{T}:L^{M^{L^{M^{A}}}}\Rightarrow L^{M^{A}}\quad. +\text{pu}_{T}:A\rightarrow L^{M^{A}}\quad,\quad\text{ftn}_{T}:L^{M^{L^{M^{A}}}}\rightarrow L^{M^{A}}\quad. \] How can we implement these methods? \emph{All we know} about $L$ and $M$ is that they are monads with their own methods $\text{pu}_{L}$, @@ -1345,7 +1345,7 @@ \subsection{Motivation for the \texttt{swap} function} \] which is equivalently written in a more verbose notation as \[ -\text{sw}:M^{L^{A}}\Rightarrow L^{M^{A}}\quad. +\text{sw}:M^{L^{A}}\rightarrow L^{M^{A}}\quad. \] If this operation were \emph{somehow} defined for the two monads $L$ and $M$, we could implement $\text{ftn}_{T}$ by first swapping the @@ -1371,8 +1371,8 @@ \subsection{Motivation for the \texttt{swap} function} For the two kinds of transformers, the type signatures of these functions are \begin{align*} -\text{composed-inside}:\quad\text{ftn}_{T}:M^{L^{M^{L^{A}}}}\Rightarrow M^{L^{A}}\quad, & \quad\text{sw}:L^{M^{A}}\Rightarrow M^{L^{A}}\quad,\\ -\text{composed-outside}:\quad\text{ftn}_{T}:L^{M^{L^{M^{A}}}}\Rightarrow L^{M^{A}}\quad, & \quad\text{sw}:M^{L^{A}}\Rightarrow L^{M^{A}}\quad. +\text{composed-inside}:\quad\text{ftn}_{T}:M^{L^{M^{L^{A}}}}\rightarrow M^{L^{A}}\quad, & \quad\text{sw}:L^{M^{A}}\rightarrow M^{L^{A}}\quad,\\ +\text{composed-outside}:\quad\text{ftn}_{T}:L^{M^{L^{M^{A}}}}\rightarrow L^{M^{A}}\quad, & \quad\text{sw}:M^{L^{A}}\rightarrow L^{M^{A}}\quad. \end{align*} @@ -1384,7 +1384,7 @@ \subsubsection{The difference between the operations \lstinline!swap! and \lstin traversable functors. Indeed, the type signature of the sequence operation is \[ -\text{seq}:L^{F^{A}}\Rightarrow F^{L^{A}}\quad, +\text{seq}:L^{F^{A}}\rightarrow F^{L^{A}}\quad, \] where $F$ is an arbitrary applicative functor (which could be $M$, since monads are applicative functors) and $L$ is a traversable functor. @@ -1404,13 +1404,13 @@ \subsubsection{The difference between the operations \lstinline!swap! and \lstin always generic in the applicative functor $F$. % \begin{comment} \emph{This is actually confusing! Let's not do this and always write -$\text{sw}_{L}^{M}:M^{L^{A}}\Rightarrow L^{M^{A}}$} +$\text{sw}_{L}^{M}:M^{L^{A}}\rightarrow L^{M^{A}}$} To denote more clearly the monad with respect to which \lstinline!swap! is generic, we may write \begin{align*} -\text{sw}_{L}^{M}:L^{M^{A}}\Rightarrow M^{L^{A}}\quad & \text{for the composed-inside transformers,}\\ -\text{sw}_{L}^{M}:M^{L^{A}}\Rightarrow L^{M^{A}}\quad & \text{for the composed-outside transformers.} +\text{sw}_{L}^{M}:L^{M^{A}}\rightarrow M^{L^{A}}\quad & \text{for the composed-inside transformers,}\\ +\text{sw}_{L}^{M}:M^{L^{A}}\rightarrow L^{M^{A}}\quad & \text{for the composed-outside transformers.} \end{align*} The superscript $M$ in $\text{sw}_{L}^{M}$ shows that $M$ is a \emph{type parameter} in \lstinline!swap!; that is, \lstinline!swap! @@ -1435,7 +1435,7 @@ \subsection{Deriving the necessary laws for \texttt{swap}} The first law is that \texttt{}\lstinline!swap! must be a natural transformation. Since \texttt{}\lstinline!swap! has only one type -parameter, there is one naturality law: for any function $f:A\Rightarrow B$, +parameter, there is one naturality law: for any function $f:A\rightarrow B$, \begin{equation} f^{\uparrow L\uparrow M}\bef\text{sw}=\text{sw}\bef f^{\uparrow M\uparrow L}\quad.\label{eq:swap-law-0-naturality} \end{equation} @@ -1544,7 +1544,7 @@ \subsection{Deriving the necessary laws for \texttt{swap}} Let us look for such interchange laws. One possibility is to have a law involving $\text{ftn}_{M}\bef\text{sw}$, which is a function -of type $M^{M^{L^{A}}}\Rightarrow L^{M^{A}}$ or, in another notation, +of type $M^{M^{L^{A}}}\rightarrow L^{M^{A}}$ or, in another notation, $M\circ M\circ L\leadsto L\circ M$. This function first flattens the two adjacent layers of $M$, obtaining $M\circ L$, and then swaps the two remaining layers, moving the $L$ layer outside. Let us think @@ -1635,7 +1635,7 @@ \subsubsection{Theorem \label{sec:Theorem-swap-laws-to-monad-transformer-first-l If two monads $L$ and $M$ are such that there exists a function \[ -\text{sw}_{L,M}:M^{L^{A}}\Rightarrow L^{M^{A}} +\text{sw}_{L,M}:M^{L^{A}}\rightarrow L^{M^{A}} \] (called ``\lstinline!swap!''), which is a natural transformation satisfying four additional laws: @@ -1861,14 +1861,14 @@ \subsubsection{Exercise \label{par:Exercise-2-prove-compat-laws-for-T-from-swap} show that the monad $T^{\bullet}\triangleq L^{M^{\bullet}}$ satisfies two ``pure compatibility'' laws,\textbf{\index{pure compatibility laws}} \begin{align*} -{\color{greenunder}\text{inner-pure-compatibility}:}\quad & \text{ftn}_{L}=\text{pu}_{M}^{\uparrow L}\bef\text{ftn}_{T}\quad:L^{L^{M^{A}}}\Rightarrow L^{M^{A}}\quad,\\ -{\color{greenunder}\text{outer-pure-compatibility}:}\quad & \text{ftn}_{M}^{\uparrow L}=\text{pu}_{L}^{\uparrow T}\bef\text{ftn}_{T}\quad:L^{M^{M^{A}}}\Rightarrow L^{M^{A}}\quad, +{\color{greenunder}\text{inner-pure-compatibility}:}\quad & \text{ftn}_{L}=\text{pu}_{M}^{\uparrow L}\bef\text{ftn}_{T}\quad:L^{L^{M^{A}}}\rightarrow L^{M^{A}}\quad,\\ +{\color{greenunder}\text{outer-pure-compatibility}:}\quad & \text{ftn}_{M}^{\uparrow L}=\text{pu}_{L}^{\uparrow T}\bef\text{ftn}_{T}\quad:L^{M^{M^{A}}}\rightarrow L^{M^{A}}\quad, \end{align*} or, expressed equivalently through the $\text{flm}$ methods instead of $\text{ftn}$, \begin{align*} -\text{flm}_{L}f^{:A\Rightarrow L^{M^{B}}} & =\text{pure}_{M}^{\uparrow L}\bef\text{flm}_{T}f^{:A\Rightarrow L^{M^{B}}}\quad,\\ -\big(\text{flm}_{M}f^{:A\Rightarrow M^{B}}\big)^{\uparrow L} & =\text{pure}_{L}^{\uparrow T}\bef\text{flm}_{T}(f^{\uparrow L})\quad. +\text{flm}_{L}f^{:A\rightarrow L^{M^{B}}} & =\text{pure}_{M}^{\uparrow L}\bef\text{flm}_{T}f^{:A\rightarrow L^{M^{B}}}\quad,\\ +\big(\text{flm}_{M}f^{:A\rightarrow M^{B}}\big)^{\uparrow L} & =\text{pure}_{L}^{\uparrow T}\bef\text{flm}_{T}(f^{\uparrow L})\quad. \end{align*} @@ -1897,10 +1897,10 @@ \subsection{Monad transformer identity law: Proofs} \] We obtain $\text{sw}_{\text{Id},M}=\text{id}$. -Note that $\text{sw}_{L,\text{Id}}:L^{A}\Rightarrow L^{A}$ is a natural +Note that $\text{sw}_{L,\text{Id}}:L^{A}\rightarrow L^{A}$ is a natural transformation for a monad $L$, so one may heuristically expect $\text{sw}_{L,\text{Id}}$ -to be equal to the identity map (the only natural transformation $L^{A}\Rightarrow L^{A}$ -that exists for all monads $L$). Similarly, one may expect that $\text{sw}_{\text{Id},M}:M^{A}\Rightarrow M^{A}=\text{id}$ +to be equal to the identity map (the only natural transformation $L^{A}\rightarrow L^{A}$ +that exists for all monads $L$). Similarly, one may expect that $\text{sw}_{\text{Id},M}:M^{A}\rightarrow M^{A}=\text{id}$ since it is a natural transformation. But these are only heuristic expectations, while we have just shown that the properties $\text{sw}_{L,\text{Id}}=\text{id}$ and $\text{sw}_{\text{Id},M}=\text{id}$ follow from the previously @@ -1915,14 +1915,14 @@ \subsection{Monad transformer identity law: Proofs} and find that the monad $T_{L}^{\text{Id}}=\text{Id}\circ L=L$ is the same type constructor as $L$. So, the isomorphism maps between $T_{L}^{\text{Id}}$ and $L$ are simply the identity maps in both -directions, $\text{id}:T_{L}^{\text{Id},A}\Rightarrow L^{A}$ and -$\text{id}:L^{A}\Rightarrow T_{L}^{\text{Id},A}$. +directions, $\text{id}:T_{L}^{\text{Id},A}\rightarrow L^{A}$ and +$\text{id}:L^{A}\rightarrow T_{L}^{\text{Id},A}$. For composed-outside transformers $T_{L}^{M}=L\circ M$, the monad $T_{L}^{\text{Id}}=L\circ\text{Id}=L$ is again the same type constructor as $L$. The isomorphisms between $T_{L}^{\text{Id}}$ and $L$ are -again the identity maps in both directions, $\text{id}:T_{L}^{\text{Id},A}\Rightarrow L^{A}$ -and $\text{id}:L^{A}\Rightarrow T_{L}^{\text{Id},A}$. +again the identity maps in both directions, $\text{id}:T_{L}^{\text{Id},A}\rightarrow L^{A}$ +and $\text{id}:L^{A}\rightarrow T_{L}^{\text{Id},A}$. We have found the isomorphism maps between $T_{L}^{\text{Id}}$ and $L$. However, we still need to verify that the monad structure of @@ -1934,7 +1934,7 @@ \subsection{Monad transformer identity law: Proofs} for the monad $T_{L}^{\text{Id}}$ are \emph{the same functions} as the given methods $\text{pu}_{L}$ and $\text{ftn}_{L}$ of the monad $L$. If the monad's methods are the same functions, i.e.~$\text{pu}_{L}=\text{pu}_{T}$ -and $\text{ftn}_{L}=\text{ftn}_{T}$, then the identity map $\text{id}:T^{A}\Rightarrow L^{A}$ +and $\text{ftn}_{L}=\text{ftn}_{T}$, then the identity map $\text{id}:T^{A}\rightarrow L^{A}$ will satisfy the laws of the monadic morphism, \[ \text{pu}_{T}\bef\text{id}=\text{pu}_{L}\quad,\quad\quad\text{ftn}_{T}\bef\text{id}=\text{id}^{\uparrow T}\bef\text{id}\bef\text{ftn}_{L}\quad. @@ -1997,8 +1997,8 @@ \subsection{Monad transformer lifting laws: Proofs} The lifting morphisms of a compositional monad transformer are defined by \begin{align*} -\text{lift} & =\text{pu}_{L}:M^{A}\Rightarrow L^{M^{A}}\quad,\\ -\text{blift} & =\text{pu}_{M}^{\uparrow L}:L^{A}\Rightarrow L^{M^{A}}\quad. +\text{lift} & =\text{pu}_{L}:M^{A}\rightarrow L^{M^{A}}\quad,\\ +\text{blift} & =\text{pu}_{M}^{\uparrow L}:L^{A}\rightarrow L^{M^{A}}\quad. \end{align*} Their laws of liftings (the identity and the composition laws) are \begin{align*} @@ -2304,7 +2304,7 @@ \subsection{Definitions of \texttt{swap} and \texttt{flatten}} is $T_{M}^{L,A}=L^{M^{A}}$, we will implement a suitable \lstinline!swap! function having the type signature \[ -\text{sw}_{N,M}:M^{L^{A}}\Rightarrow L^{M^{A}}\quad, +\text{sw}_{N,M}:M^{L^{A}}\rightarrow L^{M^{A}}\quad, \] for the base monad $M^{A}\triangleq P+Q\times A$ and an arbitrary foreign monad $L$. We will then prove that \lstinline!swap! satisfies @@ -2315,19 +2315,19 @@ \subsection{Definitions of \texttt{swap} and \texttt{flatten}} Expanding the definition of the type constructor $M^{\bullet}$, we can write the type signature of the \lstinline!swap! function as \[ -\text{sw}_{L,M}:P+Q\times L^{A}\Rightarrow L^{P+Q\times A}\quad. +\text{sw}_{L,M}:P+Q\times L^{A}\rightarrow L^{P+Q\times A}\quad. \] We can map $P$ to $L^{P}$ by applying $\text{pu}_{L}$. We can also -map $Q\times L^{A}\Rightarrow L^{Q\times A}$ since $L$ is a functor, +map $Q\times L^{A}\rightarrow L^{Q\times A}$ since $L$ is a functor, \[ -q\times l\Rightarrow\left(a\Rightarrow q\times a\right)^{\uparrow L}l\quad. +q\times l\rightarrow\left(a\rightarrow q\times a\right)^{\uparrow L}l\quad. \] It remains to unite these two functions. In the matrix notation, we write \begin{equation} \text{sw}_{L,M}=\begin{array}{|c||c|} -P & (x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ -Q\times L^{A} & q\times l\Rightarrow(a^{:A}\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l +P & (x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ +Q\times L^{A} & q\times l\rightarrow(a^{:A}\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l \end{array}\quad.\label{eq:single-valued-monad-def-of-swap} \end{equation} In Scala, the code is @@ -2358,20 +2358,20 @@ \subsection{Definitions of \texttt{swap} and \texttt{flatten}} need to use the code for the methods $\text{fmap}_{M}$, $\text{ftn}_{M}$, and $\text{pu}_{M}$ of the monad $M$: \begin{align*} -\text{fmap}_{M}f^{:A\Rightarrow B} & =f^{\uparrow M}=\begin{array}{|c||cc|} +\text{fmap}_{M}f^{:A\rightarrow B} & =f^{\uparrow M}=\begin{array}{|c||cc|} & P & Q\times B\\ \hline P & \text{id} & \bbnum 0\\ -Q\times A & \bbnum 0\enskip & q\times a\Rightarrow q\times f(a) +Q\times A & \bbnum 0\enskip & q\times a\rightarrow q\times f(a) \end{array}\quad,\\ \text{pu}_{M}a^{:A} & =0^{:P}+q_{0}\times a\quad,\quad\quad\text{pu}_{M}=\begin{array}{|c||cc|} & P & Q\times A\\ -\hline A & \bbnum 0\enskip & a\Rightarrow q_{0}\times a +\hline A & \bbnum 0\enskip & a\rightarrow q_{0}\times a \end{array}\quad,\\ -\text{ftn}_{M}^{:M^{M^{A}}\Rightarrow M^{A}} & =\begin{array}{|c||cc|} +\text{ftn}_{M}^{:M^{M^{A}}\rightarrow M^{A}} & =\begin{array}{|c||cc|} & P & Q\times A\\ \hline P & \text{id} & \bbnum 0\\ -Q\times P & q\times p\Rightarrow p & \bbnum 0\\ -Q\times Q\times A & \bbnum 0 & q_{1}\times q_{2}\times a\Rightarrow\left(q_{1}\oplus q_{2}\right)\times a +Q\times P & q\times p\rightarrow p & \bbnum 0\\ +Q\times Q\times A & \bbnum 0 & q_{1}\times q_{2}\times a\rightarrow\left(q_{1}\oplus q_{2}\right)\times a \end{array}\quad. \end{align*} @@ -2387,18 +2387,18 @@ \subsection{Laws of \texttt{swap}} \begin{align*} \text{pu}_{L}^{\uparrow M}\bef\text{sw}= & \left\Vert \begin{array}{cc} \text{id} & \bbnum 0\\ -\bbnum 0 & q\times a\Rightarrow q\times\text{pu}_{L}a +\bbnum 0 & q\times a\rightarrow q\times\text{pu}_{L}a \end{array}\right|\bef\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ -q\times l\Rightarrow(x^{:A}\Rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ +q\times l\rightarrow(x^{:A}\rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}l \end{array}\right|\\ {\color{greenunder}\text{composition}:}\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ -q\times a\Rightarrow\gunderline{(a^{:A}\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\left(\text{pu}_{L}a\right)} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ +q\times a\rightarrow\gunderline{(a^{:A}\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\left(\text{pu}_{L}a\right)} \end{array}\right|\\ {\color{greenunder}\text{pu}_{L}\text{'s naturality}:}\quad & =\begin{array}{|c||c|} -P & x^{:P}\Rightarrow\text{pu}_{L}(x+\bbnum 0^{:Q\times A})\\ -Q\times A & q\times a\Rightarrow\text{pu}_{L}(\bbnum 0^{:P}+q\times a) +P & x^{:P}\rightarrow\text{pu}_{L}(x+\bbnum 0^{:Q\times A})\\ +Q\times A & q\times a\rightarrow\text{pu}_{L}(\bbnum 0^{:P}+q\times a) \end{array}\\ {\color{greenunder}\text{matrix notation}:}\quad & =\text{pu}_{L}\quad. \end{align*} @@ -2409,12 +2409,12 @@ \subsection{Laws of \texttt{swap}} We need to show that $\text{pu}_{M}\bef\text{sw}=\text{pu}_{M}^{\uparrow L}$: \begin{align*} \text{pu}_{M}\bef\text{sw} & =\left\Vert \begin{array}{cc} -\bbnum 0 & l^{:L^{A}}\Rightarrow q_{0}\times l\end{array}\right|\bef\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ -q\times l\Rightarrow(x^{:A}\Rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}l +\bbnum 0 & l^{:L^{A}}\rightarrow q_{0}\times l\end{array}\right|\bef\left\Vert \begin{array}{c} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ +q\times l\rightarrow(x^{:A}\rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}l \end{array}\right|\\ -{\color{greenunder}\text{composition}:}\quad & =l^{:L^{A}}\Rightarrow(x^{:A}\Rightarrow\bbnum 0^{:P}+q_{0}\times x)^{\uparrow L}l\\ -{\color{greenunder}\text{definition of }\text{pu}_{M}:}\quad & =l\Rightarrow\text{pu}_{M}^{\uparrow L}l=\text{pu}_{M}\quad. +{\color{greenunder}\text{composition}:}\quad & =l^{:L^{A}}\rightarrow(x^{:A}\rightarrow\bbnum 0^{:P}+q_{0}\times x)^{\uparrow L}l\\ +{\color{greenunder}\text{definition of }\text{pu}_{M}:}\quad & =l\rightarrow\text{pu}_{M}^{\uparrow L}l=\text{pu}_{M}\quad. \end{align*} @@ -2424,53 +2424,53 @@ \subsection{Laws of \texttt{swap}} \begin{align} \text{ftn}_{L}^{\uparrow M}\bef\text{sw}= & \left\Vert \begin{array}{cc} \text{id} & \bbnum 0\\ -\bbnum 0 & q\times l\Rightarrow q\times\text{ftn}_{L}l +\bbnum 0 & q\times l\rightarrow q\times\text{ftn}_{L}l \end{array}\right|\bef\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ -q\times l\Rightarrow(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ +q\times l\rightarrow(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l \end{array}\right|\nonumber \\ & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ -q\times l\Rightarrow(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}(\text{ftn}_{L}l) +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ +q\times l\rightarrow(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}(\text{ftn}_{L}l) \end{array}\right|\quad,\label{eq:l-interchange-simplify-1}\\ \text{sw}\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L}= & \left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ -q\times l\Rightarrow(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ +q\times l\rightarrow(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l \end{array}\right|\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L}\nonumber \\ & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L}\\ -\big(q\times l\Rightarrow(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l\big)\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L}\\ +\big(q\times l\rightarrow(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l\big)\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L} \end{array}\right|\quad.\nonumber \end{align} It is quicker to simplify each expression in the last column separately and then to compare with the column in Eq.~(\ref{eq:l-interchange-simplify-1}). Simplify the upper expression: \begin{align*} - & (x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\gunderline{\text{pu}_{L}\bef\text{sw}^{\uparrow L}}\bef\text{ftn}_{L}\\ -{\color{greenunder}\text{naturality of }\text{pu}_{L}:}\quad & =(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{sw}\bef\gunderline{\text{pu}_{L}\bef\text{ftn}_{L}}\\ -{\color{greenunder}\text{identity law of }L:}\quad & =\gunderline{(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{sw}}\\ -{\color{greenunder}\text{definition of }\text{sw}:}\quad & =(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\quad. + & (x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\gunderline{\text{pu}_{L}\bef\text{sw}^{\uparrow L}}\bef\text{ftn}_{L}\\ +{\color{greenunder}\text{naturality of }\text{pu}_{L}:}\quad & =(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{sw}\bef\gunderline{\text{pu}_{L}\bef\text{ftn}_{L}}\\ +{\color{greenunder}\text{identity law of }L:}\quad & =\gunderline{(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{sw}}\\ +{\color{greenunder}\text{definition of }\text{sw}:}\quad & =(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\quad. \end{align*} This equals the upper expression in Eq.~(\ref{eq:l-interchange-simplify-1}). Simplify the lower expression; \begin{align} - & \big(q\times l\Rightarrow\gunderline{(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l}\big)\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L}\nonumber \\ -{\color{greenunder}\text{definition of }\triangleright:}\quad & =q\times l\Rightarrow l\triangleright(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L}\quad.\label{eq:l-interchange-simplify-2} + & \big(q\times l\rightarrow\gunderline{(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l}\big)\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L}\nonumber \\ +{\color{greenunder}\text{definition of }\triangleright:}\quad & =q\times l\rightarrow l\triangleright(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\text{sw}^{\uparrow L}\bef\text{ftn}_{L}\quad.\label{eq:l-interchange-simplify-2} \end{align} -Simplify the expression $(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\text{sw}^{\uparrow L}$ +Simplify the expression $(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\text{sw}^{\uparrow L}$ separately: \begin{align} - & (a\Rightarrow\bbnum 0^{:P}+q\times a)\bef\text{sw}\nonumber \\ -{\color{greenunder}\text{composition}:}\quad & =a\Rightarrow\gunderline{\text{sw}\,(\bbnum 0^{:P}+q\times a)}\nonumber \\ -{\color{greenunder}\text{definition of }\text{sw}:}\quad & =\gunderline{a\Rightarrow a\triangleright(}x\Rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}\nonumber \\ -{\color{greenunder}\text{omit argument}:}\quad & =(x\Rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}\quad.\label{eq:l-interchange-simplify-3} + & (a\rightarrow\bbnum 0^{:P}+q\times a)\bef\text{sw}\nonumber \\ +{\color{greenunder}\text{composition}:}\quad & =a\rightarrow\gunderline{\text{sw}\,(\bbnum 0^{:P}+q\times a)}\nonumber \\ +{\color{greenunder}\text{definition of }\text{sw}:}\quad & =\gunderline{a\rightarrow a\triangleright(}x\rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}\nonumber \\ +{\color{greenunder}\text{omit argument}:}\quad & =(x\rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}\quad.\label{eq:l-interchange-simplify-3} \end{align} Then we continue simplifying Eq.~(\ref{eq:l-interchange-simplify-2}): \begin{align*} - & q\times l\Rightarrow l\triangleright\gunderline{(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\text{sw}^{\uparrow L}}\bef\text{ftn}_{L}\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:l-interchange-simplify-3})}:}\quad & =q\times l\Rightarrow l\triangleright\gunderline{(x\Rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L\uparrow L}\bef\text{ftn}_{L}}\\ -{\color{greenunder}\text{naturality of }\text{ftn}_{L}:}\quad & =q\times l\Rightarrow\gunderline{l\triangleright\text{ftn}_{L}}\bef(x\Rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}\\ -{\color{greenunder}\text{definition of }\triangleright:}\quad & =q\times l\Rightarrow(x\Rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}(\text{ftn}_{L}l)\quad. + & q\times l\rightarrow l\triangleright\gunderline{(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\text{sw}^{\uparrow L}}\bef\text{ftn}_{L}\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:l-interchange-simplify-3})}:}\quad & =q\times l\rightarrow l\triangleright\gunderline{(x\rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L\uparrow L}\bef\text{ftn}_{L}}\\ +{\color{greenunder}\text{naturality of }\text{ftn}_{L}:}\quad & =q\times l\rightarrow\gunderline{l\triangleright\text{ftn}_{L}}\bef(x\rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}\\ +{\color{greenunder}\text{definition of }\triangleright:}\quad & =q\times l\rightarrow(x\rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}(\text{ftn}_{L}l)\quad. \end{align*} This equals the lower expression in Eq.~(\ref{eq:l-interchange-simplify-1}) after renaming $x$ to $a$. @@ -2484,16 +2484,16 @@ \subsection{Laws of \texttt{swap}} & \text{ftn}_{M}\bef\text{sw}\nonumber \\ & =\left\Vert \begin{array}{cc} \text{id} & \bbnum 0\\ -q\times p\Rightarrow p & \bbnum 0\\ -\bbnum 0 & q_{1}\times q_{2}\times a\Rightarrow\left(q_{1}\oplus q_{2}\right)\times a +q\times p\rightarrow p & \bbnum 0\\ +\bbnum 0 & q_{1}\times q_{2}\times a\rightarrow\left(q_{1}\oplus q_{2}\right)\times a \end{array}\right|\bef\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ -q\times l\Rightarrow(x\Rightarrow\bbnum 0+q\times x)^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ +q\times l\rightarrow(x\rightarrow\bbnum 0+q\times x)^{\uparrow L}l \end{array}\right|\nonumber \\ & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ -\left(q\times p\Rightarrow p+\bbnum 0\right)\bef\text{pu}_{L}\\ -q_{1}\times q_{2}\times a\Rightarrow(x\Rightarrow\bbnum 0+\left(q_{1}\oplus q_{2}\right)\times x)^{\uparrow L}a +(x^{:P}\rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ +\left(q\times p\rightarrow p+\bbnum 0\right)\bef\text{pu}_{L}\\ +q_{1}\times q_{2}\times a\rightarrow(x\rightarrow\bbnum 0+\left(q_{1}\oplus q_{2}\right)\times x)^{\uparrow L}a \end{array}\right|\quad.\label{eq:m-interchange-law-of-swap-linear-monads-left-hand-side} \end{align} We cannot simplify this any more, so we hope to transform the right-hand @@ -2503,13 +2503,13 @@ \subsection{Laws of \texttt{swap}} \begin{align*} \text{sw}^{\uparrow M}=~ & \begin{array}{|c||cc|} P & \text{id} & \bbnum 0\\ -Q\times P & \bbnum 0 & q\times p\Rightarrow q\times\text{sw}\left(p+\bbnum 0\right)\\ -Q\times Q\times L^{A} & \bbnum 0 & q_{1}\times q_{2}\times l\Rightarrow q_{1}\times\text{sw}\left(\bbnum 0+q_{2}\times l\right) +Q\times P & \bbnum 0 & q\times p\rightarrow q\times\text{sw}\left(p+\bbnum 0\right)\\ +Q\times Q\times L^{A} & \bbnum 0 & q_{1}\times q_{2}\times l\rightarrow q_{1}\times\text{sw}\left(\bbnum 0+q_{2}\times l\right) \end{array}\\ & =\begin{array}{|c||cc|} P & \text{id} & \bbnum 0\\ -Q\times P & \bbnum 0 & q\times p\Rightarrow q\times\text{pu}_{L}\left(p+\bbnum 0\right)\\ -Q\times Q\times L^{A} & \bbnum 0 & q_{1}\times q_{2}\times l\Rightarrow q_{1}\times(x\Rightarrow\bbnum 0+q_{2}\times x)^{\uparrow L}l +Q\times P & \bbnum 0 & q\times p\rightarrow q\times\text{pu}_{L}\left(p+\bbnum 0\right)\\ +Q\times Q\times L^{A} & \bbnum 0 & q_{1}\times q_{2}\times l\rightarrow q_{1}\times(x\rightarrow\bbnum 0+q_{2}\times x)^{\uparrow L}l \end{array}\quad. \end{align*} Then compute the composition $\text{sw}^{\uparrow M}\bef\text{sw}$ @@ -2518,45 +2518,45 @@ \subsection{Laws of \texttt{swap}} & \text{sw}^{\uparrow M}\bef\text{sw}\\ & =\left\Vert \begin{array}{cc} \text{id} & \bbnum 0\\ -\bbnum 0 & q\times p\Rightarrow q\times\text{pu}_{L}\left(p+\bbnum 0\right)\\ -\bbnum 0 & q_{1}\times q_{2}\times l\Rightarrow q_{1}\times(x\Rightarrow\bbnum 0+q_{2}\times x)^{\uparrow L}l +\bbnum 0 & q\times p\rightarrow q\times\text{pu}_{L}\left(p+\bbnum 0\right)\\ +\bbnum 0 & q_{1}\times q_{2}\times l\rightarrow q_{1}\times(x\rightarrow\bbnum 0+q_{2}\times x)^{\uparrow L}l \end{array}\right|\bef\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ -q\times l\Rightarrow(x\Rightarrow\bbnum 0+q\times x)^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ +q\times l\rightarrow(x\rightarrow\bbnum 0+q\times x)^{\uparrow L}l \end{array}\right|\\ & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ -q\times p\Rightarrow(x^{:M^{A}}\Rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}\left(\text{pu}_{L}\left(p+\bbnum 0\right)\right)\\ -q_{1}\times q_{2}\times l\Rightarrow(x^{:M^{A}}\Rightarrow\bbnum 0^{:P}+q_{1}\times x)^{\uparrow L}(x\Rightarrow\bbnum 0+q_{2}\times x)^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ +q\times p\rightarrow(x^{:M^{A}}\rightarrow\bbnum 0^{:P}+q\times x)^{\uparrow L}\left(\text{pu}_{L}\left(p+\bbnum 0\right)\right)\\ +q_{1}\times q_{2}\times l\rightarrow(x^{:M^{A}}\rightarrow\bbnum 0^{:P}+q_{1}\times x)^{\uparrow L}(x\rightarrow\bbnum 0+q_{2}\times x)^{\uparrow L}l \end{array}\right|\\ & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ -q\times p\Rightarrow\text{pu}_{L}(\bbnum 0^{:P}+q\times\left(p+\bbnum 0\right))\\ -q_{1}\times q_{2}\times l\Rightarrow(x^{:M^{A}}\Rightarrow\bbnum 0+q_{1}\times(\bbnum 0+q_{2}\times x))^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ +q\times p\rightarrow\text{pu}_{L}(\bbnum 0^{:P}+q\times\left(p+\bbnum 0\right))\\ +q_{1}\times q_{2}\times l\rightarrow(x^{:M^{A}}\rightarrow\bbnum 0+q_{1}\times(\bbnum 0+q_{2}\times x))^{\uparrow L}l \end{array}\right|\quad. \end{align*} Now we need to post-compose $\text{ftn}_{M}^{\uparrow L}$ with this column: \begin{align*} \text{sw}^{\uparrow M}\bef\text{sw}\bef\text{ftn}_{M}^{\uparrow L} & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0)\bef\gunderline{\text{pu}_{L}\bef\text{ftn}_{M}^{\uparrow L}}\\ -(q\times p\Rightarrow\bbnum 0^{:P}+q\times\left(p+\bbnum 0\right))\bef\gunderline{\text{pu}_{L}\bef\text{ftn}_{M}^{\uparrow L}}\\ -q_{1}\times q_{2}\times l\Rightarrow l\triangleright(x^{:M^{A}}\Rightarrow\bbnum 0+q_{1}\times(\bbnum 0+q_{2}\times x))^{\uparrow L}\bef\text{ftn}_{M}^{\uparrow L} +(x^{:P}\rightarrow x+\bbnum 0)\bef\gunderline{\text{pu}_{L}\bef\text{ftn}_{M}^{\uparrow L}}\\ +(q\times p\rightarrow\bbnum 0^{:P}+q\times\left(p+\bbnum 0\right))\bef\gunderline{\text{pu}_{L}\bef\text{ftn}_{M}^{\uparrow L}}\\ +q_{1}\times q_{2}\times l\rightarrow l\triangleright(x^{:M^{A}}\rightarrow\bbnum 0+q_{1}\times(\bbnum 0+q_{2}\times x))^{\uparrow L}\bef\text{ftn}_{M}^{\uparrow L} \end{array}\right|\\ {\color{greenunder}\text{pu}_{L}\text{'s naturality}:}\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0)\bef\text{ftn}_{M}\bef\text{pu}_{L}\\ -(q\times p\Rightarrow\bbnum 0^{:P}+q\times\left(p+\bbnum 0\right))\bef\text{ftn}_{M}\bef\text{pu}_{L}\\ -q_{1}\times q_{2}\times l\Rightarrow l\triangleright(x^{:M^{A}}\Rightarrow\gunderline{\text{ftn}_{M}\left(\bbnum 0+q_{1}\times(\bbnum 0+q_{2}\times x)\right)})^{\uparrow L} +(x^{:P}\rightarrow x+\bbnum 0)\bef\text{ftn}_{M}\bef\text{pu}_{L}\\ +(q\times p\rightarrow\bbnum 0^{:P}+q\times\left(p+\bbnum 0\right))\bef\text{ftn}_{M}\bef\text{pu}_{L}\\ +q_{1}\times q_{2}\times l\rightarrow l\triangleright(x^{:M^{A}}\rightarrow\gunderline{\text{ftn}_{M}\left(\bbnum 0+q_{1}\times(\bbnum 0+q_{2}\times x)\right)})^{\uparrow L} \end{array}\right|\\ {\color{greenunder}\text{compute }\text{ftn}_{M}(...):}\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow\text{ftn}_{M}(x+\bbnum 0))\bef\text{pu}_{L}\\ -(q\times p\Rightarrow\text{ftn}_{M}(\bbnum 0^{:P}+q\times\left(p+\bbnum 0\right)))\bef\text{pu}_{L}\\ -q_{1}\times q_{2}\times l\Rightarrow l\triangleright(x^{:M^{A}}\Rightarrow\bbnum 0+\left(q_{1}\oplus q_{2}\right)\times x)^{\uparrow L} +(x^{:P}\rightarrow\text{ftn}_{M}(x+\bbnum 0))\bef\text{pu}_{L}\\ +(q\times p\rightarrow\text{ftn}_{M}(\bbnum 0^{:P}+q\times\left(p+\bbnum 0\right)))\bef\text{pu}_{L}\\ +q_{1}\times q_{2}\times l\rightarrow l\triangleright(x^{:M^{A}}\rightarrow\bbnum 0+\left(q_{1}\oplus q_{2}\right)\times x)^{\uparrow L} \end{array}\right|\\ {\color{greenunder}\text{compute }\text{ftn}_{M}(...):}\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ -(q\times p\Rightarrow p+\bbnum 0)\bef\text{pu}_{L}\\ -q_{1}\times q_{2}\times l\Rightarrow(x^{:M^{A}}\Rightarrow\bbnum 0+\left(q_{1}\oplus q_{2}\right)\times x)^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0)\bef\text{pu}_{L}\\ +(q\times p\rightarrow p+\bbnum 0)\bef\text{pu}_{L}\\ +q_{1}\times q_{2}\times l\rightarrow(x^{:M^{A}}\rightarrow\bbnum 0+\left(q_{1}\oplus q_{2}\right)\times x)^{\uparrow L}l \end{array}\right|\quad. \end{align*} After renaming $l$ to $a$, this is the same as the column in Eq.~(\ref{eq:m-interchange-law-of-swap-linear-monads-left-hand-side}). @@ -2573,12 +2573,12 @@ \subsection{Laws of \texttt{swap}} \begin{align*} & \text{sw}_{\text{Id},M}\\ {\color{greenunder}\text{Eq.~(\ref{eq:single-valued-monad-def-of-swap}) with }L=\text{Id}:}\quad & =\begin{array}{|c||c|} -P & (x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{\text{Id}}\\ -Q\times\text{Id}^{A} & q\times l\Rightarrow(a^{:A}\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow\text{Id}}l +P & (x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{\text{Id}}\\ +Q\times\text{Id}^{A} & q\times l\rightarrow(a^{:A}\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow\text{Id}}l \end{array}\\ {\color{greenunder}\text{matrix notation}:}\quad & =\begin{array}{|c||c|} -P & x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A}\\ -Q\times A & q\times a\Rightarrow\bbnum 0^{:P}+q\times a +P & x^{:P}\rightarrow x+\bbnum 0^{:Q\times A}\\ +Q\times A & q\times a\rightarrow\bbnum 0^{:P}+q\times a \end{array}\\ & =\text{id}\quad. \end{align*} @@ -2587,16 +2587,16 @@ \subsection{Laws of \texttt{swap}} \begin{align*} & \text{sw}_{L,M}\bef\phi\\ {\color{greenunder}\text{definition of }\text{sw}_{L,M}:}\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ -q\times l\Rightarrow(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\\ +q\times l\rightarrow(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}l \end{array}\right|\gunderline{\bef\phi}\\ {\color{greenunder}\text{compose with }\phi:}\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\bef\phi\\ -q\times l\Rightarrow l\triangleright\gunderline{(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\phi} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{L}\bef\phi\\ +q\times l\rightarrow l\triangleright\gunderline{(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\phi} \end{array}\right|\\ {\color{greenunder}\text{naturality of }\phi:}\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{N}\\ -q\times l\Rightarrow l\triangleright\phi\bef(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow N} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{N}\\ +q\times l\rightarrow l\triangleright\phi\bef(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow N} \end{array}\right|\quad. \end{align*} The right-hand side is @@ -2604,14 +2604,14 @@ \subsection{Laws of \texttt{swap}} & \phi^{\uparrow M}\bef\text{sw}_{N,M}\\ & =\left\Vert \begin{array}{cc} \text{id} & \bbnum 0\\ -\bbnum 0 & q\times l\Rightarrow q\times\phi\left(l\right) +\bbnum 0 & q\times l\rightarrow q\times\phi\left(l\right) \end{array}\right|\bef\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{N}\\ -q\times n\Rightarrow n\triangleright(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow N} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{N}\\ +q\times n\rightarrow n\triangleright(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow N} \end{array}\right|\\ {\color{greenunder}\text{composition}:}\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{N}\\ -q\times l\Rightarrow n\triangleright\phi\bef(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow N} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\text{pu}_{N}\\ +q\times l\rightarrow n\triangleright\phi\bef(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow N} \end{array}\right|\quad. \end{align*} Both sides of the second law are now shown to be equal. @@ -2620,38 +2620,38 @@ \subsection{Laws of \texttt{swap}} \begin{align} & \text{sw}_{L,M}\bef\theta^{\uparrow L}\nonumber \\ {\color{greenunder}\text{compose with }\theta^{\uparrow L}:}\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\gunderline{\text{pu}_{L}\bef\theta^{\uparrow L}}\\ -q\times l\Rightarrow l\triangleright(a\Rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\theta^{\uparrow L} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\gunderline{\text{pu}_{L}\bef\theta^{\uparrow L}}\\ +q\times l\rightarrow l\triangleright(a\rightarrow\bbnum 0^{:P}+q\times a)^{\uparrow L}\bef\theta^{\uparrow L} \end{array}\right|\nonumber \\ {\color{greenunder}\text{naturality of }\text{pu}_{L}:}\quad & =\left\Vert \begin{array}{c} -(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\theta\bef\text{pu}_{L}\\ -q\times l\Rightarrow l\triangleright\big(a\Rightarrow\theta(\bbnum 0^{:P}+q\times a)\big)^{\uparrow L} +(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\theta\bef\text{pu}_{L}\\ +q\times l\rightarrow l\triangleright\big(a\rightarrow\theta(\bbnum 0^{:P}+q\times a)\big)^{\uparrow L} \end{array}\right|\quad.\label{eq:linear-monads-monadic-naturality-of-swap-2} \end{align} We expect this to equal the right-hand side, which we write as \begin{align} - & m^{:M^{L^{A}}}\Rightarrow\theta(m)\nonumber \\ + & m^{:M^{L^{A}}}\rightarrow\theta(m)\nonumber \\ {\color{greenunder}\text{matrix notation}:}\quad & =\left\Vert \begin{array}{c} -x^{:P}\Rightarrow\theta(x+\bbnum 0^{:Q\times L^{A}})\\ -q\times l\Rightarrow\theta(\bbnum 0^{:P}+q\times l) +x^{:P}\rightarrow\theta(x+\bbnum 0^{:Q\times L^{A}})\\ +q\times l\rightarrow\theta(\bbnum 0^{:P}+q\times l) \end{array}\right|\quad.\label{eq:linear-monads-monadic-naturality-of-swap-1} \end{align} Now consider each line in Eq.~(\ref{eq:linear-monads-monadic-naturality-of-swap-2}) separately. The upper line can be transformed as \begin{align*} - & (x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\gunderline{\theta\bef\text{pu}_{L}}\\ -{\color{greenunder}\text{naturality of }\theta:}\quad & =(x^{:P}\Rightarrow x+\bbnum 0^{:Q\times A})\bef\gunderline{\text{pu}_{L}^{\uparrow M}}\bef\theta\\ -{\color{greenunder}\text{definition of }^{\uparrow M}:}\quad & =x^{:P}\Rightarrow\left\Vert \begin{array}{cc} + & (x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\gunderline{\theta\bef\text{pu}_{L}}\\ +{\color{greenunder}\text{naturality of }\theta:}\quad & =(x^{:P}\rightarrow x+\bbnum 0^{:Q\times A})\bef\gunderline{\text{pu}_{L}^{\uparrow M}}\bef\theta\\ +{\color{greenunder}\text{definition of }^{\uparrow M}:}\quad & =x^{:P}\rightarrow\left\Vert \begin{array}{cc} x\enskip & \bbnum 0\end{array}\right|\triangleright\left\Vert \begin{array}{cc} \text{id} & \bbnum 0\\ -\bbnum 0 & q\times l\Rightarrow q\times\text{pu}_{L}l +\bbnum 0 & q\times l\rightarrow q\times\text{pu}_{L}l \end{array}\right|\bef\theta\\ -{\color{greenunder}\text{matrix notation}:}\quad & =x^{:P}\Rightarrow(x+\bbnum 0^{:Q\times L^{A}})\triangleright\theta\quad. +{\color{greenunder}\text{matrix notation}:}\quad & =x^{:P}\rightarrow(x+\bbnum 0^{:Q\times L^{A}})\triangleright\theta\quad. \end{align*} This is now equal to the upper line of Eq.~(\ref{eq:linear-monads-monadic-naturality-of-swap-1}). To proceed with the proof for the lower line of Eq.~(\ref{eq:linear-monads-monadic-naturality-of-swap-2}), -we need to evaluate the monadic morphism $\theta:M^{A}\Rightarrow A$ +we need to evaluate the monadic morphism $\theta:M^{A}\rightarrow A$ on a specific value of type $M^{A}$ of the form $\bbnum 0+q\times a$. We note that the value $\theta(\bbnum 0+q\times a)$ must be of type $A$ and must be computed in the same way for all types $A$, because @@ -2668,7 +2668,7 @@ \subsection{Laws of \texttt{swap}} \end{align*} We can compute $m$ from $m_{1}$ if we replace $1$ by $a$ under the functor $M$. To write this as a formula, define the function -$f^{:\bbnum 1\Rightarrow A}$ as $f\triangleq\left(\_\Rightarrow a\right)$ +$f^{:\bbnum 1\rightarrow A}$ as $f\triangleq\left(\_\rightarrow a\right)$ using the fixed value $a$. Then we have $m=f^{\uparrow M}m_{1}$. Now we apply both sides of the naturality law $f^{\uparrow M}\bef\theta=\theta\bef f$ to the value $m_{1}$: @@ -2690,12 +2690,12 @@ \subsection{Laws of \texttt{swap}} We can now compute the second line in Eq.~(\ref{eq:linear-monads-monadic-naturality-of-swap-2}) as \begin{align*} - & q\times l\Rightarrow l\triangleright\big(a\Rightarrow\theta(\bbnum 0^{:P}+q\times a)\big)^{\uparrow L}\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:runner-on-linear-monads})}:}\quad & =q\times l\Rightarrow l\,\gunderline{\triangleright\,\big(a\Rightarrow a\big)^{\uparrow L}}\\ -{\color{greenunder}\text{identity law}:}\quad & =q\times l\Rightarrow l\quad. + & q\times l\rightarrow l\triangleright\big(a\rightarrow\theta(\bbnum 0^{:P}+q\times a)\big)^{\uparrow L}\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:runner-on-linear-monads})}:}\quad & =q\times l\rightarrow l\,\gunderline{\triangleright\,\big(a\rightarrow a\big)^{\uparrow L}}\\ +{\color{greenunder}\text{identity law}:}\quad & =q\times l\rightarrow l\quad. \end{align*} The second line in Eq.~(\ref{eq:linear-monads-monadic-naturality-of-swap-1}) -is the same function, $q\times l\Rightarrow l$. +is the same function, $q\times l\rightarrow l$. This concludes the proof of the swap laws for linear monads. It follows that linear monads have monad transformers of composed-inside kind. @@ -2764,26 +2764,26 @@ \section{Composed-outside transformers: Rigid monads\label{sec:transformers-rigi Two simplest examples of rigid monads are the \lstinline!Reader! monad and the \lstinline!Search! monad, \begin{align*} -\text{(the \texttt{Reader} monad)} & :\quad\quad R^{A}\triangleq Z\Rightarrow A\quad,\\ -\text{(the \texttt{Search} monad)} & :\quad\quad S^{A}\triangleq\left(A\Rightarrow Z\right)\Rightarrow A\quad, +\text{(the \texttt{Reader} monad)} & :\quad\quad R^{A}\triangleq Z\rightarrow A\quad,\\ +\text{(the \texttt{Search} monad)} & :\quad\quad S^{A}\triangleq\left(A\rightarrow Z\right)\rightarrow A\quad, \end{align*} where $Z$ is a fixed type. These monads have composed-outside transformers: \begin{align*} -\text{(the \texttt{ReaderT} transformer)} & :\quad\quad T_{R}^{M,A}\triangleq Z\Rightarrow M^{A}\quad,\\ -\text{(the \texttt{SearchT} transformer)} & :\quad\quad T_{S}^{M,A}\triangleq\left(M^{A}\Rightarrow Z\right)\Rightarrow M^{A}\quad. +\text{(the \texttt{ReaderT} transformer)} & :\quad\quad T_{R}^{M,A}\triangleq Z\rightarrow M^{A}\quad,\\ +\text{(the \texttt{SearchT} transformer)} & :\quad\quad T_{S}^{M,A}\triangleq\left(M^{A}\rightarrow Z\right)\rightarrow M^{A}\quad. \end{align*} To build intuition for rigid monads, we will look at some general constructions that create new rigid monads or combine existing rigid monads into new ones. In this section, we will prove that the following four constructions produce rigid monads: \begin{enumerate} -\item Choice: $C^{A}\triangleq H^{A}\Rightarrow A$ is a rigid monad if +\item Choice: $C^{A}\triangleq H^{A}\rightarrow A$ is a rigid monad if $H$ is any contrafunctor. \item Composition: $P\circ R$ is a rigid monad if $P$ and $R$ are rigid monads. \item Product: $P^{A}\times R^{A}$ is a rigid monad if $P$ and $R$ are rigid monads. -\item Selector: $S^{A}\triangleq F^{A\Rightarrow R^{Q}}\Rightarrow R^{A}$ +\item Selector: $S^{A}\triangleq F^{A\rightarrow R^{Q}}\rightarrow R^{A}$ is a rigid monad for any rigid monad $R$, any functor $F$, and any fixed type $Q$. \end{enumerate} @@ -2794,33 +2794,33 @@ \section{Composed-outside transformers: Rigid monads\label{sec:transformers-rigi \subsection{Rigid monad construction 1: choice\label{subsec:Rigid-monad-construction-1-choice}} The construction I call \index{monads!choice monad}the \textbf{choice} -monad, $R^{A}\triangleq H^{A}\Rightarrow A$, defines a rigid monad +monad, $R^{A}\triangleq H^{A}\rightarrow A$, defines a rigid monad $R$ for \emph{any} given contrafunctor $H$. This monad chooses a value of type $A$ given a contrafunctor $H$ that may \emph{consume} values of type $A$ (and presumably could check some conditions on those values). The contrafunctor $H$ could be a constant contrafunctor $H^{A}\triangleq Q$, a function such -as $H^{A}\triangleq A\Rightarrow Q$, or a more complicated contrafunctor. +as $H^{A}\triangleq A\rightarrow Q$, or a more complicated contrafunctor. Different choices of the contrafunctor $H$ give specific examples of rigid monads, such as $R^{A}\triangleq\bbnum 1$ (the unit monad), -$R^{A}\triangleq A$ (the identity monad), $R^{A}\triangleq Z\Rightarrow A$ +$R^{A}\triangleq A$ (the identity monad), $R^{A}\triangleq Z\rightarrow A$ (the reader monad), as well as the \textbf{search}\footnote{See \href{http://math.andrej.com/2008/11/21/}{http://math.andrej.com/2008/11/21/}}\textbf{ -monad}\index{monads!search monad}\index{search monad} $R^{A}\triangleq\left(A\Rightarrow Q\right)\Rightarrow A$. +monad}\index{monads!search monad}\index{search monad} $R^{A}\triangleq\left(A\rightarrow Q\right)\rightarrow A$. The search monad represents the effect of searching for a value of type $A$ that satisfies a condition expressed through a function -of type $A\Rightarrow Q$. The simplest example of a search monad +of type $A\rightarrow Q$. The simplest example of a search monad is found by setting $Q\triangleq\text{Bool}$. One may implement a -function of type $\left(A\Rightarrow\text{Bool}\right)\Rightarrow A$ +function of type $\left(A\rightarrow\text{Bool}\right)\rightarrow A$ that \emph{somehow} finds a value of type $A$ that might satisfy -the given predicate of type $A\Rightarrow\text{Bool}$. The intention +the given predicate of type $A\rightarrow\text{Bool}$. The intention is to return a value that, if possible, satisfies the predicate. If no such value can be found, \emph{some} value of type $A$ is still returned. -A closely related monad is the search-with-failure monad, $R^{A}\triangleq\left(A\Rightarrow\text{Bool}\right)\Rightarrow\bbnum 1+A$. +A closely related monad is the search-with-failure monad, $R^{A}\triangleq\left(A\rightarrow\text{Bool}\right)\rightarrow\bbnum 1+A$. This (non-rigid) monad will return an empty value $1+\bbnum 0^{:A}$ if no value satisfing the predicate was found. There is a natural transformation from the search monad to the search-with-failure monad, @@ -2830,7 +2830,7 @@ \subsection{Rigid monad construction 1: choice\label{subsec:Rigid-monad-construc Assume that $H$ is a contrafunctor and $M$ is a monad, and denote for brevity \[ -T^{A}\triangleq R^{M^{A}}\triangleq H^{M^{A}}\Rightarrow M^{A}\quad. +T^{A}\triangleq R^{M^{A}}\triangleq H^{M^{A}}\rightarrow M^{A}\quad. \] We will first give a self-contained proof that $T$ is a monad. To verify the laws of monad transformers for $T$, we will derive the @@ -2838,7 +2838,7 @@ \subsection{Rigid monad construction 1: choice\label{subsec:Rigid-monad-construc \subsubsection{Statement \label{subsec:Statement-choice-monad-direct-proof}\ref{subsec:Statement-choice-monad-direct-proof}} -$T^{\bullet}\triangleq R^{M^{\bullet}}\triangleq H^{M^{\bullet}}\Rightarrow M^{\bullet}$ +$T^{\bullet}\triangleq R^{M^{\bullet}}\triangleq H^{M^{\bullet}}\rightarrow M^{\bullet}$ is a monad if $M$ is any monad and $H$ is any contrafunctor. (If we set $M^{A}\triangleq A$, this also proves that $R$ itself is a monad.) @@ -2851,28 +2851,28 @@ \subsubsection{Statement \label{subsec:Statement-choice-monad-direct-proof}\ref{ To define the monad instance for $T$, it is convenient to use the Kleisli formulation of the monad. In this formulation, we consider -Kleisli morphisms of type $A\Rightarrow T^{B}$ and then define the -Kleisli identity morphism, $\text{pu}_{T}:A\Rightarrow T^{A}$, and +Kleisli morphisms of type $A\rightarrow T^{B}$ and then define the +Kleisli identity morphism, $\text{pu}_{T}:A\rightarrow T^{A}$, and the Kleisli product operation $\diamond_{T}$, \[ -f^{:A\Rightarrow T^{B}}\diamond_{T}g^{:B\Rightarrow T^{C}}:A\Rightarrow T^{C}\quad. +f^{:A\rightarrow T^{B}}\diamond_{T}g^{:B\rightarrow T^{C}}:A\rightarrow T^{C}\quad. \] We are then required to define the operation $\diamond_{T}$ and to prove identity and associativity laws for it. We notice that since the type constructor $R$ is itself a function -type $H^{A}\Rightarrow A$, the type of the Kleisli morphism $A\Rightarrow T^{B}$ -is actually $A\Rightarrow T^{B}\triangleq A\Rightarrow H^{M^{B}}\Rightarrow M^{B}$. +type $H^{A}\rightarrow A$, the type of the Kleisli morphism $A\rightarrow T^{B}$ +is actually $A\rightarrow T^{B}\triangleq A\rightarrow H^{M^{B}}\rightarrow M^{B}$. While proving the monad laws for $T$, we will need to use the monad laws for $M$ (since $M$ is an arbitrary, unknown monad). In order to use the monad laws for $M$, it would be helpful if we had the -Kleisli morphisms for $M$ of type $A\Rightarrow M^{B}$ more easily +Kleisli morphisms for $M$ of type $A\rightarrow M^{B}$ more easily available. If we flip the curried arguments of the Kleisli morphism -type $A\Rightarrow H^{M^{B}}\Rightarrow M^{B}$ and instead consider +type $A\rightarrow H^{M^{B}}\rightarrow M^{B}$ and instead consider the \textbf{flipped Kleisli\index{flipped Kleisli}} morphisms of -type $H^{M^{B}}\Rightarrow A\Rightarrow M^{B}$, the type $A\Rightarrow M^{B}$ -will be easier to reason about. Since the type $A\Rightarrow H^{M^{B}}\Rightarrow M^{B}$ -is equivalent to $A\Rightarrow H^{M^{B}}\Rightarrow M^{B}$, any laws +type $H^{M^{B}}\rightarrow A\rightarrow M^{B}$, the type $A\rightarrow M^{B}$ +will be easier to reason about. Since the type $A\rightarrow H^{M^{B}}\rightarrow M^{B}$ +is equivalent to $A\rightarrow H^{M^{B}}\rightarrow M^{B}$, any laws we prove for the flipped Kleisli morphisms will yield the corresponding laws for the standard Kleisli morphisms. The use of flipped Kleisli morphisms makes the proof significantly shorter. @@ -2880,8 +2880,8 @@ \subsubsection{Statement \label{subsec:Statement-choice-monad-direct-proof}\ref{ We temporarily denote by $\tilde{\text{pu}}_{T}$ and $\tilde{\diamond}_{T}$ the flipped Kleisli operations: \begin{align*} -\tilde{\text{pu}}_{T} & :\ H^{M^{A}}\Rightarrow A\Rightarrow M^{A}\\ -f^{:H^{M^{B}}\Rightarrow A\Rightarrow M^{B}}\tilde{\diamond}_{T}g^{:H^{M^{C}}\Rightarrow B\Rightarrow M^{C}} & :\ H^{M^{C}}\Rightarrow A\Rightarrow M^{C}\quad. +\tilde{\text{pu}}_{T} & :\ H^{M^{A}}\rightarrow A\rightarrow M^{A}\\ +f^{:H^{M^{B}}\rightarrow A\rightarrow M^{B}}\tilde{\diamond}_{T}g^{:H^{M^{C}}\rightarrow B\rightarrow M^{C}} & :\ H^{M^{C}}\rightarrow A\rightarrow M^{C}\quad. \end{align*} To define the operations $\tilde{\text{pu}}_{T}$ and $\tilde{\diamond}_{T}$, @@ -2889,35 +2889,35 @@ \subsubsection{Statement \label{subsec:Statement-choice-monad-direct-proof}\ref{ as the Kleisli product $\diamond_{M}$ for the given monad $M$. The definitions are \begin{align*} -\tilde{\text{pu}}_{T} & =\_\Rightarrow\text{pu}_{M}\quad\text{(the argument is unused)}\quad,\\ -f\tilde{\diamond}_{T}g & =q\Rightarrow\left(f\,p\right)\diamond_{M}\left(g\,q\right)\quad\text{where}\\ +\tilde{\text{pu}}_{T} & =\_\rightarrow\text{pu}_{M}\quad\text{(the argument is unused)}\quad,\\ +f\tilde{\diamond}_{T}g & =q\rightarrow\left(f\,p\right)\diamond_{M}\left(g\,q\right)\quad\text{where}\\ & \quad p^{:H^{M^{B}}}=\left(\text{flm}_{M}\left(g\,q\right)\right)^{\downarrow H}q\quad. \end{align*} This definition works by using the Kleisli product $\diamond_{M}$ -on values $f\,p:A\Rightarrow M^{B}$ and $g\,q:B\Rightarrow M^{C}$. -To obtain a value $p:H^{M^{B}}$, we use the function $\text{flm}_{M}\left(g\,q\right):M^{B}\Rightarrow M^{C}$ +on values $f\,p:A\rightarrow M^{B}$ and $g\,q:B\rightarrow M^{C}$. +To obtain a value $p:H^{M^{B}}$, we use the function $\text{flm}_{M}\left(g\,q\right):M^{B}\rightarrow M^{C}$ to $H$-contramap $q:H^{M^{C}}$ into $p:H^{M^{B}}$. Written as a single expression, the definition of $\tilde{\diamond}_{T}$ is \begin{equation} -f\tilde{\diamond}_{T}g=q\Rightarrow f\left(\left(\text{flm}_{M}\left(g\,q\right)\right)^{\downarrow H}q\right)\diamond_{M}\left(g\,q\right)\quad.\label{eq:def-flipped-kleisli} +f\tilde{\diamond}_{T}g=q\rightarrow f\left(\left(\text{flm}_{M}\left(g\,q\right)\right)^{\downarrow H}q\right)\diamond_{M}\left(g\,q\right)\quad.\label{eq:def-flipped-kleisli} \end{equation} Checking the left identity law: \begin{align*} & \tilde{\text{pu}}_{T}\tilde{\diamond}_{T}g\\ -{\color{greenunder}\text{definition of }\tilde{\diamond}_{T}:}\quad & =q\Rightarrow\gunderline{\tilde{\text{pu}}_{T}\left(\left(\text{flm}_{M}\left(g\,q\right)\right)^{\downarrow H}q\right)}\diamond_{M}\left(g\,q\right)\\ -{\color{greenunder}\text{definition of }\tilde{\text{pu}}_{T}:}\quad & =q\Rightarrow\gunderline{\text{pu}_{M}\diamond_{M}}g\,q\\ -{\color{greenunder}\text{left identity law for }M:}\quad & =q\Rightarrow g\,q\\ +{\color{greenunder}\text{definition of }\tilde{\diamond}_{T}:}\quad & =q\rightarrow\gunderline{\tilde{\text{pu}}_{T}\left(\left(\text{flm}_{M}\left(g\,q\right)\right)^{\downarrow H}q\right)}\diamond_{M}\left(g\,q\right)\\ +{\color{greenunder}\text{definition of }\tilde{\text{pu}}_{T}:}\quad & =q\rightarrow\gunderline{\text{pu}_{M}\diamond_{M}}g\,q\\ +{\color{greenunder}\text{left identity law for }M:}\quad & =q\rightarrow g\,q\\ {\color{greenunder}\text{function expansion}:}\quad & =g \end{align*} Checking the right identity law: \begin{align*} & f\tilde{\diamond}_{T}\tilde{\text{pu}}_{T}\\ -{\color{greenunder}\text{definition of }\tilde{\diamond}_{T}:}\quad & =q\Rightarrow f\left(\left(\text{flm}_{M}\left(\tilde{\text{pu}}_{T}q\right)\right)^{\downarrow H}q\right)\diamond_{M}\gunderline{\left(\tilde{\text{pu}}_{T}q\right)}\\ -{\color{greenunder}\text{definition of }\tilde{\text{pu}}_{T}:}\quad & =q\Rightarrow f\left(\left(\text{flm}_{M}\left(\text{pu}_{M}\right)\right)^{\downarrow H}q\right)\gunderline{\diamond_{M}\text{pu}_{M}}\\ -{\color{greenunder}\text{right identity law for }M:}\quad & =q\Rightarrow f\gunderline{\left(\left(\text{id}\right)^{\downarrow H}q\right)}\\ -{\color{greenunder}\text{identity law for }H:}\quad & =q\Rightarrow f\,q\\ +{\color{greenunder}\text{definition of }\tilde{\diamond}_{T}:}\quad & =q\rightarrow f\left(\left(\text{flm}_{M}\left(\tilde{\text{pu}}_{T}q\right)\right)^{\downarrow H}q\right)\diamond_{M}\gunderline{\left(\tilde{\text{pu}}_{T}q\right)}\\ +{\color{greenunder}\text{definition of }\tilde{\text{pu}}_{T}:}\quad & =q\rightarrow f\left(\left(\text{flm}_{M}\left(\text{pu}_{M}\right)\right)^{\downarrow H}q\right)\gunderline{\diamond_{M}\text{pu}_{M}}\\ +{\color{greenunder}\text{right identity law for }M:}\quad & =q\rightarrow f\gunderline{\left(\left(\text{id}\right)^{\downarrow H}q\right)}\\ +{\color{greenunder}\text{identity law for }H:}\quad & =q\rightarrow f\,q\\ {\color{greenunder}\text{function expansion}:}\quad & =f \end{align*} Checking the associativity law: $\left(f\tilde{\diamond}_{T}g\right)\tilde{\diamond}_{T}h$ @@ -2925,15 +2925,15 @@ \subsubsection{Statement \label{subsec:Statement-choice-monad-direct-proof}\ref{ We have \begin{align*} & \left(f\tilde{\diamond}_{T}g\right)\tilde{\diamond}_{T}h\\ - & =\left(s\Rightarrow f\left(\left(\text{flm}_{M}\left(g\,s\right)\right)^{\downarrow H}s\right)\diamond_{M}\left(g\,s\right)\right)\tilde{\diamond}_{T}h\\ - & =q\Rightarrow f\left(\left(\text{flm}_{M}\left(g\,r\right)\right)^{\downarrow H}r\right)\diamond_{M}\left(g\,r\right)\diamond_{M}\left(h\,q\right)\quad\text{where}\\ + & =\left(s\rightarrow f\left(\left(\text{flm}_{M}\left(g\,s\right)\right)^{\downarrow H}s\right)\diamond_{M}\left(g\,s\right)\right)\tilde{\diamond}_{T}h\\ + & =q\rightarrow f\left(\left(\text{flm}_{M}\left(g\,r\right)\right)^{\downarrow H}r\right)\diamond_{M}\left(g\,r\right)\diamond_{M}\left(h\,q\right)\quad\text{where}\\ & \quad\quad\quad r\triangleq\left(\text{flm}_{M}\left(h\,q\right)\right)^{\downarrow H}q\quad; \end{align*} while \begin{align*} & f\tilde{\diamond}_{T}\left(g\tilde{\diamond}_{T}h\right)\\ - & =f\tilde{\diamond}_{T}\left(q\Rightarrow g\left(\left(\text{flm}_{M}\left(h\,q\right)\right)^{\downarrow H}q\right)\diamond_{M}\left(h\,q\right)\right)\\ - & =q\Rightarrow f\left(\left(\text{flm}_{M}\,k\right)^{\downarrow H}q\right)\diamond_{M}u\quad\text{where}\\ + & =f\tilde{\diamond}_{T}\left(q\rightarrow g\left(\left(\text{flm}_{M}\left(h\,q\right)\right)^{\downarrow H}q\right)\diamond_{M}\left(h\,q\right)\right)\\ + & =q\rightarrow f\left(\left(\text{flm}_{M}\,k\right)^{\downarrow H}q\right)\diamond_{M}u\quad\text{where}\\ & \quad\quad\quad r\triangleq\left(\text{flm}_{M}\left(h\,q\right)\right)^{\downarrow H}q\quad\text{and}\\ & \quad\quad\quad u\triangleq\left(g\,r\right)\diamond_{M}\left(h\,q\right)\quad. \end{align*} @@ -2976,19 +2976,19 @@ \subsubsection{Statement \label{subsec:Statement-choice-monad-definition-of-flm} The monad methods for $T$ defined in Statement~\ref{subsec:Statement-choice-monad-direct-proof} can be written equivalently as \begin{align} -\text{pu}_{T} & (a^{:A}):\ H^{M^{A}}\Rightarrow M^{A}\quad,\nonumber \\ -\text{pu}_{T} & (a)\triangleq\left(\_\Rightarrow\text{pu}_{M}a\right)\quad;\nonumber \\ -\text{flm}_{T} & \big(f^{:A\Rightarrow H^{M^{B}}\Rightarrow M^{B}}\big):\ \big(H^{M^{A}}\Rightarrow M^{A}\big)\Rightarrow H^{M^{B}}\Rightarrow M^{B}\quad,\nonumber \\ -\text{flm}_{T} & f\triangleq t^{:R^{M^{A}}}\Rightarrow q^{:H^{M^{B}}}\Rightarrow\big(\text{flm}_{M}(x^{:A}\Rightarrow f\,x\,q)\big)^{\uparrow R}t\,q\quad.\label{eq:rigid-monad-flm-T-def} +\text{pu}_{T} & (a^{:A}):\ H^{M^{A}}\rightarrow M^{A}\quad,\nonumber \\ +\text{pu}_{T} & (a)\triangleq\left(\_\rightarrow\text{pu}_{M}a\right)\quad;\nonumber \\ +\text{flm}_{T} & \big(f^{:A\rightarrow H^{M^{B}}\rightarrow M^{B}}\big):\ \big(H^{M^{A}}\rightarrow M^{A}\big)\rightarrow H^{M^{B}}\rightarrow M^{B}\quad,\nonumber \\ +\text{flm}_{T} & f\triangleq t^{:R^{M^{A}}}\rightarrow q^{:H^{M^{B}}}\rightarrow\big(\text{flm}_{M}(x^{:A}\rightarrow f\,x\,q)\big)^{\uparrow R}t\,q\quad.\label{eq:rigid-monad-flm-T-def} \end{align} Expressed through $R$'s \lstinline!flatMap! method, which is implemented as \begin{equation} -\text{flm}_{R}g^{:A\Rightarrow R^{B}}=t^{:R^{A}}\Rightarrow q^{:H^{B}}\Rightarrow(x^{:A}\Rightarrow g\,x\,q)^{\uparrow R}t\,q\quad,\label{eq:rigid-monad-flm-R-def} +\text{flm}_{R}g^{:A\rightarrow R^{B}}=t^{:R^{A}}\rightarrow q^{:H^{B}}\rightarrow(x^{:A}\rightarrow g\,x\,q)^{\uparrow R}t\,q\quad,\label{eq:rigid-monad-flm-R-def} \end{equation} the method $\text{flm}_{T}$ can be written as \begin{equation} -\text{flm}_{T}f=\text{flm}_{R}\left(y\Rightarrow q\Rightarrow\text{flm}_{M}(x\Rightarrow f\,x\,q)\,y\right)\quad.\label{eq:rigid-monad-def-flm-t-via-flm-r} +\text{flm}_{T}f=\text{flm}_{R}\left(y\rightarrow q\rightarrow\text{flm}_{M}(x\rightarrow f\,x\,q)\,y\right)\quad.\label{eq:rigid-monad-def-flm-t-via-flm-r} \end{equation} @@ -2999,44 +2999,44 @@ \subsubsection{Statement \label{subsec:Statement-choice-monad-definition-of-flm} way of defining the methods of a monad. To restore the standard type signatures, we need to unflip the arguments: \begin{align*} - & f^{:A\Rightarrow H^{M^{B}}\Rightarrow M^{B}}\diamond_{T}g^{:B\Rightarrow H^{M^{C}}\Rightarrow M^{C}}:\ A\Rightarrow H^{M^{C}}\Rightarrow M^{C}\quad;\\ - & f\diamond_{T}g=t\Rightarrow q\Rightarrow\left(\tilde{f}\left(\left(\text{flm}_{M}\left(b\Rightarrow g\,b\,q\right)\right)^{\downarrow H}q\right)\diamond_{M}\left(b\Rightarrow g\,b\,q\right)\right)t\quad, + & f^{:A\rightarrow H^{M^{B}}\rightarrow M^{B}}\diamond_{T}g^{:B\rightarrow H^{M^{C}}\rightarrow M^{C}}:\ A\rightarrow H^{M^{C}}\rightarrow M^{C}\quad;\\ + & f\diamond_{T}g=t\rightarrow q\rightarrow\left(\tilde{f}\left(\left(\text{flm}_{M}\left(b\rightarrow g\,b\,q\right)\right)^{\downarrow H}q\right)\diamond_{M}\left(b\rightarrow g\,b\,q\right)\right)t\quad, \end{align*} -where $\tilde{f}\triangleq h\Rightarrow k\Rightarrow f\,k\,h$ is +where $\tilde{f}\triangleq h\rightarrow k\rightarrow f\,k\,h$ is the flipped version of $f$. To replace $\diamond_{M}$ by $\text{flm}_{M}$, express $x\diamond_{M}y=x\bef\text{flm}_{M}y$ to find \[ -f\diamond_{T}g=t\Rightarrow q\Rightarrow\left(\tilde{f}\left(p^{\downarrow H}q\right)\bef p\right)t\quad\text{where }p=\text{flm}_{M}\left(x\Rightarrow g\,x\,q\right)\quad. +f\diamond_{T}g=t\rightarrow q\rightarrow\left(\tilde{f}\left(p^{\downarrow H}q\right)\bef p\right)t\quad\text{where }p=\text{flm}_{M}\left(x\rightarrow g\,x\,q\right)\quad. \] To obtain an implementation of $\text{flm}_{T}$, express $\text{flm}_{T}$ through $\diamond_{T}$ as \[ -\text{flm}_{T}g^{:A\Rightarrow T^{B}}=\text{id}^{:T^{A}\Rightarrow T^{A}}\diamond_{T}g\quad. +\text{flm}_{T}g^{:A\rightarrow T^{B}}=\text{id}^{:T^{A}\rightarrow T^{A}}\diamond_{T}g\quad. \] -Now we need to substitute $f^{:T^{A}\Rightarrow T^{A}}=\text{id}$ +Now we need to substitute $f^{:T^{A}\rightarrow T^{A}}=\text{id}$ into $f\diamond_{T}g$. Noting that $\tilde{f}$ will then become \[ -\tilde{f}=\left(h\Rightarrow k\Rightarrow\text{id}\,k\,h\right)=\left(h\Rightarrow k\Rightarrow k\,h\right)\quad, +\tilde{f}=\left(h\rightarrow k\rightarrow\text{id}\,k\,h\right)=\left(h\rightarrow k\rightarrow k\,h\right)\quad, \] we get \begin{align*} - & \text{flm}_{T}g^{:A\Rightarrow T^{B}}=\text{id}\bef\text{flm}_{T}g\\ -{\color{greenunder}\text{definition of }\diamond_{T}:}\quad & =t^{:T^{A}}\Rightarrow q^{H^{M^{B}}}\Rightarrow\left(\tilde{f}\left(p^{\downarrow H}q\right)\bef p\right)t\\ - & \quad\quad\text{where }p\triangleq\text{flm}_{M}\left(x\Rightarrow g\,x\,q\right)\\ -{\color{greenunder}\text{substitute }f=\text{id}:}\quad & =t\Rightarrow q\Rightarrow\left(\left(h\Rightarrow k\Rightarrow k\,h\right)\left(p^{\downarrow H}q\right)\bef p\right)t\\ -{\color{greenunder}\text{apply }k\text{ to }p^{\downarrow H}q:}\quad & =t\Rightarrow q\Rightarrow\left(\left(k\Rightarrow k\left(p^{\downarrow H}q\right)\right)\bef p\right)t\\ -{\color{greenunder}\text{definition of }\bef:}\quad & =t\Rightarrow q\Rightarrow p\left(t\left(p^{\downarrow H}q\right)\right)\quad. + & \text{flm}_{T}g^{:A\rightarrow T^{B}}=\text{id}\bef\text{flm}_{T}g\\ +{\color{greenunder}\text{definition of }\diamond_{T}:}\quad & =t^{:T^{A}}\rightarrow q^{H^{M^{B}}}\rightarrow\left(\tilde{f}\left(p^{\downarrow H}q\right)\bef p\right)t\\ + & \quad\quad\text{where }p\triangleq\text{flm}_{M}\left(x\rightarrow g\,x\,q\right)\\ +{\color{greenunder}\text{substitute }f=\text{id}:}\quad & =t\rightarrow q\rightarrow\left(\left(h\rightarrow k\rightarrow k\,h\right)\left(p^{\downarrow H}q\right)\bef p\right)t\\ +{\color{greenunder}\text{apply }k\text{ to }p^{\downarrow H}q:}\quad & =t\rightarrow q\rightarrow\left(\left(k\rightarrow k\left(p^{\downarrow H}q\right)\right)\bef p\right)t\\ +{\color{greenunder}\text{definition of }\bef:}\quad & =t\rightarrow q\rightarrow p\left(t\left(p^{\downarrow H}q\right)\right)\quad. \end{align*} -By definition of the functor $R^{A}\triangleq H^{A}\Rightarrow A$, -we raise any function $p^{:A\Rightarrow B}$ into $R$ as +By definition of the functor $R^{A}\triangleq H^{A}\rightarrow A$, +we raise any function $p^{:A\rightarrow B}$ into $R$ as \begin{align*} -p^{\uparrow R} & :\left(H^{A}\Rightarrow A\right)\Rightarrow H^{B}\Rightarrow B\quad,\\ -p^{\uparrow R}r^{H^{A}\Rightarrow A} & \triangleq p^{\downarrow H}\bef r\bef p\\ - & =q^{H^{B}}\Rightarrow p\left(r\left(p^{\downarrow H}q\right)\right)\quad. +p^{\uparrow R} & :\left(H^{A}\rightarrow A\right)\rightarrow H^{B}\rightarrow B\quad,\\ +p^{\uparrow R}r^{H^{A}\rightarrow A} & \triangleq p^{\downarrow H}\bef r\bef p\\ + & =q^{H^{B}}\rightarrow p\left(r\left(p^{\downarrow H}q\right)\right)\quad. \end{align*} Finally, renaming $g$ to $f$, we obtain the desired code, \[ -\text{flm}_{T}f=t\Rightarrow q\Rightarrow p^{\uparrow R}t\,q\quad\text{where }p\triangleq\text{flm}_{M}\left(x\Rightarrow f\,x\,q\right)\quad. +\text{flm}_{T}f=t\rightarrow q\rightarrow p^{\uparrow R}t\,q\quad\text{where }p\triangleq\text{flm}_{M}\left(x\rightarrow f\,x\,q\right)\quad. \] To express $\text{flm}_{T}$ via $\text{flm}_{R}$, we just need to @@ -3044,12 +3044,12 @@ \subsubsection{Statement \label{subsec:Statement-choice-monad-definition-of-flm} becomes equal to Eq.~(\ref{eq:rigid-monad-flm-T-def}). Comparing these two expressions, we find that we need \[ -\text{flm}_{M}(x\Rightarrow f\,x\,q)=(y\Rightarrow g\,y\,q)\quad. +\text{flm}_{M}(x\rightarrow f\,x\,q)=(y\rightarrow g\,y\,q)\quad. \] -This is achieved if we define $g\,y\,q=\text{flm}_{M}(x^{:A}\Rightarrow f\,x\,q)\,y$, +This is achieved if we define $g\,y\,q=\text{flm}_{M}(x^{:A}\rightarrow f\,x\,q)\,y$, or equivalently \[ -g=y\Rightarrow q\Rightarrow\text{flm}_{M}(x\Rightarrow f\,x\,q)\,y\quad. +g=y\rightarrow q\rightarrow\text{flm}_{M}(x\rightarrow f\,x\,q)\,y\quad. \] This gives the desired Eq.~(\ref{eq:rigid-monad-def-flm-t-via-flm-r}). @@ -3058,32 +3058,32 @@ \subsubsection{Statement \label{subsec:Statement-choice-monad-flatten-swap}\ref{ The monad $T$ has the methods \lstinline!flatten! and \lstinline!swap! defined by \begin{align} -\text{ftn}_{T} & =t^{:T^{T^{A}}}\Rightarrow q^{:H^{M^{A}}}\Rightarrow q\triangleright\bigg(t\triangleright\big(\text{flm}_{M}(x^{:R^{M^{A}}}\Rightarrow x\,q)\big)^{\uparrow R}\bigg)\quad,\label{eq:rigid-monad-def-of-ftn-t-via-forward}\\ -\text{sw}_{R,M} & =m^{:M^{R^{A}}}\Rightarrow q^{:H^{M^{A}}}\Rightarrow\big(r^{:R^{A}}\Rightarrow r(\text{pu}_{M}^{\downarrow H}q)\big)^{\uparrow M}m\quad.\label{eq:rigid-monad-short-formula-for-swap} +\text{ftn}_{T} & =t^{:T^{T^{A}}}\rightarrow q^{:H^{M^{A}}}\rightarrow q\triangleright\bigg(t\triangleright\big(\text{flm}_{M}(x^{:R^{M^{A}}}\rightarrow x\,q)\big)^{\uparrow R}\bigg)\quad,\label{eq:rigid-monad-def-of-ftn-t-via-forward}\\ +\text{sw}_{R,M} & =m^{:M^{R^{A}}}\rightarrow q^{:H^{M^{A}}}\rightarrow\big(r^{:R^{A}}\rightarrow r(\text{pu}_{M}^{\downarrow H}q)\big)^{\uparrow M}m\quad.\label{eq:rigid-monad-short-formula-for-swap} \end{align} These functions are computationally equivalent (can be derived from each other). In the $\triangleright$-notation, the formula for $\text{sw}_{R,M}$ is \begin{equation} -q\triangleright\big(m\triangleright\text{sw}_{R,M}\big)=m\triangleright(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)^{\uparrow M}\quad.\label{eq:rigid-monad-1-forward-formula-for-swap} +q\triangleright\big(m\triangleright\text{sw}_{R,M}\big)=m\triangleright(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)^{\uparrow M}\quad.\label{eq:rigid-monad-1-forward-formula-for-swap} \end{equation} \subparagraph{Proof} Using Eq.~(\ref{eq:rigid-monad-flm-T-def}) and the relationship -$\text{ftn}_{T}=\text{flm}_{T}\text{id}^{:T^{A}\Rightarrow T^{A}}$, +$\text{ftn}_{T}=\text{flm}_{T}\text{id}^{:T^{A}\rightarrow T^{A}}$, we find \begin{align*} \text{ftn}_{T}t^{:T^{T^{A}}} & =\gunderline{\text{flm}_{T}}(\text{id})\,t\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-flm-T-def})}:}\quad & =q\Rightarrow\big(\text{flm}_{M}(x^{:A}\Rightarrow f\,x\,q)\big)^{\uparrow R}\gunderline{t\,q}\\ -{\color{greenunder}\text{definition of }\triangleright:}\quad & =q\Rightarrow\gunderline{q\triangleright\big(t\triangleright\big(}\text{flm}_{M}(x^{:A}\Rightarrow f\,x\,q)\big)^{\uparrow R}\big)\quad. +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-flm-T-def})}:}\quad & =q\rightarrow\big(\text{flm}_{M}(x^{:A}\rightarrow f\,x\,q)\big)^{\uparrow R}\gunderline{t\,q}\\ +{\color{greenunder}\text{definition of }\triangleright:}\quad & =q\rightarrow\gunderline{q\triangleright\big(t\triangleright\big(}\text{flm}_{M}(x^{:A}\rightarrow f\,x\,q)\big)^{\uparrow R}\big)\quad. \end{align*} Using Eq.~(\ref{eq:rigid-monad-def-flm-t-via-flm-r}) instead of Eq.~(\ref{eq:rigid-monad-flm-T-def}), we get \begin{align*} \text{ftn}_{T} & =\text{flm}_{T}(\text{id})\\ - & =\text{flm}_{R}\left(y\Rightarrow q\Rightarrow\text{flm}_{M}(x\Rightarrow x\,q)\,y\right)\quad. + & =\text{flm}_{R}\left(y\rightarrow q\rightarrow\text{flm}_{M}(x\rightarrow x\,q)\,y\right)\quad. \end{align*} @@ -3093,12 +3093,12 @@ \subsubsection{Statement \label{subsec:Statement-choice-monad-flatten-swap}\ref{ Eq.~(\ref{eq:define-swap-via-flatten}): \begin{align} \text{sw}_{R,M}(m) & =m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\bef\gunderline{\text{ftn}_{T}}\nonumber \\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-def-flm-t-via-flm-r})}:}\quad & =m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\gunderline{\text{pu}_{R}\bef\text{flm}_{R}}\left(y\Rightarrow q\Rightarrow\text{flm}_{M}(x\Rightarrow x\,q)\,y\right)\nonumber \\ -{\color{greenunder}\text{left identity law of }R:}\quad & =m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\gunderline{\bef}\big(y\Rightarrow q\Rightarrow\text{flm}_{M}(x\Rightarrow x\,q)\gunderline{\,y}\big)\nonumber \\ -{\color{greenunder}\triangleright\text{ notation}:}\quad & =m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\gunderline{\triangleright\big(y\Rightarrow}q\Rightarrow\gunderline y\triangleright\text{flm}_{M}(x\Rightarrow x\,q)\big)\\ -{\color{greenunder}\text{apply to argument }y:}\quad & =q\Rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\triangleright\gunderline{\text{flm}_{M}}\left(x\Rightarrow x\,q\right)\nonumber \\ -{\color{greenunder}\text{express }\text{flm}_{M}\text{ via }\text{ftn}_{M}:}\quad & =q\Rightarrow m\triangleright\gunderline{\text{pu}_{M}^{\uparrow R\uparrow M}\bef(x\Rightarrow x\,q)^{\uparrow M}}\bef\text{ftn}_{M}\nonumber \\ -{\color{greenunder}\text{composition law of }M:}\quad & =q\Rightarrow m\triangleright\big(\text{pu}_{M}^{\uparrow R}\bef(x\Rightarrow x\,q)\big)^{\uparrow M}\bef\text{ftn}_{M}\quad.\label{eq:rigid-monad-swap-derivation2} +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-def-flm-t-via-flm-r})}:}\quad & =m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\gunderline{\text{pu}_{R}\bef\text{flm}_{R}}\left(y\rightarrow q\rightarrow\text{flm}_{M}(x\rightarrow x\,q)\,y\right)\nonumber \\ +{\color{greenunder}\text{left identity law of }R:}\quad & =m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\gunderline{\bef}\big(y\rightarrow q\rightarrow\text{flm}_{M}(x\rightarrow x\,q)\gunderline{\,y}\big)\nonumber \\ +{\color{greenunder}\triangleright\text{ notation}:}\quad & =m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\gunderline{\triangleright\big(y\rightarrow}q\rightarrow\gunderline y\triangleright\text{flm}_{M}(x\rightarrow x\,q)\big)\\ +{\color{greenunder}\text{apply to argument }y:}\quad & =q\rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\triangleright\gunderline{\text{flm}_{M}}\left(x\rightarrow x\,q\right)\nonumber \\ +{\color{greenunder}\text{express }\text{flm}_{M}\text{ via }\text{ftn}_{M}:}\quad & =q\rightarrow m\triangleright\gunderline{\text{pu}_{M}^{\uparrow R\uparrow M}\bef(x\rightarrow x\,q)^{\uparrow M}}\bef\text{ftn}_{M}\nonumber \\ +{\color{greenunder}\text{composition law of }M:}\quad & =q\rightarrow m\triangleright\big(\text{pu}_{M}^{\uparrow R}\bef(x\rightarrow x\,q)\big)^{\uparrow M}\bef\text{ftn}_{M}\quad.\label{eq:rigid-monad-swap-derivation2} \end{align} \begin{comment} To derive the formula for $\text{sw}_{R,M}$, we start with $\text{ftn}_{T}$ @@ -3106,9 +3106,9 @@ \subsubsection{Statement \label{subsec:Statement-choice-monad-flatten-swap}\ref{ \begin{align} & \text{sw}_{R,M}(m)=m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\gunderline{\bef\text{ftn}_{T}}\nonumber \\ {\color{greenunder}\triangleright\text{ notation}:}\quad & =\big(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\big)\triangleright\gunderline{\text{ftn}_{T}}\nonumber \\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-def-of-ftn-t-via-forward})}:}\quad & =q\Rightarrow q\triangleright\bigg(\big(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\gunderline{\big)\triangleright\big(}\text{flm}_{M}(x\Rightarrow x\,q)\big)^{\uparrow R}\bigg)\nonumber \\ -{\color{greenunder}\triangleright\text{ notation}:}\quad & =q\Rightarrow q\triangleright\bigg(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\gunderline{\text{pu}_{R}\bef\big(\text{flm}_{M}(x\Rightarrow x\,q)\big)^{\uparrow R}}\bigg)\nonumber \\ -{\color{greenunder}\text{pu}_{R}\text{'s naturality}:}\quad & =q\Rightarrow q\triangleright\bigg(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{flm}_{M}(x\Rightarrow x\,q)\bef\text{pu}_{R}\bigg)\quad.\label{eq:rigid-monad-swap-derivation1} +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-def-of-ftn-t-via-forward})}:}\quad & =q\rightarrow q\triangleright\bigg(\big(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\gunderline{\big)\triangleright\big(}\text{flm}_{M}(x\rightarrow x\,q)\big)^{\uparrow R}\bigg)\nonumber \\ +{\color{greenunder}\triangleright\text{ notation}:}\quad & =q\rightarrow q\triangleright\bigg(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\gunderline{\text{pu}_{R}\bef\big(\text{flm}_{M}(x\rightarrow x\,q)\big)^{\uparrow R}}\bigg)\nonumber \\ +{\color{greenunder}\text{pu}_{R}\text{'s naturality}:}\quad & =q\rightarrow q\triangleright\bigg(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{flm}_{M}(x\rightarrow x\,q)\bef\text{pu}_{R}\bigg)\quad.\label{eq:rigid-monad-swap-derivation1} \end{align} To proceed, we need to use the definition of $\text{pu}_{R}$ written as $\text{pu}_{R}x\,y=x$, or in the pipe notation, @@ -3118,39 +3118,39 @@ \subsubsection{Statement \label{subsec:Statement-choice-monad-flatten-swap}\ref{ With this simplification at hand, we continue from Eq.~(\ref{eq:rigid-monad-swap-derivation1}) as \begin{align*} -{\color{greenunder}\text{Eq.~(\ref{eq:rigid-monad-swap-derivation1})}:}\quad & q\Rightarrow q\triangleright\bigg(\big(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{flm}_{M}(x\Rightarrow x\,q)\gunderline{\big)\triangleright\text{pu}_{R}}\bigg)\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-pure-t-simplification})}:}\quad & =q\Rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\gunderline{\text{flm}_{M}(x\Rightarrow x\,q)}\\ -{\color{greenunder}\text{express }\text{flm}_{M}\text{ via }\text{ftn}_{M}:}\quad & =q\Rightarrow m\triangleright\gunderline{\text{pu}_{M}^{\uparrow R\uparrow M}\bef(x\Rightarrow x\,q)^{\uparrow M}}\bef\text{ftn}_{M}\\ -{\color{greenunder}\text{composition law of }M:}\quad & =q\Rightarrow m\triangleright\big(\text{pu}_{M}^{\uparrow R}\bef(x\Rightarrow x\,q)\big)^{\uparrow M}\bef\text{ftn}_{M}\quad. +{\color{greenunder}\text{Eq.~(\ref{eq:rigid-monad-swap-derivation1})}:}\quad & q\rightarrow q\triangleright\bigg(\big(m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{flm}_{M}(x\rightarrow x\,q)\gunderline{\big)\triangleright\text{pu}_{R}}\bigg)\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-pure-t-simplification})}:}\quad & =q\rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\gunderline{\text{flm}_{M}(x\rightarrow x\,q)}\\ +{\color{greenunder}\text{express }\text{flm}_{M}\text{ via }\text{ftn}_{M}:}\quad & =q\rightarrow m\triangleright\gunderline{\text{pu}_{M}^{\uparrow R\uparrow M}\bef(x\rightarrow x\,q)^{\uparrow M}}\bef\text{ftn}_{M}\\ +{\color{greenunder}\text{composition law of }M:}\quad & =q\rightarrow m\triangleright\big(\text{pu}_{M}^{\uparrow R}\bef(x\rightarrow x\,q)\big)^{\uparrow M}\bef\text{ftn}_{M}\quad. \end{align*} \end{comment} It appears that simplifying this expression requires to rewrite the -function $\text{pu}_{M}^{\uparrow R}\bef(x\Rightarrow x\,q)$. To +function $\text{pu}_{M}^{\uparrow R}\bef(x\rightarrow x\,q)$. To proceed further, we need to use the definition of raising a function -$f^{:A\Rightarrow B}$ to the functor $R$, +$f^{:A\rightarrow B}$ to the functor $R$, \[ -f^{\uparrow R}\triangleq r^{:R^{A}}\Rightarrow f^{\downarrow H}\bef r\bef f\quad, +f^{\uparrow R}\triangleq r^{:R^{A}}\rightarrow f^{\downarrow H}\bef r\bef f\quad, \] so we can write \begin{align} - & \text{pu}_{M}^{\uparrow R}\bef(x\Rightarrow x\,q)\nonumber \\ -{\color{greenunder}\text{function composition}:}\quad & =r\Rightarrow\gunderline{\text{pu}_{M}^{\uparrow R}r\,q}\nonumber \\ -{\color{greenunder}\text{definition of }^{\uparrow R}:}\quad & =\gunderline{r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\bef}\text{pu}_{M}\nonumber \\ -{\color{greenunder}\text{forward composition}:}\quad & =\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\bef\text{pu}_{M}\quad.\label{eq:rigid-monad-swap-derivation3} + & \text{pu}_{M}^{\uparrow R}\bef(x\rightarrow x\,q)\nonumber \\ +{\color{greenunder}\text{function composition}:}\quad & =r\rightarrow\gunderline{\text{pu}_{M}^{\uparrow R}r\,q}\nonumber \\ +{\color{greenunder}\text{definition of }^{\uparrow R}:}\quad & =\gunderline{r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\bef}\text{pu}_{M}\nonumber \\ +{\color{greenunder}\text{forward composition}:}\quad & =\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\bef\text{pu}_{M}\quad.\label{eq:rigid-monad-swap-derivation3} \end{align} In deriving Eq.~(\ref{eq:rigid-monad-swap-derivation3}), we used the general property of the forward composition, \[ -x\Rightarrow y\triangleright f(x,y)\bef g\quad=\quad\left(x\Rightarrow y\triangleright f(x,y)\right)\bef g\quad, +x\rightarrow y\triangleright f(x,y)\bef g\quad=\quad\left(x\rightarrow y\triangleright f(x,y)\right)\bef g\quad, \] where $g$ must not depend on $x$ or $y$. We can now rewrite Eq.~(\ref{eq:rigid-monad-swap-derivation2}) as \begin{align*} - & q\Rightarrow m\triangleright\big(\gunderline{\text{pu}_{M}^{\uparrow R}\bef(x\Rightarrow x\,q)}\big)^{\uparrow M}\bef\text{ftn}_{M}\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-swap-derivation3})}:}\quad & =q\Rightarrow m\triangleright\big(\gunderline{(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\bef\text{pu}_{M}}\big)^{\uparrow M}\bef\text{ftn}_{M}\\ -{\color{greenunder}\text{functor composition for }M:}\quad & =q\Rightarrow m\triangleright\big((r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\bef\gunderline{\text{pu}_{M}^{\uparrow M}\bef\text{ftn}_{M}}\\ -{\color{greenunder}\text{identity law of }M:}\quad & =q\Rightarrow\gunderline{m\triangleright\big(}(r\Rightarrow\gunderline{q\triangleright\text{pu}_{M}^{\downarrow H}\bef r})\big)^{\uparrow M}\\ -{\color{greenunder}\triangleright\text{ notation}:}\quad & =q\Rightarrow\big(r\Rightarrow r(\text{pu}_{M}^{\downarrow H}q)\big)^{\uparrow M}m\quad. + & q\rightarrow m\triangleright\big(\gunderline{\text{pu}_{M}^{\uparrow R}\bef(x\rightarrow x\,q)}\big)^{\uparrow M}\bef\text{ftn}_{M}\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-swap-derivation3})}:}\quad & =q\rightarrow m\triangleright\big(\gunderline{(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\bef\text{pu}_{M}}\big)^{\uparrow M}\bef\text{ftn}_{M}\\ +{\color{greenunder}\text{functor composition for }M:}\quad & =q\rightarrow m\triangleright\big((r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\bef\gunderline{\text{pu}_{M}^{\uparrow M}\bef\text{ftn}_{M}}\\ +{\color{greenunder}\text{identity law of }M:}\quad & =q\rightarrow\gunderline{m\triangleright\big(}(r\rightarrow\gunderline{q\triangleright\text{pu}_{M}^{\downarrow H}\bef r})\big)^{\uparrow M}\\ +{\color{greenunder}\triangleright\text{ notation}:}\quad & =q\rightarrow\big(r\rightarrow r(\text{pu}_{M}^{\downarrow H}q)\big)^{\uparrow M}m\quad. \end{align*} The last expression coincides with Eq.~(\ref{eq:rigid-monad-short-formula-for-swap}). @@ -3160,10 +3160,10 @@ \subsubsection{Statement \label{subsec:Statement-choice-monad-flatten-swap}\ref{ the bound variables $m$ and $q$ inside Eq.~(\ref{eq:rigid-monad-short-formula-for-swap}) to $m_{1}$ and $q_{1}$: \begin{align*} - & q\triangleright\big(\gunderline{m\triangleright\big(m_{1}}\Rightarrow q_{1}\Rightarrow\big(r\Rightarrow r(\text{pu}_{M}^{\downarrow H}q_{1})\big)^{\uparrow M}\gunderline{m_{1}}\big)\big)\\ -{\color{greenunder}\text{apply to argument }m:}\quad & =\gunderline{q\triangleright\big(q_{1}}\Rightarrow m\triangleright\big(r\Rightarrow r(\text{pu}_{M}^{\downarrow H}\gunderline{q_{1}})\big)^{\uparrow M}\big)\\ -{\color{greenunder}\text{apply to argument }q:}\quad & =m\triangleright\big(r\Rightarrow\gunderline{r(\text{pu}_{M}^{\downarrow H}q)}\big)^{\uparrow M}\\ -{\color{greenunder}\triangleright\text{ notation}:}\quad & =m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\quad. + & q\triangleright\big(\gunderline{m\triangleright\big(m_{1}}\rightarrow q_{1}\rightarrow\big(r\rightarrow r(\text{pu}_{M}^{\downarrow H}q_{1})\big)^{\uparrow M}\gunderline{m_{1}}\big)\big)\\ +{\color{greenunder}\text{apply to argument }m:}\quad & =\gunderline{q\triangleright\big(q_{1}}\rightarrow m\triangleright\big(r\rightarrow r(\text{pu}_{M}^{\downarrow H}\gunderline{q_{1}})\big)^{\uparrow M}\big)\\ +{\color{greenunder}\text{apply to argument }q:}\quad & =m\triangleright\big(r\rightarrow\gunderline{r(\text{pu}_{M}^{\downarrow H}q)}\big)^{\uparrow M}\\ +{\color{greenunder}\triangleright\text{ notation}:}\quad & =m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\quad. \end{align*} @@ -3177,38 +3177,38 @@ \subsubsection{Statement \label{subsec:Statement-choice-monad-flatten-swap}\ref{ {\color{greenunder}\text{naturality of }\text{ftn}_{R}:}\quad & =\gunderline{\text{sw}^{\uparrow R}\bef\text{ftn}_{M}^{\uparrow R\uparrow R}}\bef\text{ftn}_{R}\nonumber \\ {\color{greenunder}\text{composition under }R:}\quad & =\big(\text{sw}\bef\text{ftn}_{M}^{\uparrow R}\gunderline{\big)^{\uparrow R}\bef\text{ftn}_{R}}\nonumber \\ {\color{greenunder}\text{relating }\text{flm}_{R}\text{ and }\text{ftn}_{R}:}\quad & =\gunderline{\text{flm}_{R}(}\text{sw}\bef\text{ftn}_{M}^{\uparrow R})\nonumber \\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-flm-R-def})}:}\quad & =t\Rightarrow q\Rightarrow(x^{:A}\Rightarrow(\text{sw}\bef\text{ftn}_{M}^{\uparrow R})\,x\,q)^{\uparrow R}\,t\,q\quad.\label{eq:rigid-monad-swap-ftn-derivation-4a} +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-flm-R-def})}:}\quad & =t\rightarrow q\rightarrow(x^{:A}\rightarrow(\text{sw}\bef\text{ftn}_{M}^{\uparrow R})\,x\,q)^{\uparrow R}\,t\,q\quad.\label{eq:rigid-monad-swap-ftn-derivation-4a} \end{align} To proceed, we need to transform $\text{sw}\bef\text{ftn}_{M}^{\uparrow R}$ in some way: \begin{align} & \text{sw}\bef\text{ftn}_{M}^{\uparrow R}\nonumber \\ -{\color{greenunder}\text{definitions}:}\quad & =\big(m\Rightarrow q\Rightarrow m\triangleright\big((r\Rightarrow\gunderline q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\big)\bef(\gunderline{r\Rightarrow\text{ftn}_{M}^{\downarrow H}\bef r\bef\text{ftn}_{M}})\nonumber \\ -{\color{greenunder}\text{composition}:}\quad & =m\Rightarrow\gunderline{\text{ftn}_{M}^{\downarrow H}}\bef\big(q\Rightarrow m\triangleright\big((r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\big)\bef\text{ftn}_{M}\nonumber \\ -{\color{greenunder}\text{expansion}:}\quad & =m\Rightarrow\big(q\Rightarrow\gunderline{q\triangleright\text{ftn}_{M}^{\downarrow H}}\big)\bef\big(q\Rightarrow m\triangleright\big((r\Rightarrow\gunderline q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\big)\bef\text{ftn}_{M}\nonumber \\ -{\color{greenunder}\text{composition}:}\quad & =m\Rightarrow\big(q\Rightarrow m\triangleright\big((r\Rightarrow\gunderline{q\triangleright\text{ftn}_{M}^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r)\big)^{\uparrow M}\big)\bef\text{ftn}_{M}\quad.\label{eq:rigid-monad-swap-ftn-derivation4} +{\color{greenunder}\text{definitions}:}\quad & =\big(m\rightarrow q\rightarrow m\triangleright\big((r\rightarrow\gunderline q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\big)\bef(\gunderline{r\rightarrow\text{ftn}_{M}^{\downarrow H}\bef r\bef\text{ftn}_{M}})\nonumber \\ +{\color{greenunder}\text{composition}:}\quad & =m\rightarrow\gunderline{\text{ftn}_{M}^{\downarrow H}}\bef\big(q\rightarrow m\triangleright\big((r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\big)\bef\text{ftn}_{M}\nonumber \\ +{\color{greenunder}\text{expansion}:}\quad & =m\rightarrow\big(q\rightarrow\gunderline{q\triangleright\text{ftn}_{M}^{\downarrow H}}\big)\bef\big(q\rightarrow m\triangleright\big((r\rightarrow\gunderline q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\big)\bef\text{ftn}_{M}\nonumber \\ +{\color{greenunder}\text{composition}:}\quad & =m\rightarrow\big(q\rightarrow m\triangleright\big((r\rightarrow\gunderline{q\triangleright\text{ftn}_{M}^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r)\big)^{\uparrow M}\big)\bef\text{ftn}_{M}\quad.\label{eq:rigid-monad-swap-ftn-derivation4} \end{align} -We can transform the sub-expression $(r\Rightarrow q\triangleright\text{ftn}_{M}^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}\bef r)$ +We can transform the sub-expression $(r\rightarrow q\triangleright\text{ftn}_{M}^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}\bef r)$ to \begin{align} -{\color{greenunder}\triangleright\text{ notation}:}\quad & r\Rightarrow q\triangleright\gunderline{\text{ftn}_{M}^{\downarrow H}\bef\text{pu}_{M}^{\downarrow H}}\bef r\nonumber \\ -{\color{greenunder}\text{composition law of }H:}\quad & =r\Rightarrow q\triangleright(\gunderline{\text{pu}_{M}\bef\text{ftn}_{M}})^{\downarrow H}\bef r\nonumber \\ -{\color{greenunder}\text{left identity law of }M:}\quad & =r\Rightarrow\gunderline{q\triangleright r}\nonumber \\ -{\color{greenunder}\triangleright\text{ notation}:}\quad & =r\Rightarrow r(q)\quad.\label{eq:rigid-monad-swap-ftn-derivation5} +{\color{greenunder}\triangleright\text{ notation}:}\quad & r\rightarrow q\triangleright\gunderline{\text{ftn}_{M}^{\downarrow H}\bef\text{pu}_{M}^{\downarrow H}}\bef r\nonumber \\ +{\color{greenunder}\text{composition law of }H:}\quad & =r\rightarrow q\triangleright(\gunderline{\text{pu}_{M}\bef\text{ftn}_{M}})^{\downarrow H}\bef r\nonumber \\ +{\color{greenunder}\text{left identity law of }M:}\quad & =r\rightarrow\gunderline{q\triangleright r}\nonumber \\ +{\color{greenunder}\triangleright\text{ notation}:}\quad & =r\rightarrow r(q)\quad.\label{eq:rigid-monad-swap-ftn-derivation5} \end{align} Using this simplification, we continue transforming Eq.~(\ref{eq:rigid-monad-swap-ftn-derivation4}) as \begin{align*} - & m\Rightarrow\big(q\Rightarrow m\triangleright\big((r\Rightarrow\gunderline{q\triangleright\text{ftn}_{M}^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}\bef r})\big)^{\uparrow M}\big)\bef\text{ftn}_{M}\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-swap-ftn-derivation5})}:}\quad & =m\Rightarrow\gunderline{\big(}q\Rightarrow m\triangleright(r\Rightarrow r(q))^{\uparrow M}\gunderline{\big)\bef}\text{ftn}_{M}\\ -{\color{greenunder}\text{composition}:}\quad & =m\Rightarrow q\Rightarrow m\triangleright(r\Rightarrow r(q)\gunderline{)^{\uparrow M}\bef\text{ftn}_{M}}\\ -{\color{greenunder}\text{relating }\text{flm}_{M}\text{ and }\text{ftn}_{M}:}\quad & =m\Rightarrow q\Rightarrow\text{flm}_{M}\left(r\Rightarrow r(q)\right)m\quad. + & m\rightarrow\big(q\rightarrow m\triangleright\big((r\rightarrow\gunderline{q\triangleright\text{ftn}_{M}^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}\bef r})\big)^{\uparrow M}\big)\bef\text{ftn}_{M}\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-swap-ftn-derivation5})}:}\quad & =m\rightarrow\gunderline{\big(}q\rightarrow m\triangleright(r\rightarrow r(q))^{\uparrow M}\gunderline{\big)\bef}\text{ftn}_{M}\\ +{\color{greenunder}\text{composition}:}\quad & =m\rightarrow q\rightarrow m\triangleright(r\rightarrow r(q)\gunderline{)^{\uparrow M}\bef\text{ftn}_{M}}\\ +{\color{greenunder}\text{relating }\text{flm}_{M}\text{ and }\text{ftn}_{M}:}\quad & =m\rightarrow q\rightarrow\text{flm}_{M}\left(r\rightarrow r(q)\right)m\quad. \end{align*} Substituting this instead of $\text{sw}\bef\text{ftn}_{M}^{\uparrow R}$ into Eq.~(\ref{eq:rigid-monad-swap-ftn-derivation-4a}), we get \begin{align*} - & \quad t\Rightarrow q\Rightarrow(x\Rightarrow(\gunderline{\text{sw}\bef\text{ftn}_{M}^{\uparrow R}})\,x\,q)^{\uparrow R}\,t\,q\\ - & =t\Rightarrow q\Rightarrow(x\Rightarrow\text{flm}_{M}\left(r\Rightarrow r(q)\right)x)^{\uparrow R}\,t\,q\quad. + & \quad t\rightarrow q\rightarrow(x\rightarrow(\gunderline{\text{sw}\bef\text{ftn}_{M}^{\uparrow R}})\,x\,q)^{\uparrow R}\,t\,q\\ + & =t\rightarrow q\rightarrow(x\rightarrow\text{flm}_{M}\left(r\rightarrow r(q)\right)x)^{\uparrow R}\,t\,q\quad. \end{align*} The last expression is the same as Eq.~(\ref{eq:rigid-monad-def-of-ftn-t-via-forward}). @@ -3232,17 +3232,17 @@ \subsubsection{Statement \label{subsec:Statement-swap-laws-rigid-monad}\ref{subs Compute \begin{align} & \text{pu}_{R}^{\uparrow M}\bef\gunderline{\text{sw}}\nonumber \\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-short-formula-for-swap})}:}\quad & =\big(m\Rightarrow\gunderline{m\triangleright\text{pu}_{R}^{\uparrow M}}\big)\bef\big(m\Rightarrow q\Rightarrow\gunderline m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\big)\nonumber \\ -{\color{greenunder}\text{function composition}:}\quad & =m\Rightarrow q\Rightarrow m\triangleright\gunderline{\text{pu}_{R}^{\uparrow M}\bef\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}}\nonumber \\ -{\color{greenunder}\text{functor law of }M:}\quad & =m\Rightarrow q\Rightarrow m\triangleright\big(\text{pu}_{R}\bef\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\big)^{\uparrow M}\quad.\label{eq:swap-laws-derivation1a} +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-short-formula-for-swap})}:}\quad & =\big(m\rightarrow\gunderline{m\triangleright\text{pu}_{R}^{\uparrow M}}\big)\bef\big(m\rightarrow q\rightarrow\gunderline m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\big)\nonumber \\ +{\color{greenunder}\text{function composition}:}\quad & =m\rightarrow q\rightarrow m\triangleright\gunderline{\text{pu}_{R}^{\uparrow M}\bef\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}}\nonumber \\ +{\color{greenunder}\text{functor law of }M:}\quad & =m\rightarrow q\rightarrow m\triangleright\big(\text{pu}_{R}\bef\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\big)^{\uparrow M}\quad.\label{eq:swap-laws-derivation1a} \end{align} -To proceed, we simplify the expression $\text{pu}_{R}\bef(r\Rightarrow...)$: +To proceed, we simplify the expression $\text{pu}_{R}\bef(r\rightarrow...)$: \begin{align} - & \text{pu}_{R}\bef\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\nonumber \\ -{\color{greenunder}\text{argument expansion}:}\quad & =(m\Rightarrow m\triangleright\text{pu}_{R})\bef\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright r\big)\nonumber \\ -{\color{greenunder}\text{function composition}:}\quad & =m\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright\left(m\triangleright\text{pu}_{R}\right)\quad.\label{eq:swap-laws-derivation1} + & \text{pu}_{R}\bef\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\nonumber \\ +{\color{greenunder}\text{argument expansion}:}\quad & =(m\rightarrow m\triangleright\text{pu}_{R})\bef\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright r\big)\nonumber \\ +{\color{greenunder}\text{function composition}:}\quad & =m\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright\left(m\triangleright\text{pu}_{R}\right)\quad.\label{eq:swap-laws-derivation1} \end{align} -We now have to use the definition of $\text{pu}_{R}$, which is $\text{pu}_{R}=x\Rightarrow y\Rightarrow x$, +We now have to use the definition of $\text{pu}_{R}$, which is $\text{pu}_{R}=x\rightarrow y\rightarrow x$, or in the pipe notation, \begin{equation} y\triangleright\left(x\triangleright\text{pu}_{R}\right)=x\quad.\label{eq:rigid-monad-pure-t-simplification-1} @@ -3250,14 +3250,14 @@ \subsubsection{Statement \label{subsec:Statement-swap-laws-rigid-monad}\ref{subs With this simplification at hand, we continue from Eq.~(\ref{eq:swap-laws-derivation1}) to \begin{align*} - & m\Rightarrow\gunderline{q\triangleright\text{pu}_{M}^{\downarrow H}}\triangleright\left(m\triangleright\text{pu}_{R}\right)\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-pure-t-simplification-1})}:}\quad & =m\Rightarrow m=\text{id}\quad. + & m\rightarrow\gunderline{q\triangleright\text{pu}_{M}^{\downarrow H}}\triangleright\left(m\triangleright\text{pu}_{R}\right)\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-pure-t-simplification-1})}:}\quad & =m\rightarrow m=\text{id}\quad. \end{align*} Therefore, Eq.~(\ref{eq:swap-laws-derivation1a}) becomes \begin{align*} - & m\Rightarrow q\Rightarrow m\triangleright\gunderline{\big(\text{pu}_{R}\bef\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\big)^{\uparrow M}}\\ - & =(m\Rightarrow q\Rightarrow\gunderline{m\triangleright\text{id}})\\ - & =(m\Rightarrow q\Rightarrow m)=\text{pu}_{R}\quad. + & m\rightarrow q\rightarrow m\triangleright\gunderline{\big(\text{pu}_{R}\bef\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\big)^{\uparrow M}}\\ + & =(m\rightarrow q\rightarrow\gunderline{m\triangleright\text{id}})\\ + & =(m\rightarrow q\rightarrow m)=\text{pu}_{R}\quad. \end{align*} This proves the inner-identity law. @@ -3266,12 +3266,12 @@ \subsubsection{Statement \label{subsec:Statement-swap-laws-rigid-monad}\ref{subs The left-hand side of this law is \begin{align*} & \text{pu}_{M}\bef\gunderline{\text{sw}}\\ -{\color{greenunder}\text{Eq.~(\ref{eq:rigid-monad-short-formula-for-swap})}:}\quad & =\big(m\Rightarrow\gunderline{m\triangleright\text{pu}_{M}}\big)\bef\big(m\Rightarrow q\Rightarrow\gunderline m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\big)\\ -{\color{greenunder}\text{function composition}:}\quad & =m\Rightarrow q\Rightarrow m\triangleright\gunderline{\text{pu}_{M}\bef\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}}\\ -{\color{greenunder}\text{naturality of }\text{pu}_{M}:}\quad & =m\Rightarrow q\Rightarrow m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\bef\text{pu}_{M}\\ -{\color{greenunder}\triangleright\text{ notation}:}\quad & =m\Rightarrow q\Rightarrow\gunderline{m\triangleright\big(r\Rightarrow}q\triangleright\text{pu}_{M}^{\downarrow H}\bef\gunderline r\bef\text{pu}_{M}\big)\\ -{\color{greenunder}\text{apply function to }m:}\quad & =m\Rightarrow\gunderline{q\Rightarrow q}\triangleright\text{pu}_{M}^{\downarrow H}\bef m\bef\text{pu}_{M}\\ -{\color{greenunder}\text{argument expansion}:}\quad & =m\Rightarrow\text{pu}_{M}^{\downarrow H}\bef m\bef\text{pu}_{M}\\ +{\color{greenunder}\text{Eq.~(\ref{eq:rigid-monad-short-formula-for-swap})}:}\quad & =\big(m\rightarrow\gunderline{m\triangleright\text{pu}_{M}}\big)\bef\big(m\rightarrow q\rightarrow\gunderline m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\big)\\ +{\color{greenunder}\text{function composition}:}\quad & =m\rightarrow q\rightarrow m\triangleright\gunderline{\text{pu}_{M}\bef\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}}\\ +{\color{greenunder}\text{naturality of }\text{pu}_{M}:}\quad & =m\rightarrow q\rightarrow m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\bef\text{pu}_{M}\\ +{\color{greenunder}\triangleright\text{ notation}:}\quad & =m\rightarrow q\rightarrow\gunderline{m\triangleright\big(r\rightarrow}q\triangleright\text{pu}_{M}^{\downarrow H}\bef\gunderline r\bef\text{pu}_{M}\big)\\ +{\color{greenunder}\text{apply function to }m:}\quad & =m\rightarrow\gunderline{q\rightarrow q}\triangleright\text{pu}_{M}^{\downarrow H}\bef m\bef\text{pu}_{M}\\ +{\color{greenunder}\text{argument expansion}:}\quad & =m\rightarrow\text{pu}_{M}^{\downarrow H}\bef m\bef\text{pu}_{M}\\ {\color{greenunder}\text{definition of }{}^{\uparrow R}:}\quad & =\text{pu}_{M}^{\uparrow R}\quad. \end{align*} This is equal to the right-hand side of the law. @@ -3289,61 +3289,61 @@ \subsubsection{Statement \label{subsec:Statement-swap-laws-rigid-monad}\ref{subs from Eq.~(\ref{eq:rigid-monad-flm-R-def}): \begin{align} \text{ftn}_{R} & =\text{flm}_{R}(\text{id})\nonumber \\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-flm-R-def})}:}\quad & =t\Rightarrow q\Rightarrow(x\Rightarrow x\,q)^{\uparrow R}t\,q\nonumber \\ -{\color{greenunder}\text{definition of }^{\uparrow R}:}\quad & =t\Rightarrow q\Rightarrow\gunderline{\big(r\Rightarrow}(x\Rightarrow x\,q)^{\downarrow H}\bef r\bef(x\Rightarrow x\,)\gunderline{\big)\,t}\,q\nonumber \\ -{\color{greenunder}\text{apply to argument}:}\quad & =t\Rightarrow q\Rightarrow\big((x\Rightarrow q\triangleright x)^{\downarrow H}\bef t\bef(x\gunderline{\Rightarrow x\,q})\gunderline{\big)\,q}\nonumber \\ -{\color{greenunder}\text{use }\triangleright\text{ notation}:}\quad & =t\Rightarrow q\Rightarrow\gunderline{q\triangleright\big(q\triangleright(}x\Rightarrow q\triangleright x)^{\downarrow H}\bef t\big)\quad.\label{eq:ftn-R-simplified} +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-flm-R-def})}:}\quad & =t\rightarrow q\rightarrow(x\rightarrow x\,q)^{\uparrow R}t\,q\nonumber \\ +{\color{greenunder}\text{definition of }^{\uparrow R}:}\quad & =t\rightarrow q\rightarrow\gunderline{\big(r\rightarrow}(x\rightarrow x\,q)^{\downarrow H}\bef r\bef(x\rightarrow x\,)\gunderline{\big)\,t}\,q\nonumber \\ +{\color{greenunder}\text{apply to argument}:}\quad & =t\rightarrow q\rightarrow\big((x\rightarrow q\triangleright x)^{\downarrow H}\bef t\bef(x\gunderline{\rightarrow x\,q})\gunderline{\big)\,q}\nonumber \\ +{\color{greenunder}\text{use }\triangleright\text{ notation}:}\quad & =t\rightarrow q\rightarrow\gunderline{q\triangleright\big(q\triangleright(}x\rightarrow q\triangleright x)^{\downarrow H}\bef t\big)\quad.\label{eq:ftn-R-simplified} \end{align} We first apply the left-hand side of the law~(\ref{eq:swap-law-3-formulation-R-M}) to $m$ and $q$: \begin{align*} & q\triangleright\big(m\triangleright\text{ftn}_{R}^{\uparrow M}\gunderline{\bef}\text{sw}\big)\\ \triangleright\text{ notation}: & =q\triangleright\big(m\triangleright\text{ftn}_{R}^{\uparrow M}\triangleright\gunderline{\text{sw}}\big)\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:}\quad & =m\triangleright\gunderline{\text{ftn}_{R}^{\uparrow M}\bef(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)^{\uparrow M}}\\ -{\color{greenunder}\text{composition law for }M:}\quad & =m\triangleright\big(\text{ftn}_{R}\bef(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\quad. +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:}\quad & =m\triangleright\gunderline{\text{ftn}_{R}^{\uparrow M}\bef(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)^{\uparrow M}}\\ +{\color{greenunder}\text{composition law for }M:}\quad & =m\triangleright\big(\text{ftn}_{R}\bef(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\quad. \end{align*} We now need to simplify the sub-expression under $(...)^{\uparrow M}$: \begin{align*} - & \text{ftn}_{R}\gunderline{\bef(r}\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright r)\\ -{\color{greenunder}\text{function composition}:}\quad & =r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright\gunderline{\text{ftn}_{R}(r)}\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:ftn-R-simplified})}:}\quad & =r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright\big(q\triangleright\gunderline{\text{pu}_{M}^{\downarrow H}\triangleright(x\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright x)^{\downarrow H}}\bef r\big)\\ -{\color{greenunder}\text{composition law for }H:}\quad & =r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef\big(q\triangleright(x\Rightarrow q\triangleright\gunderline{\text{pu}_{M}^{\downarrow H}\bef x\bef\text{pu}_{M}})^{\downarrow H}\bef r\big)\\ -{\color{greenunder}\text{definition of }^{\uparrow R}:}\quad & =r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef\big(q\triangleright(x\Rightarrow q\triangleright\text{pu}_{M}^{\uparrow R}(x))^{\downarrow H}\bef r\big)\quad. + & \text{ftn}_{R}\gunderline{\bef(r}\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright r)\\ +{\color{greenunder}\text{function composition}:}\quad & =r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright\gunderline{\text{ftn}_{R}(r)}\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:ftn-R-simplified})}:}\quad & =r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright\big(q\triangleright\gunderline{\text{pu}_{M}^{\downarrow H}\triangleright(x\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\triangleright x)^{\downarrow H}}\bef r\big)\\ +{\color{greenunder}\text{composition law for }H:}\quad & =r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef\big(q\triangleright(x\rightarrow q\triangleright\gunderline{\text{pu}_{M}^{\downarrow H}\bef x\bef\text{pu}_{M}})^{\downarrow H}\bef r\big)\\ +{\color{greenunder}\text{definition of }^{\uparrow R}:}\quad & =r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef\big(q\triangleright(x\rightarrow q\triangleright\text{pu}_{M}^{\uparrow R}(x))^{\downarrow H}\bef r\big)\quad. \end{align*} The left-hand side of the law~(\ref{eq:swap-law-3-formulation-R-M}) then becomes \[ -m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef\big(q\triangleright(x\Rightarrow q\triangleright\text{pu}_{M}^{\uparrow R}(x))^{\downarrow H}\bef r\big)\big)^{\uparrow M}\quad. +m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef\big(q\triangleright(x\rightarrow q\triangleright\text{pu}_{M}^{\uparrow R}(x))^{\downarrow H}\bef r\big)\big)^{\uparrow M}\quad. \] Now apply the right-hand side of the law~(\ref{eq:swap-law-3-formulation-R-M}) to $m$ and $q$: \begin{align} & q\triangleright\big(m\triangleright\text{sw}\bef\gunderline{\text{sw}^{\uparrow R}}\bef\text{ftn}_{R}\big)\nonumber \\ -{\color{greenunder}\text{definition of }^{\uparrow R}:}\quad & =q\triangleright\big(\gunderline{m\triangleright\text{sw}\triangleright(x}\Rightarrow\text{sw}^{\downarrow H}\bef x\bef\text{sw})\triangleright\text{ftn}_{R}\big)\nonumber \\ +{\color{greenunder}\text{definition of }^{\uparrow R}:}\quad & =q\triangleright\big(\gunderline{m\triangleright\text{sw}\triangleright(x}\rightarrow\text{sw}^{\downarrow H}\bef x\bef\text{sw})\triangleright\text{ftn}_{R}\big)\nonumber \\ {\color{greenunder}\text{apply to arguments}:}\quad & =q\triangleright\big(\gunderline{\text{ftn}_{R}(}\text{sw}^{\downarrow H}\bef\text{sw}(m)\bef\text{sw})\big)\nonumber \\ -{\color{greenunder}\text{use Eq.~(\ref{eq:ftn-R-simplified})}:}\quad & =q\triangleright\big(q\triangleright\gunderline{(x\Rightarrow q\triangleright x)^{\downarrow H}\bef\text{sw}^{\downarrow H}}\bef\text{sw}(m)\bef\text{sw}\big)\nonumber \\ -{\color{greenunder}\text{composition law of }H:}\quad & =q\triangleright\big(q\triangleright\big(\gunderline{\text{sw}\bef(x\Rightarrow q\triangleright x)}\big)^{\downarrow H}\bef\text{sw}(m)\bef\text{sw}\big)\quad.\label{eq:swap-laws-derivation2} +{\color{greenunder}\text{use Eq.~(\ref{eq:ftn-R-simplified})}:}\quad & =q\triangleright\big(q\triangleright\gunderline{(x\rightarrow q\triangleright x)^{\downarrow H}\bef\text{sw}^{\downarrow H}}\bef\text{sw}(m)\bef\text{sw}\big)\nonumber \\ +{\color{greenunder}\text{composition law of }H:}\quad & =q\triangleright\big(q\triangleright\big(\gunderline{\text{sw}\bef(x\rightarrow q\triangleright x)}\big)^{\downarrow H}\bef\text{sw}(m)\bef\text{sw}\big)\quad.\label{eq:swap-laws-derivation2} \end{align} To proceed, we simplify the sub-expression $\text{sw}(m)\bef\text{sw}$ separately by computing the function compositions: \begin{align*} & \text{sw}(m)\bef\text{sw}\\ - & =(q_{1}\Rightarrow m\triangleright\big(r\Rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\gunderline{)\bef(}y\Rightarrow q_{2}\Rightarrow y\triangleright\big(r\Rightarrow q_{2}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M})\\ - & =q_{1}\Rightarrow q_{2}\Rightarrow(m\triangleright\big(r\Rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow M})\triangleright\big(}r\Rightarrow q_{2}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow M}}\\ - & =q_{1}\Rightarrow q_{2}\Rightarrow m\triangleright\big(\big(r\Rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)\bef\big(}r\Rightarrow q_{2}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)\big)^{\uparrow M}}\quad. + & =(q_{1}\rightarrow m\triangleright\big(r\rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\gunderline{)\bef(}y\rightarrow q_{2}\rightarrow y\triangleright\big(r\rightarrow q_{2}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M})\\ + & =q_{1}\rightarrow q_{2}\rightarrow(m\triangleright\big(r\rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow M})\triangleright\big(}r\rightarrow q_{2}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow M}}\\ + & =q_{1}\rightarrow q_{2}\rightarrow m\triangleright\big(\big(r\rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)\bef\big(}r\rightarrow q_{2}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)\big)^{\uparrow M}}\quad. \end{align*} Using this formula, we can write, for any $z$ of a suitable type, \begin{align} -q\triangleright(z\triangleright\text{sw}(m)\bef\text{sw}) & =m\triangleright\big(\big(r\Rightarrow z\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)\bef\big(r\Rightarrow}q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\big)^{\uparrow M}\nonumber \\ -{\color{greenunder}\text{function composition}:}\quad & =m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(z\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\quad.\label{eq:swap-law-3-derivation-1} +q\triangleright(z\triangleright\text{sw}(m)\bef\text{sw}) & =m\triangleright\big(\big(r\rightarrow z\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)\bef\big(r\rightarrow}q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)\big)^{\uparrow M}\nonumber \\ +{\color{greenunder}\text{function composition}:}\quad & =m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(z\triangleright\text{pu}_{M}^{\downarrow H}\bef r)\big)^{\uparrow M}\quad.\label{eq:swap-law-3-derivation-1} \end{align} Now we can substitute this into Eq.~(\ref{eq:swap-laws-derivation2}): \begin{align*} - & q\triangleright\big(q\triangleright\big(\text{sw}\bef(x\Rightarrow q\triangleright x)\big)^{\downarrow H}\triangleright\gunderline{\text{sw}(m)\bef\text{sw}}\big)\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:swap-law-3-derivation-1})}:}\quad & =m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(q\triangleright\gunderline{\big(\text{sw}\bef(x\Rightarrow q\triangleright x)\big)^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r)\big)^{\uparrow M}\\ -{\color{greenunder}H\text{'s composition}:}\quad & =m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(q\triangleright\big(\gunderline{\text{pu}_{M}\bef\text{sw}}\bef(x\Rightarrow q\triangleright x)\big)^{\downarrow H}\bef r)\big)^{\uparrow M}\\ -{\color{greenunder}\text{outer-identity}:}\quad & =m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(q\triangleright\big(\gunderline{\text{pu}_{M}^{\uparrow R}\bef(x\Rightarrow q\triangleright x)}\big)^{\downarrow H}\bef r)\big)^{\uparrow M}\\ -{\color{greenunder}\text{composition}:}\quad & =m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(q\triangleright\big(x\Rightarrow q\triangleright\text{pu}_{M}^{\uparrow R}(x)\big)^{\downarrow H}\bef r)\big)^{\uparrow M}\quad. + & q\triangleright\big(q\triangleright\big(\text{sw}\bef(x\rightarrow q\triangleright x)\big)^{\downarrow H}\triangleright\gunderline{\text{sw}(m)\bef\text{sw}}\big)\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:swap-law-3-derivation-1})}:}\quad & =m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(q\triangleright\gunderline{\big(\text{sw}\bef(x\rightarrow q\triangleright x)\big)^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r)\big)^{\uparrow M}\\ +{\color{greenunder}H\text{'s composition}:}\quad & =m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(q\triangleright\big(\gunderline{\text{pu}_{M}\bef\text{sw}}\bef(x\rightarrow q\triangleright x)\big)^{\downarrow H}\bef r)\big)^{\uparrow M}\\ +{\color{greenunder}\text{outer-identity}:}\quad & =m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(q\triangleright\big(\gunderline{\text{pu}_{M}^{\uparrow R}\bef(x\rightarrow q\triangleright x)}\big)^{\downarrow H}\bef r)\big)^{\uparrow M}\\ +{\color{greenunder}\text{composition}:}\quad & =m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef(q\triangleright\big(x\rightarrow q\triangleright\text{pu}_{M}^{\uparrow R}(x)\big)^{\downarrow H}\bef r)\big)^{\uparrow M}\quad. \end{align*} We arrived at the same expression as the left-hand side of the law. @@ -3361,30 +3361,30 @@ \subsubsection{Statement \label{subsec:Statement-swap-laws-rigid-monad}\ref{subs {\color{greenunder}\triangleright\text{ notation}:}\quad & =q\triangleright\big((m\triangleright\text{sw}^{\uparrow M}\triangleright\text{sw})\triangleright\gunderline{\text{ftn}_{M}^{\uparrow R}}\big)\nonumber \\ {\color{greenunder}\text{definition of }^{\uparrow R}:}\quad & =q\triangleright\big(\text{ftn}_{M}^{\downarrow H}\gunderline{\bef}(m\triangleright\text{sw}^{\uparrow M}\triangleright\text{sw})\gunderline{\bef}\text{ftn}_{M}\big)\nonumber \\ {\color{greenunder}\triangleright\text{ notation}:}\quad & =\big(\gunderline{q\triangleright\text{ftn}_{M}^{\downarrow H}}\triangleright(\gunderline{m\triangleright\text{sw}^{\uparrow M}}\triangleright\gunderline{\text{sw}})\big)\triangleright\text{ftn}_{M}\nonumber \\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:}\quad & =\big(m\triangleright\gunderline{\text{sw}^{\uparrow M}}\triangleright\big(r\Rightarrow q\triangleright\gunderline{\text{ftn}_{M}^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r\gunderline{\big)^{\uparrow M}}\big)\triangleright\text{ftn}_{M}\nonumber \\ -{\color{greenunder}\text{composition for }H\text{ and }M:}\quad & =m\triangleright\big(\text{sw}\bef\big(r\Rightarrow q\triangleright(\gunderline{\text{pu}_{M}\bef\text{ftn}_{M}})^{\downarrow H}\bef r\big)\big)^{\uparrow M}\bef\text{ftn}_{M}\nonumber \\ -{\color{greenunder}\text{left identity law of }M:}\quad & =m\triangleright\big(\text{sw}\bef(r\Rightarrow q\triangleright r)\big)^{\uparrow M}\bef\text{ftn}_{M}\quad.\label{eq:rigid-monad-1-swap-law-4-derivation-5} +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:}\quad & =\big(m\triangleright\gunderline{\text{sw}^{\uparrow M}}\triangleright\big(r\rightarrow q\triangleright\gunderline{\text{ftn}_{M}^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r\gunderline{\big)^{\uparrow M}}\big)\triangleright\text{ftn}_{M}\nonumber \\ +{\color{greenunder}\text{composition for }H\text{ and }M:}\quad & =m\triangleright\big(\text{sw}\bef\big(r\rightarrow q\triangleright(\gunderline{\text{pu}_{M}\bef\text{ftn}_{M}})^{\downarrow H}\bef r\big)\big)^{\uparrow M}\bef\text{ftn}_{M}\nonumber \\ +{\color{greenunder}\text{left identity law of }M:}\quad & =m\triangleright\big(\text{sw}\bef(r\rightarrow q\triangleright r)\big)^{\uparrow M}\bef\text{ftn}_{M}\quad.\label{eq:rigid-monad-1-swap-law-4-derivation-5} \end{align} -Let us simplify the sub-expression $\text{sw}\bef(r\Rightarrow q\triangleright r)$ +Let us simplify the sub-expression $\text{sw}\bef(r\rightarrow q\triangleright r)$ separately: \begin{align} - & \gunderline{\text{sw}}\bef\big(r\Rightarrow q\triangleright r\big)=(x\Rightarrow x\triangleright\text{sw})\bef(r\Rightarrow q\triangleright r)\nonumber \\ -{\color{greenunder}\text{function composition}:}\quad & =(x\Rightarrow\gunderline{q\triangleright(x\triangleright\text{sw})})\nonumber \\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:}\quad & =\gunderline{x\Rightarrow x\triangleright\big(}r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\nonumber \\ -{\color{greenunder}\text{expand argument}:}\quad & =\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\quad.\label{eq:rigid-monad-1-swap-derivation-6} + & \gunderline{\text{sw}}\bef\big(r\rightarrow q\triangleright r\big)=(x\rightarrow x\triangleright\text{sw})\bef(r\rightarrow q\triangleright r)\nonumber \\ +{\color{greenunder}\text{function composition}:}\quad & =(x\rightarrow\gunderline{q\triangleright(x\triangleright\text{sw})})\nonumber \\ +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:}\quad & =\gunderline{x\rightarrow x\triangleright\big(}r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\nonumber \\ +{\color{greenunder}\text{expand argument}:}\quad & =\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\quad.\label{eq:rigid-monad-1-swap-derivation-6} \end{align} Substituting this expression into Eq.~(\ref{eq:rigid-monad-1-swap-law-4-derivation-5}), we get \begin{align*} - & m\triangleright\big(\gunderline{\text{sw}\bef(r\Rightarrow q\triangleright r)}\big)^{\uparrow M}\bef\text{ftn}_{M}\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-1-swap-derivation-6})}:}\quad & =m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow M\uparrow M}\bef\text{ftn}_{M}}\\ -{\color{greenunder}\text{naturality of }\text{ftn}_{M}:}\quad & =m\triangleright\text{ftn}_{M}\bef\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\quad. + & m\triangleright\big(\gunderline{\text{sw}\bef(r\rightarrow q\triangleright r)}\big)^{\uparrow M}\bef\text{ftn}_{M}\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-1-swap-derivation-6})}:}\quad & =m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow M\uparrow M}\bef\text{ftn}_{M}}\\ +{\color{greenunder}\text{naturality of }\text{ftn}_{M}:}\quad & =m\triangleright\text{ftn}_{M}\bef\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\quad. \end{align*} Now write the left-hand side of the law: \begin{align*} & q\triangleright\big(m\triangleright\text{ftn}_{M}\gunderline{\bef}\text{sw}\big)=q\triangleright\big(m\triangleright\text{ftn}_{M}\triangleright\gunderline{\text{sw}}\big)\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:}\quad & =m\triangleright\text{ftn}_{M}\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\quad. +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:}\quad & =m\triangleright\text{ftn}_{M}\triangleright\big(r\rightarrow q\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\quad. \end{align*} This is equal to the right-hand side we just obtained. @@ -3405,7 +3405,7 @@ \subsubsection{Statement \label{subsec:Statement-rigid-monad-1-swap-naturality-l \begin{comment} Eq.~(\ref{eq:rigid-monad-swap-derivation2}) gives \[ -\text{sw}_{R,M}(m)=q\Rightarrow m\triangleright\big(\text{pu}_{M}^{\uparrow R}\bef(x\Rightarrow x\,q)\big)^{\uparrow M}\bef\text{ftn}_{M} +\text{sw}_{R,M}(m)=q\rightarrow m\triangleright\big(\text{pu}_{M}^{\uparrow R}\bef(x\rightarrow x\,q)\big)^{\uparrow M}\bef\text{ftn}_{M} \] \end{comment} @@ -3413,8 +3413,8 @@ \subsubsection{Statement \label{subsec:Statement-rigid-monad-1-swap-naturality-l and get {*}{*}{*} \begin{align*} & q\triangleright(m\triangleright\text{sw}_{R,\text{Id}})\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:}\quad & =m\triangleright\big(r\Rightarrow q\triangleright\gunderline{\text{pu}_{M}^{\downarrow H}}\bef r\gunderline{\big)^{\uparrow M}}\\ -{\color{greenunder}\text{use }M=\text{Id}\text{ and }\text{pu}_{M}=\text{id}:}\quad & =\gunderline{m\triangleright(r\Rightarrow}q\triangleright r)\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:}\quad & =m\triangleright\big(r\rightarrow q\triangleright\gunderline{\text{pu}_{M}^{\downarrow H}}\bef r\gunderline{\big)^{\uparrow M}}\\ +{\color{greenunder}\text{use }M=\text{Id}\text{ and }\text{pu}_{M}=\text{id}:}\quad & =\gunderline{m\triangleright(r\rightarrow}q\triangleright r)\\ {\color{greenunder}\text{apply to argument }m:}\quad & =q\triangleright\gunderline m=q\triangleright(m\triangleright\text{id})\quad. \end{align*} So, $\text{sw}_{R,\text{Id}}=\text{id}$ when applied to arbitrary @@ -3426,23 +3426,23 @@ \subsubsection{Statement \label{subsec:Statement-rigid-monad-1-swap-naturality-l & q\triangleright\big(m\triangleright\text{sw}_{R,M}\gunderline{\bef}\phi^{\uparrow R}\big)=q\triangleright\big(m\triangleright\text{sw}_{R,M}\triangleright\gunderline{\phi^{\uparrow R}}\big)\\ {\color{greenunder}\text{definition of }^{\uparrow R}:}\quad & =q\triangleright\big(\phi^{\downarrow H}\bef(m\triangleright\text{sw}_{R,M})\bef\phi\big)\\ {\color{greenunder}\triangleright\text{ notation}:}\quad & =\gunderline{(q\triangleright\phi^{\downarrow H})}\triangleright(m\triangleright\gunderline{\text{sw}_{R,M}})\triangleright\phi\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:}\quad & =m\triangleright\big(r\Rightarrow q\triangleright\gunderline{\phi^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r\big)^{\uparrow M}\triangleright\phi\\ -{\color{greenunder}\text{composition law for }H:}\quad & =m\triangleright\big(r\Rightarrow q\triangleright(\gunderline{\text{pu}_{M}\bef\phi})^{\downarrow H}\bef r\big)^{\uparrow M}\bef\phi\\ -{\color{greenunder}\text{identity law for }\phi:}\quad & =m\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{N}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow M}\bef\phi}\\ -{\color{greenunder}\text{naturality of }\phi:}\quad & =m\triangleright\gunderline{\phi\bef\big(}r\Rightarrow q\triangleright\text{pu}_{N}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow N}}\quad. +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:}\quad & =m\triangleright\big(r\rightarrow q\triangleright\gunderline{\phi^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r\big)^{\uparrow M}\triangleright\phi\\ +{\color{greenunder}\text{composition law for }H:}\quad & =m\triangleright\big(r\rightarrow q\triangleright(\gunderline{\text{pu}_{M}\bef\phi})^{\downarrow H}\bef r\big)^{\uparrow M}\bef\phi\\ +{\color{greenunder}\text{identity law for }\phi:}\quad & =m\triangleright\big(r\rightarrow q\triangleright\text{pu}_{N}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow M}\bef\phi}\\ +{\color{greenunder}\text{naturality of }\phi:}\quad & =m\triangleright\gunderline{\phi\bef\big(}r\rightarrow q\triangleright\text{pu}_{N}^{\downarrow H}\bef r\gunderline{\big)^{\uparrow N}}\quad. \end{align*} The right-hand side, when applied to $m$ and $q$, gives the same expression: \begin{align*} & q\triangleright(m\triangleright\phi\bef\text{sw}_{R,N})=q\triangleright(m\triangleright\phi\triangleright\gunderline{\text{sw}_{R,N})}\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:}\quad & =m\triangleright\phi\triangleright\big(r\Rightarrow q\triangleright\text{pu}_{N}^{\downarrow H}\bef r\big)^{\uparrow N}\quad. +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-1-forward-formula-for-swap})}:}\quad & =m\triangleright\phi\triangleright\big(r\rightarrow q\triangleright\text{pu}_{N}^{\downarrow H}\bef r\big)^{\uparrow N}\quad. \end{align*} To argue that the third law holds,\footnote{I could not find a fully rigorous proof of the third monadic naturality law. Below I will indicate the part of the proof that lacks rigor.} apply the left-hand side to $m$ and $q$: \begin{align} & q\triangleright(m\triangleright\text{sw}_{R,M}\bef\theta)=q\triangleright(m\triangleright\text{sw}_{R,M}\triangleright\theta)\nonumber \\ - & =q\triangleright\big((q_{1}\Rightarrow m\triangleright\big(r\Rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M})\triangleright\theta\big)\quad.\label{eq:rigid-monad-1-derivation7} + & =q\triangleright\big((q_{1}\rightarrow m\triangleright\big(r\rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M})\triangleright\theta\big)\quad.\label{eq:rigid-monad-1-derivation7} \end{align} This expression cannot be simplified any further; and neither can the right-hand side $q\triangleright(m\triangleright\theta^{\uparrow M})$. @@ -3450,35 +3450,35 @@ \subsubsection{Statement \label{subsec:Statement-rigid-monad-1-swap-naturality-l The type of $\theta$ is \[ -\theta:\forall A.\,(H^{A}\Rightarrow A)\Rightarrow A\quad. +\theta:\forall A.\,(H^{A}\rightarrow A)\rightarrow A\quad. \] To implement a function of this type, we need to write code that takes -an argument of type $H^{A}\Rightarrow A$ and returns a value of type +an argument of type $H^{A}\rightarrow A$ and returns a value of type $A$. Since the type $A$ is arbitrary, the code of $\theta$ cannot store a fixed value of type $A$ to use as the return value. The only possibility to implement a function $\theta$ with the required type signature seems to be by substituting a value of type $H^{A}$ into -the given argument of type $H^{A}\Rightarrow A$, which will return +the given argument of type $H^{A}\rightarrow A$, which will return the result of type $A$. So,\footnote{This is where an argument is lacking: I did not prove that the type -$\forall A.\,(H^{A}\Rightarrow A)\Rightarrow A$ is really \emph{equivalent} +$\forall A.\,(H^{A}\rightarrow A)\rightarrow A$ is really \emph{equivalent} to $\forall A.\,H^{A}$. With this assumption, the proof is rigorous.} we need to produce a value of type $H^{A}$ for an arbitrary type $A$, that is, a value of type $\forall A.\,H^{A}$. Using the contravariant Yoneda identity, we can simplify this type expression to the type $H^{\bbnum 1}$: \begin{align*} - & \forall A.\,H^{A}\cong\forall A.\,\gunderline{\bbnum 1}\Rightarrow H^{A}\\ -{\color{greenunder}\text{use identity }(A\Rightarrow\bbnum 1)\cong\bbnum 1:}\quad & \cong\forall A.\,(A\Rightarrow\bbnum 1)\Rightarrow H^{A}\\ + & \forall A.\,H^{A}\cong\forall A.\,\gunderline{\bbnum 1}\rightarrow H^{A}\\ +{\color{greenunder}\text{use identity }(A\rightarrow\bbnum 1)\cong\bbnum 1:}\quad & \cong\forall A.\,(A\rightarrow\bbnum 1)\rightarrow H^{A}\\ {\color{greenunder}\text{contravariant Yoneda identity}:}\quad & \cong H^{\bbnum 1}\quad. \end{align*} So, we can construct a $\theta$ if we store a value $h_{1}$ of type $H^{\bbnum 1}$ and compute $h:H^{A}$ as \[ -h^{:H^{A}}=h_{1}^{:H^{1}}\triangleright(a^{:A}\Rightarrow1)^{\downarrow H}\quad. +h^{:H^{A}}=h_{1}^{:H^{1}}\triangleright(a^{:A}\rightarrow1)^{\downarrow H}\quad. \] Given a fixed value $h_{1}:H^{\bbnum 1}$, the code of $\theta$ is therefore \begin{equation} -\big(r^{:H^{A}\Rightarrow A}\big)\triangleright\theta\triangleq h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}\triangleright r\quad.\label{eq:rigid-monad-base-runner-1} +\big(r^{:H^{A}\rightarrow A}\big)\triangleright\theta\triangleq h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}\triangleright r\quad.\label{eq:rigid-monad-base-runner-1} \end{equation} Let us check whether this $\theta$ is a monadic morphism $R\leadsto\text{Id}$. We need to verify the two laws of monadic morphisms, @@ -3488,8 +3488,8 @@ \subsubsection{Statement \label{subsec:Statement-rigid-monad-1-swap-naturality-l The identity law, applied to an arbitrary $x:A$, is \begin{align*} & x\triangleright\text{pu}_{R}\bef\theta=(x\triangleright\text{pu}_{R}\gunderline{)\triangleright\theta}\\ -{\color{greenunder}\text{definition of }r\triangleright\theta:}\quad & =h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}\triangleright(\gunderline{x\triangleright\text{pu}_{R}})\\ -{\color{greenunder}\text{definition of }x\triangleright\text{pu}_{R}:}\quad & =\big(h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}\gunderline{\big)\triangleright(\_\Rightarrow}x)\\ +{\color{greenunder}\text{definition of }r\triangleright\theta:}\quad & =h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}\triangleright(\gunderline{x\triangleright\text{pu}_{R}})\\ +{\color{greenunder}\text{definition of }x\triangleright\text{pu}_{R}:}\quad & =\big(h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}\gunderline{\big)\triangleright(\_\rightarrow}x)\\ {\color{greenunder}\text{function composition}:}\quad & =x\quad. \end{align*} This verifies the identity law. @@ -3498,11 +3498,11 @@ \subsubsection{Statement \label{subsec:Statement-rigid-monad-1-swap-naturality-l to \begin{align*} & r\triangleright\text{ftn}_{R}\bef\theta=\gunderline{r\triangleright\text{ftn}_{R}}\triangleright\theta\\ -{\color{greenunder}\text{definition of }\text{ftn}_{R}:}\quad & =\gunderline{r\triangleright\big(t\Rightarrow}q\Rightarrow q\triangleright\big(q\triangleright(x\Rightarrow q\triangleright x)^{\downarrow H}\bef t\big)\big)\triangleright\theta\\ -{\color{greenunder}\text{apply to }r:}\quad & =\big(q\Rightarrow q\triangleright\big(q\triangleright(x\Rightarrow q\triangleright x)^{\downarrow H}\bef r\big)\gunderline{\big)\triangleright\theta}\\ -{\color{greenunder}\text{definition~(\ref{eq:rigid-monad-base-runner-1}) of }\theta:}\quad & =h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}\triangleright\gunderline{\big(q\Rightarrow}q\triangleright\big(q\triangleright(x\Rightarrow q\triangleright x)^{\downarrow H}\bef r\big)\big)\\ -{\color{greenunder}\text{apply to }h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}:}\quad & =h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}\triangleright\big(h_{1}\triangleright\gunderline{(\_\Rightarrow1)^{\downarrow H}\bef(x\Rightarrow...)^{\downarrow H}}\bef r\big)\\ -{\color{greenunder}\text{composition under }H:}\quad & =\gunderline{h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}}\triangleright\big(\gunderline{h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}}\triangleright r\big)\\ +{\color{greenunder}\text{definition of }\text{ftn}_{R}:}\quad & =\gunderline{r\triangleright\big(t\rightarrow}q\rightarrow q\triangleright\big(q\triangleright(x\rightarrow q\triangleright x)^{\downarrow H}\bef t\big)\big)\triangleright\theta\\ +{\color{greenunder}\text{apply to }r:}\quad & =\big(q\rightarrow q\triangleright\big(q\triangleright(x\rightarrow q\triangleright x)^{\downarrow H}\bef r\big)\gunderline{\big)\triangleright\theta}\\ +{\color{greenunder}\text{definition~(\ref{eq:rigid-monad-base-runner-1}) of }\theta:}\quad & =h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}\triangleright\gunderline{\big(q\rightarrow}q\triangleright\big(q\triangleright(x\rightarrow q\triangleright x)^{\downarrow H}\bef r\big)\big)\\ +{\color{greenunder}\text{apply to }h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}:}\quad & =h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}\triangleright\big(h_{1}\triangleright\gunderline{(\_\rightarrow1)^{\downarrow H}\bef(x\rightarrow...)^{\downarrow H}}\bef r\big)\\ +{\color{greenunder}\text{composition under }H:}\quad & =\gunderline{h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}}\triangleright\big(\gunderline{h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}}\triangleright r\big)\\ {\color{greenunder}\text{definition~(\ref{eq:rigid-monad-base-runner-1}) of }\theta:}\quad & =r\triangleright\theta\triangleright\theta=r\triangleright\theta\bef\theta\quad. \end{align*} This verifies the composition law; so $\theta$ is indeed a monadic @@ -3514,24 +3514,24 @@ \subsubsection{Statement \label{subsec:Statement-rigid-monad-1-swap-naturality-l side of the law is given by Eq.~(\ref{eq:rigid-monad-1-derivation7}) and is rewritten as \begin{align*} - & q\triangleright\big((q_{1}\Rightarrow m\triangleright\big(r\Rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\gunderline{)\triangleright\theta}\big)\\ -{\color{greenunder}\text{definition of }\theta:}\quad & =q\triangleright\big(h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}\gunderline{\triangleright(q_{1}\Rightarrow}m\triangleright\big(r\Rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M})\big)\\ -{\color{greenunder}\text{apply to argument}:}\quad & =q\triangleright\big(m\triangleright\big(r\Rightarrow h_{1}\triangleright\gunderline{(\_\Rightarrow1)^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r\big)^{\uparrow M}\big)\\ -{\color{greenunder}H\text{'s composition law}:}\quad & =q\triangleright\big(m\triangleright\big(r\Rightarrow h_{1}\triangleright(\gunderline{\text{pu}_{M}\bef(\_\Rightarrow1)})^{\downarrow H}\bef r\big)^{\uparrow M}\big)\\ -{\color{greenunder}\text{compose functions}:}\quad & =q\triangleright\big(m\triangleright\big(r\Rightarrow h_{1}\triangleright(\gunderline{\_\Rightarrow1})^{\downarrow H}\triangleright r\big)^{\uparrow M}\big)\quad. + & q\triangleright\big((q_{1}\rightarrow m\triangleright\big(r\rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M}\gunderline{)\triangleright\theta}\big)\\ +{\color{greenunder}\text{definition of }\theta:}\quad & =q\triangleright\big(h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}\gunderline{\triangleright(q_{1}\rightarrow}m\triangleright\big(r\rightarrow q_{1}\triangleright\text{pu}_{M}^{\downarrow H}\bef r\big)^{\uparrow M})\big)\\ +{\color{greenunder}\text{apply to argument}:}\quad & =q\triangleright\big(m\triangleright\big(r\rightarrow h_{1}\triangleright\gunderline{(\_\rightarrow1)^{\downarrow H}\triangleright\text{pu}_{M}^{\downarrow H}}\bef r\big)^{\uparrow M}\big)\\ +{\color{greenunder}H\text{'s composition law}:}\quad & =q\triangleright\big(m\triangleright\big(r\rightarrow h_{1}\triangleright(\gunderline{\text{pu}_{M}\bef(\_\rightarrow1)})^{\downarrow H}\bef r\big)^{\uparrow M}\big)\\ +{\color{greenunder}\text{compose functions}:}\quad & =q\triangleright\big(m\triangleright\big(r\rightarrow h_{1}\triangleright(\gunderline{\_\rightarrow1})^{\downarrow H}\triangleright r\big)^{\uparrow M}\big)\quad. \end{align*} The right-hand side is \begin{align*} & q\triangleright(m\triangleright\gunderline{\theta}^{\uparrow M})\\ -{\color{greenunder}\text{function expansion}:}\quad & =q\triangleright\big(m\triangleright\big(r\Rightarrow\gunderline{r\triangleright\theta}\big)^{\uparrow M}\big)\\ -{\color{greenunder}\text{definition~(\ref{eq:rigid-monad-base-runner-1}) of }\theta:}\quad & =q\triangleright\big(m\triangleright\big(r\Rightarrow h_{1}\triangleright(\_\Rightarrow1)^{\downarrow H}\triangleright r\big)^{\uparrow M}\big)\quad. +{\color{greenunder}\text{function expansion}:}\quad & =q\triangleright\big(m\triangleright\big(r\rightarrow\gunderline{r\triangleright\theta}\big)^{\uparrow M}\big)\\ +{\color{greenunder}\text{definition~(\ref{eq:rigid-monad-base-runner-1}) of }\theta:}\quad & =q\triangleright\big(m\triangleright\big(r\rightarrow h_{1}\triangleright(\_\rightarrow1)^{\downarrow H}\triangleright r\big)^{\uparrow M}\big)\quad. \end{align*} This expression is now the same as the left-hand side. \begin{comment} Statement 4. -The rigid monad $R^{A}\triangleq H^{A}\Rightarrow A$ satisfies the +The rigid monad $R^{A}\triangleq H^{A}\rightarrow A$ satisfies the two compatibility laws with respect to any monad $M$. Proof. @@ -3541,24 +3541,24 @@ \subsubsection{Statement \label{subsec:Statement-rigid-monad-1-swap-naturality-l (since our expressions for the monad $T$ always need to involve $\text{flm}_{M}$). Then the two laws that we need to prove are \begin{align*} -\text{flm}_{R}f^{:A\Rightarrow R^{M^{B}}} & =\text{pure}_{M}^{\uparrow R}\bef\text{flm}_{T}f\quad\text{as functions }R^{A}\Rightarrow R^{M^{B}},\\ -\big(\text{flm}_{M}f^{A\Rightarrow M^{B}}\big)^{\uparrow R} & =\text{pure}_{R}^{\uparrow T}\bef\text{flm}_{T}\big(f^{\uparrow R}\big)\quad\text{as functions }R^{M^{A}}\Rightarrow R^{M^{B}}. +\text{flm}_{R}f^{:A\rightarrow R^{M^{B}}} & =\text{pure}_{M}^{\uparrow R}\bef\text{flm}_{T}f\quad\text{as functions }R^{A}\rightarrow R^{M^{B}},\\ +\big(\text{flm}_{M}f^{A\rightarrow M^{B}}\big)^{\uparrow R} & =\text{pure}_{R}^{\uparrow T}\bef\text{flm}_{T}\big(f^{\uparrow R}\big)\quad\text{as functions }R^{M^{A}}\rightarrow R^{M^{B}}. \end{align*} A definition of $\text{flm}_{R}$ is obtained from $\text{flm}_{T}$ by choosing the identity monad $M^{A}\triangleq A$ instead of an arbitrary monad $M$. This replaces $\text{flm}_{M}$ by $\text{id}$: \begin{align*} -\text{flm}_{T}f^{:A\Rightarrow R^{M^{B}}} & =t^{:R^{M^{A}}}\Rightarrow q^{H^{M^{B}}}\Rightarrow\left(\text{flm}_{M}\left(x^{:A}\Rightarrow f\,x\,q\right)\right)^{\uparrow R}t\,q\quad;\\ -\text{flm}_{R}f^{:A\Rightarrow R^{B}} & =r^{:R^{A}}\Rightarrow q^{H^{B}}\Rightarrow\left(x^{:A}\Rightarrow f\,x\,q\right)^{\uparrow R}r\,q\quad. +\text{flm}_{T}f^{:A\rightarrow R^{M^{B}}} & =t^{:R^{M^{A}}}\rightarrow q^{H^{M^{B}}}\rightarrow\left(\text{flm}_{M}\left(x^{:A}\rightarrow f\,x\,q\right)\right)^{\uparrow R}t\,q\quad;\\ +\text{flm}_{R}f^{:A\rightarrow R^{B}} & =r^{:R^{A}}\rightarrow q^{H^{B}}\rightarrow\left(x^{:A}\rightarrow f\,x\,q\right)^{\uparrow R}r\,q\quad. \end{align*} To prove the first compatibility law, rewrite its right-hand side as \begin{align*} & \text{pure}_{M}^{\uparrow R}\bef\text{flm}_{T}f\\ -{\color{greenunder}\text{definition of }\text{flm}_{T}:}\quad & =\left(r^{:R^{A}}\Rightarrow\text{pure}_{M}^{\uparrow R}r\right)\bef\left(r\Rightarrow q\Rightarrow\left(\text{flm}_{M}\left(x\Rightarrow f\,x\,q\right)\right)^{\uparrow R}r\,q\right)\\ -{\color{greenunder}\text{expand }\bef\text{and simplify}:}\quad & =r\Rightarrow q\Rightarrow\left(\text{flm}_{M}\left(x\Rightarrow f\,x\,q\right)\right)^{\uparrow R}\left(\text{pure}_{M}^{\uparrow R}r\right)\,q\\ -{\color{greenunder}\text{composition law for }R:}\quad & =r\Rightarrow q\Rightarrow\left(\text{pure}_{M}\bef\text{flm}_{M}\left(x\Rightarrow f\,x\,q\right)\right)^{\uparrow R}r\,q\\ -{\color{greenunder}\text{left identity law for }M:}\quad & =r\Rightarrow q\Rightarrow\left(x\Rightarrow f\,x\,q\right)^{\uparrow R}r\,q\\ +{\color{greenunder}\text{definition of }\text{flm}_{T}:}\quad & =\left(r^{:R^{A}}\rightarrow\text{pure}_{M}^{\uparrow R}r\right)\bef\left(r\rightarrow q\rightarrow\left(\text{flm}_{M}\left(x\rightarrow f\,x\,q\right)\right)^{\uparrow R}r\,q\right)\\ +{\color{greenunder}\text{expand }\bef\text{and simplify}:}\quad & =r\rightarrow q\rightarrow\left(\text{flm}_{M}\left(x\rightarrow f\,x\,q\right)\right)^{\uparrow R}\left(\text{pure}_{M}^{\uparrow R}r\right)\,q\\ +{\color{greenunder}\text{composition law for }R:}\quad & =r\rightarrow q\rightarrow\left(\text{pure}_{M}\bef\text{flm}_{M}\left(x\rightarrow f\,x\,q\right)\right)^{\uparrow R}r\,q\\ +{\color{greenunder}\text{left identity law for }M:}\quad & =r\rightarrow q\rightarrow\left(x\rightarrow f\,x\,q\right)^{\uparrow R}r\,q\\ {\color{greenunder}\text{definition of }\text{flm}_{R}:}\quad & =\text{flm}_{R}f\quad. \end{align*} @@ -3566,13 +3566,13 @@ \subsubsection{Statement \label{subsec:Statement-rigid-monad-1-swap-naturality-l as \begin{align*} & \text{pure}_{R}^{\uparrow T}\bef\text{flm}_{T}\big(f^{\uparrow R}\big)\\ -{\color{greenunder}\text{definition of }\text{flm}_{T}\big(f^{\uparrow R}\big):}\quad & =\left(t^{:T^{A}}\Rightarrow\text{pure}_{R}^{\uparrow T}t\right)\bef\left(t\Rightarrow q\Rightarrow\left(\text{flm}_{M}\left(x\Rightarrow f^{\uparrow R}x\,q\right)\right)^{\uparrow R}t\,q\right)\\ -{\color{greenunder}\text{expand }\bef\text{ and simplify}:}\quad & =t^{:T^{A}}\Rightarrow q\Rightarrow\left(\text{flm}_{M}\left(x^{:R^{A}}\Rightarrow f^{\uparrow R}x\,q\right)\right)^{\uparrow R}\left(\text{pure}_{R}^{\uparrow M\uparrow R}t\right)\,q\\ -{\color{greenunder}\text{composition law for }R:}\quad & =t\Rightarrow q\Rightarrow\left(\text{pure}_{R}^{\uparrow M}\bef\text{flm}_{M}\left(x^{:R^{A}}\Rightarrow f^{\uparrow R}x\,q\right)\right)^{\uparrow R}t\,q\\ -{\color{greenunder}\text{left naturality of }\text{flm}_{M}:}\quad & =t\Rightarrow q\Rightarrow\left(\text{flm}_{M}\left(x^{:A}\Rightarrow\left(\text{pure}_{R}\bef f^{\uparrow R}\right)x\,q\right)\right)^{\uparrow R}t\,q\\ -{\color{greenunder}\text{naturality of }\text{pure}_{R}:}\quad & =t\Rightarrow q\Rightarrow\left(\text{flm}_{M}\left(x^{:A}\Rightarrow\text{pure}_{R}\left(f\,x\right)\,q\right)\right)^{\uparrow R}t\,q\\ -{\color{greenunder}\text{definition of }\text{pure}_{R}:}\quad & =t\Rightarrow q\Rightarrow\left(\text{flm}_{M}\left(x^{:A}\Rightarrow f\,x\right)\right)^{\uparrow R}t\,q\\ -{\color{greenunder}\text{unapply }f\text{ and }\text{flm}_{M}f:}\quad & =t\Rightarrow q\Rightarrow\left(\text{flm}_{M}f\right)^{\uparrow R}t\,q=\left(\text{flm}_{M}f\right)^{\uparrow R}\quad. +{\color{greenunder}\text{definition of }\text{flm}_{T}\big(f^{\uparrow R}\big):}\quad & =\left(t^{:T^{A}}\rightarrow\text{pure}_{R}^{\uparrow T}t\right)\bef\left(t\rightarrow q\rightarrow\left(\text{flm}_{M}\left(x\rightarrow f^{\uparrow R}x\,q\right)\right)^{\uparrow R}t\,q\right)\\ +{\color{greenunder}\text{expand }\bef\text{ and simplify}:}\quad & =t^{:T^{A}}\rightarrow q\rightarrow\left(\text{flm}_{M}\left(x^{:R^{A}}\rightarrow f^{\uparrow R}x\,q\right)\right)^{\uparrow R}\left(\text{pure}_{R}^{\uparrow M\uparrow R}t\right)\,q\\ +{\color{greenunder}\text{composition law for }R:}\quad & =t\rightarrow q\rightarrow\left(\text{pure}_{R}^{\uparrow M}\bef\text{flm}_{M}\left(x^{:R^{A}}\rightarrow f^{\uparrow R}x\,q\right)\right)^{\uparrow R}t\,q\\ +{\color{greenunder}\text{left naturality of }\text{flm}_{M}:}\quad & =t\rightarrow q\rightarrow\left(\text{flm}_{M}\left(x^{:A}\rightarrow\left(\text{pure}_{R}\bef f^{\uparrow R}\right)x\,q\right)\right)^{\uparrow R}t\,q\\ +{\color{greenunder}\text{naturality of }\text{pure}_{R}:}\quad & =t\rightarrow q\rightarrow\left(\text{flm}_{M}\left(x^{:A}\rightarrow\text{pure}_{R}\left(f\,x\right)\,q\right)\right)^{\uparrow R}t\,q\\ +{\color{greenunder}\text{definition of }\text{pure}_{R}:}\quad & =t\rightarrow q\rightarrow\left(\text{flm}_{M}\left(x^{:A}\rightarrow f\,x\right)\right)^{\uparrow R}t\,q\\ +{\color{greenunder}\text{unapply }f\text{ and }\text{flm}_{M}f:}\quad & =t\rightarrow q\rightarrow\left(\text{flm}_{M}f\right)^{\uparrow R}t\,q=\left(\text{flm}_{M}f\right)^{\uparrow R}\quad. \end{align*} Statement 5. @@ -3587,8 +3587,8 @@ \subsubsection{Statement \label{subsec:Statement-rigid-monad-1-swap-naturality-l \begin{align*} \text{lift}:M^{\bullet}\leadsto R^{M^{\bullet}} & \triangleq\text{pure}_{R}\quad,\\ \text{blift}:R^{\bullet}\leadsto R^{M^{\bullet}} & \triangleq\text{pure}_{M}^{\uparrow R}\quad,\\ -\text{mrun}\,\big(\phi^{:M^{\bullet}\leadsto N^{\bullet}}\big):R^{M^{\bullet}}\Rightarrow R^{N^{\bullet}} & \triangleq\phi^{\uparrow R}\quad,\\ -\text{brun}\,\theta^{:R^{\bullet}\leadsto\bullet}:R^{M^{\bullet}}\Rightarrow M^{\bullet} & \triangleq\theta^{:R^{M^{\bullet}}\leadsto M^{\bullet}}\quad, +\text{mrun}\,\big(\phi^{:M^{\bullet}\leadsto N^{\bullet}}\big):R^{M^{\bullet}}\rightarrow R^{N^{\bullet}} & \triangleq\phi^{\uparrow R}\quad,\\ +\text{brun}\,\theta^{:R^{\bullet}\leadsto\bullet}:R^{M^{\bullet}}\rightarrow M^{\bullet} & \triangleq\theta^{:R^{M^{\bullet}}\leadsto M^{\bullet}}\quad, \end{align*} will satisfy the identity laws \begin{align*} @@ -3637,7 +3637,7 @@ \subsubsection{Statement \label{subsec:Statement-rigid-monad-1-swap-naturality-l Statement 6. -A monad transformer for the rigid monad $R^{A}\triangleq H^{A}\Rightarrow A$ +A monad transformer for the rigid monad $R^{A}\triangleq H^{A}\rightarrow A$ is $T_{R}^{M,A}\triangleq R^{M^{A}}$, with the four required methods defined as \begin{align*} @@ -3659,31 +3659,31 @@ \subsubsection{Statement \label{subsec:Statement-rigid-monad-1-swap-naturality-l The identity laws follow from Statement~5, since $T_{R}^{M,\bullet}=R^{M^{\bullet}}$ is a functor composition. It remains to verify the composition laws, \begin{align*} -\left(f^{:A\Rightarrow M^{B}}\bef\text{lift}\right)\diamond_{R^{M}}\left(g^{:B\Rightarrow M^{C}}\bef\text{lift}\right) & =\left(f\diamond_{M}g\right)\bef\text{lift}\quad,\\ -\left(f^{:A\Rightarrow R^{M^{B}}}\bef\text{mrun}\,\phi\right)\diamond_{R^{N}}\left(g^{:B\Rightarrow R^{M^{C}}}\bef\text{mrun}\,\phi\right) & =\left(f\diamond_{R^{M}}g\right)\bef\text{mrun}\,\phi\quad,\\ -\left(f^{:A\Rightarrow R^{M^{B}}}\bef\text{brun}\,\theta\right)\diamond_{M}\left(g^{:B\Rightarrow R^{M^{C}}}\bef\text{brun}\,\theta\right) & =\left(f\diamond_{R^{M}}g\right)\bef\text{brun}\,\theta\quad. +\left(f^{:A\rightarrow M^{B}}\bef\text{lift}\right)\diamond_{R^{M}}\left(g^{:B\rightarrow M^{C}}\bef\text{lift}\right) & =\left(f\diamond_{M}g\right)\bef\text{lift}\quad,\\ +\left(f^{:A\rightarrow R^{M^{B}}}\bef\text{mrun}\,\phi\right)\diamond_{R^{N}}\left(g^{:B\rightarrow R^{M^{C}}}\bef\text{mrun}\,\phi\right) & =\left(f\diamond_{R^{M}}g\right)\bef\text{mrun}\,\phi\quad,\\ +\left(f^{:A\rightarrow R^{M^{B}}}\bef\text{brun}\,\theta\right)\diamond_{M}\left(g^{:B\rightarrow R^{M^{C}}}\bef\text{brun}\,\theta\right) & =\left(f\diamond_{R^{M}}g\right)\bef\text{brun}\,\theta\quad. \end{align*} For the first law, we need to use the definition of $\text{lift}\triangleq\text{pure}_{R}$, which is \[ -\text{pure}_{R}x^{:A}\triangleq\_^{:H^{A}}\Rightarrow x\quad. +\text{pure}_{R}x^{:A}\triangleq\_^{:H^{A}}\rightarrow x\quad. \] So the definition of $\text{lift}$ can be written as \[ -f\bef\text{lift}=x^{:A}\Rightarrow\_^{:H^{M^{B}}}\Rightarrow f\,x +f\bef\text{lift}=x^{:A}\rightarrow\_^{:H^{M^{B}}}\rightarrow f\,x \] as a function that ignores its second argument (of type $H^{M^{B}}$). It is convenient to use the flipped Kleisli product $\tilde{\diamond}_{R^{M}}$ defined before in eq.~(\ref{eq:def-flipped-kleisli}). We compute \begin{align*} - & \left(f^{:A\Rightarrow M^{B}}\bef\text{lift}\right)\tilde{\diamond}_{R^{M}}\left(g^{:B\Rightarrow M^{C}}\bef\text{lift}\right)\\ -{\color{greenunder}\text{definition of }\text{lift}:}\quad & =\left(\_\Rightarrow f\right)\tilde{\diamond}_{R^{M}}\left(\_\Rightarrow g\right)\\ -{\color{greenunder}\text{eq. (\ref{eq:def-flipped-kleisli})}:}\quad & =q^{:H^{M^{B}}}\Rightarrow\left(\_\Rightarrow f\right)\left(\left(\text{flm}_{M}\left(\left(\_\Rightarrow g\right)\,q\right)\right)^{\downarrow H}q\right)\diamond_{M}\left(\left(\_\Rightarrow g\right)\,q\right)\\ -{\color{greenunder}\text{expanding the functions}:}\quad & =q\Rightarrow f\diamond_{M}g\\ -{\color{greenunder}\text{unflipping the definition of }\text{lift}:}\quad & =q\Rightarrow x\Rightarrow\left(\left(f\diamond_{M}g\right)\bef\text{lift}\right)a\,x\quad. + & \left(f^{:A\rightarrow M^{B}}\bef\text{lift}\right)\tilde{\diamond}_{R^{M}}\left(g^{:B\rightarrow M^{C}}\bef\text{lift}\right)\\ +{\color{greenunder}\text{definition of }\text{lift}:}\quad & =\left(\_\rightarrow f\right)\tilde{\diamond}_{R^{M}}\left(\_\rightarrow g\right)\\ +{\color{greenunder}\text{eq. (\ref{eq:def-flipped-kleisli})}:}\quad & =q^{:H^{M^{B}}}\rightarrow\left(\_\rightarrow f\right)\left(\left(\text{flm}_{M}\left(\left(\_\rightarrow g\right)\,q\right)\right)^{\downarrow H}q\right)\diamond_{M}\left(\left(\_\rightarrow g\right)\,q\right)\\ +{\color{greenunder}\text{expanding the functions}:}\quad & =q\rightarrow f\diamond_{M}g\\ +{\color{greenunder}\text{unflipping the definition of }\text{lift}:}\quad & =q\rightarrow x\rightarrow\left(\left(f\diamond_{M}g\right)\bef\text{lift}\right)a\,x\quad. \end{align*} -Note that the last function, of type $H^{M^{B}}\Rightarrow A\Rightarrow M^{B}$, +Note that the last function, of type $H^{M^{B}}\rightarrow A\rightarrow M^{B}$, ignores its first argument. Therefore, after unflipping this Kleisli function, it will ignore its second argument. This is precisely what the function $\left(f\diamond_{M}g\right)\bef\text{lift}$ must do. @@ -3691,8 +3691,8 @@ \subsubsection{Statement \label{subsec:Statement-rigid-monad-1-swap-naturality-l For the second and third laws, we need to use the composition laws for $\phi$ and $\theta$, which can be written as \begin{align*} -\left(f^{:A\Rightarrow M^{B}}\bef\phi\right)\diamond_{N}\left(g^{:B\Rightarrow M^{C}}\bef\phi\right) & =\left(f\diamond_{M}g\right)\bef\phi\quad,\\ -\left(f^{:A\Rightarrow R^{B}}\bef\theta\right)\bef\left(g^{:B\Rightarrow M^{C}}\bef\theta\right) & =\left(f\diamond_{M}g\right)\bef\theta\quad. +\left(f^{:A\rightarrow M^{B}}\bef\phi\right)\diamond_{N}\left(g^{:B\rightarrow M^{C}}\bef\phi\right) & =\left(f\diamond_{M}g\right)\bef\phi\quad,\\ +\left(f^{:A\rightarrow R^{B}}\bef\theta\right)\bef\left(g^{:B\rightarrow M^{C}}\bef\theta\right) & =\left(f\diamond_{M}g\right)\bef\theta\quad. \end{align*} \end{comment} @@ -3728,23 +3728,23 @@ \subsubsection{Statement \label{subsec:Statement-composition-rigid-monads}\ref{s \subsubsection{Example \label{subsec:Example-rigid-composition-1}\ref{subsec:Example-rigid-composition-1}} Consider the functor composition of the \lstinline!Search! monad -$R_{1}^{A}\triangleq\left(A\Rightarrow Q\right)\Rightarrow A$ and -the \lstinline!Reader! monad $R_{2}^{A}\triangleq Z\Rightarrow A$: +$R_{1}^{A}\triangleq\left(A\rightarrow Q\right)\rightarrow A$ and +the \lstinline!Reader! monad $R_{2}^{A}\triangleq Z\rightarrow A$: \[ -P^{A}\triangleq((Z\Rightarrow A)\Rightarrow Q)\Rightarrow Z\Rightarrow A\quad. +P^{A}\triangleq((Z\rightarrow A)\rightarrow Q)\rightarrow Z\rightarrow A\quad. \] It follows from Statement~\ref{subsec:Statement-composition-rigid-monads} that the functor $P^{\bullet}$ is a rigid monad; so $P$'s transformer is of the composed-outside kind. The the transformed monad for any foreign monad $M$ is \[ -T^{A}\triangleq((Z\Rightarrow M^{A})\Rightarrow Q)\Rightarrow Z\Rightarrow M^{A}\quad. +T^{A}\triangleq((Z\rightarrow M^{A})\rightarrow Q)\rightarrow Z\rightarrow M^{A}\quad. \] To define the monad methods for $T$, we need to have the definitions of the transformers $T_{R_{1}}^{M}$ and $T_{R_{2}}^{M}$. Since both the \lstinline!Search! and the \lstinline!Reader! monads are special cases of the \lstinline!Choice! monad construction (Section~\ref{subsec:Rigid-monad-construction-1-choice}) -where the contrafunctor $H$ is chosen to be $H^{A}\triangleq A\Rightarrow Q$ +where the contrafunctor $H$ is chosen to be $H^{A}\triangleq A\rightarrow Q$ and $H^{A}\triangleq Z$ respectively, we can use Eq.~(\ref{eq:rigid-monad-flm-T-def}) to define the \lstinline!flatMap! methods for the transformers $T_{R_{1}}^{M}$ and $T_{R_{2}}^{M}$: @@ -3995,11 +3995,11 @@ \subsubsection{Lemma \label{subsec:Lemma-base-runner-for-composed-monad}} $\theta:R\circ S\leadsto\text{Id}$, we need to prepend a function $R\leadsto R\circ S$. A suitable function of this type is \[ -\text{pu}_{S}^{\uparrow R}:R^{A}\Rightarrow R^{S^{A}}\quad. +\text{pu}_{S}^{\uparrow R}:R^{A}\rightarrow R^{S^{A}}\quad. \] So, $\theta_{R}=\text{pu}_{S}^{\uparrow R}\bef\theta$ has the correct -type signature, $R^{A}\Rightarrow A$. Similarly, $\theta_{S}=\text{pu}_{R}\bef\theta$ -has the correct type signature, $S^{A}\Rightarrow A$. So, we can +type signature, $R^{A}\rightarrow A$. Similarly, $\theta_{S}=\text{pu}_{R}\bef\theta$ +has the correct type signature, $S^{A}\rightarrow A$. So, we can define $\theta_{R}$ and $\theta_{S}$ from the given ``runner'' $\theta$ as \[ @@ -4055,7 +4055,7 @@ \subsubsection{Statement \label{subsec:Statement-product-rigid-monads}\ref{subse \subsection{Rigid monad construction 4: selector} -The \index{selector monad}\textbf{selector monad} $S^{A}\triangleq F^{A\Rightarrow R^{Q}}\Rightarrow R^{A}$ +The \index{selector monad}\textbf{selector monad} $S^{A}\triangleq F^{A\rightarrow R^{Q}}\rightarrow R^{A}$ is rigid if $R^{\bullet}$ is a rigid monad, $F^{\bullet}$ is any functor, and $Q$ is any fixed type. @@ -4072,7 +4072,7 @@ \subsection{Rigid functors\label{subsec:Rigid-functors}} a natural transformation \lstinline!fuseIn! (short notation ``$\text{fi}_{R}$'') with the type signature \[ -\text{fi}_{R}:\forall(A,B).\,(A\Rightarrow R^{B})\Rightarrow R^{A\Rightarrow B} +\text{fi}_{R}:\forall(A,B).\,(A\rightarrow R^{B})\rightarrow R^{A\rightarrow B} \] satisfying the non-degeneracy law~\ref{eq:rigid-non-degeneracy-law} (see below). @@ -4081,18 +4081,18 @@ \subsection{Rigid functors\label{subsec:Rigid-functors}} of \lstinline!fuseIn!. For example, the functor $F^{A}\triangleq Z+A$ is not rigid because the required type signature \[ -\forall(A,B).\,\left(A\Rightarrow Z+B\right)\Rightarrow Z+\left(A\Rightarrow B\right) +\forall(A,B).\,\left(A\rightarrow Z+B\right)\rightarrow Z+\left(A\rightarrow B\right) \] cannot be implemented. However, any functor $R$ admits the opposite natural transformation \lstinline!fuseOut! (short notation $\text{fo}_{R}$), defined by \begin{align} -\text{fo} & :\forall(A,B).\,R^{A\Rightarrow B}\Rightarrow A\Rightarrow R^{B}\quad,\nonumber \\ -\text{fo} & \left(r\right)=a\Rightarrow\big(f^{:A\Rightarrow B}\Rightarrow f\left(a\right)\big)^{\uparrow R}r\quad.\label{eq:fuseOut-def} +\text{fo} & :\forall(A,B).\,R^{A\rightarrow B}\rightarrow A\rightarrow R^{B}\quad,\nonumber \\ +\text{fo} & \left(r\right)=a\rightarrow\big(f^{:A\rightarrow B}\rightarrow f\left(a\right)\big)^{\uparrow R}r\quad.\label{eq:fuseOut-def} \end{align} The method \lstinline!fuseIn! must satisfy the nondegeneracy law \begin{equation} -\text{fi}_{R}\bef\text{fo}_{R}=\text{id}^{:(A\Rightarrow R^{B})\Rightarrow(A\Rightarrow R^{B})}\quad.\label{eq:rigid-non-degeneracy-law} +\text{fi}_{R}\bef\text{fo}_{R}=\text{id}^{:(A\rightarrow R^{B})\rightarrow(A\rightarrow R^{B})}\quad.\label{eq:rigid-non-degeneracy-law} \end{equation} The opposite relation does not hold in general, $\text{fo}_{R}\bef\text{fi}_{R}\neq\text{id}$ (see Example~\ref{subsec:Example-fo-fi-not-id}). @@ -4101,7 +4101,7 @@ \subsection{Rigid functors\label{subsec:Rigid-functors}} type signature of \lstinline!swap! with respect to the \lstinline!Reader! monad, \[ -\text{sw}_{R,M}:M^{R^{A}}\Rightarrow R^{M^{A}}\cong(Z\Rightarrow R^{A})\Rightarrow R^{Z\Rightarrow A}\text{ if we set }M^{A}\triangleq Z\Rightarrow A\quad. +\text{sw}_{R,M}:M^{R^{A}}\rightarrow R^{M^{A}}\cong(Z\rightarrow R^{A})\rightarrow R^{Z\rightarrow A}\text{ if we set }M^{A}\triangleq Z\rightarrow A\quad. \] So we are prompted to ask whether any rigid monad having a \lstinline!swap! method might also admit \lstinline!fuseIn!. It turns out that all @@ -4121,24 +4121,24 @@ \subsubsection{Statement \label{subsec:Statement-rigid-monads-are-rigid-functors We can define the transformation $\text{fi}_{R}$ in the same way as Eq.~(\ref{eq:define-swap-via-flatten}) defined the \lstinline!swap! method via $\text{ftn}_{T}$. To use that formula, we need to set -the foreign monad $M$ to be the \lstinline!Reader! monad, $M^{B}\triangleq A\Rightarrow B$, +the foreign monad $M$ to be the \lstinline!Reader! monad, $M^{B}\triangleq A\rightarrow B$, with the fixed environment type $A$: \begin{equation} -\text{fi}_{R}(f^{:A\Rightarrow R^{B}})=\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\bef\text{ftn}_{T}\label{eq:rigid-monad-fuseIn-def} +\text{fi}_{R}(f^{:A\rightarrow R^{B}})=\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\bef\text{ftn}_{T}\label{eq:rigid-monad-fuseIn-def} \end{equation} \[ -\xymatrix{\xyScaleY{2pc}\xyScaleX{4pc}A\Rightarrow R^{B}\ar[r]\sp(0.5){\text{pu}_{M}^{\uparrow R\uparrow M}}\ar[rrd]\sb(0.5){\text{fi}_{R}\triangleq} & A\Rightarrow R^{A\Rightarrow B}\ar[r]\sp(0.5){\text{pu}_{R}} & R^{A\Rightarrow R^{A\Rightarrow B}}\ar[d]\sp(0.45){\text{ftn}_{T}}\\ - & & R^{A\Rightarrow B} +\xymatrix{\xyScaleY{2pc}\xyScaleX{4pc}A\rightarrow R^{B}\ar[r]\sp(0.5){\text{pu}_{M}^{\uparrow R\uparrow M}}\ar[rrd]\sb(0.5){\text{fi}_{R}\triangleq} & A\rightarrow R^{A\rightarrow B}\ar[r]\sp(0.5){\text{pu}_{R}} & R^{A\rightarrow R^{A\rightarrow B}}\ar[d]\sp(0.45){\text{ftn}_{T}}\\ + & & R^{A\rightarrow B} } \] Since $M$ is the \lstinline!Reader! monad with the environment type $A$, we have \[ -\text{pu}_{M}(x)=(\_^{:A}\Rightarrow x)\quad,\quad\quad(f^{:X\Rightarrow Y})^{\uparrow M}(r^{:A\Rightarrow X})=r\bef f\quad. +\text{pu}_{M}(x)=(\_^{:A}\rightarrow x)\quad,\quad\quad(f^{:X\rightarrow Y})^{\uparrow M}(r^{:A\rightarrow X})=r\bef f\quad. \] The type signature of the function \lstinline!fuseOut!, \[ -\text{fo}:R^{A\Rightarrow B}\Rightarrow A\Rightarrow R^{B}\quad, +\text{fo}:R^{A\rightarrow B}\rightarrow A\rightarrow R^{B}\quad, \] resembles ``running'' the composed monad $R^{M^{B}}$ into $R^{B}$, given a value of the environment (of type $A$). Indeed, given a fixed @@ -4146,7 +4146,7 @@ \subsubsection{Statement \label{subsec:Statement-rigid-monads-are-rigid-functors the identity monad. The corresponding ``runner'' $\phi_{a}^{:M\leadsto\text{Id}}$ is \begin{equation} -\phi_{a}^{:M^{X}\Rightarrow X}=\big(m^{A\Rightarrow X}\Rightarrow m(a)\big)\quad.\label{eq:runner-phi-def} +\phi_{a}^{:M^{X}\rightarrow X}=\big(m^{A\rightarrow X}\rightarrow m(a)\big)\quad.\label{eq:runner-phi-def} \end{equation} So we are inspired to use the runner law for the monad transformer $T_{R}^{M}$. That law (which holds since we assumed that $T_{R}^{M}$ @@ -4163,30 +4163,30 @@ \subsubsection{Statement \label{subsec:Statement-rigid-monads-are-rigid-functors the \lstinline!fuseOut! function (which always exists for any functor $R$), \[ -\text{fo}_{R}=\big(r\Rightarrow a\Rightarrow r\triangleright\phi_{a}^{\uparrow R}\big)\quad, +\text{fo}_{R}=\big(r\rightarrow a\rightarrow r\triangleright\phi_{a}^{\uparrow R}\big)\quad, \] and then rewrite the law~(\ref{eq:rigid-non-degeneracy-law}) as \begin{align*} {\color{greenunder}\text{expect to equal }m:}\quad & m^{:M^{R^{B}}}\triangleright\text{fi}_{R}\bef\text{fo}_{R}=\left(m\triangleright\text{fi}_{R}\right)\triangleright\gunderline{\text{fo}_{R}}\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:fuseOut-def})}:}\quad & =a\Rightarrow m\triangleright\gunderline{\text{fi}_{R}}\triangleright\phi_{a}^{\uparrow R}\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-fuseIn-def})}:}\quad & =a\Rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\bef\gunderline{\text{ftn}_{T}\bef\phi_{a}^{\uparrow R}}\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-is-rigid-functor-derivation1})}:}\quad & =a\Rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\gunderline{\text{pu}_{R}\bef\phi_{a}^{\uparrow R\uparrow M\uparrow R}\bef\phi_{a}^{\uparrow R}}\bef\text{ftn}_{R}\\ -{\color{greenunder}\text{naturality of }\text{pu}_{R}:}\quad & =a\Rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\phi_{a}^{\uparrow R\uparrow M}\bef\phi_{a}\bef\gunderline{\text{pu}_{R}\bef\text{ftn}_{R}}\\ -{\color{greenunder}\text{left identity law of }R:}\quad & =a\Rightarrow m\triangleright\gunderline{(\text{pu}_{M}\bef\phi_{a})}^{\uparrow R\uparrow M}\bef\phi_{a}\\ -{\color{greenunder}\text{identity law for }\phi_{a}:}\quad & =a\Rightarrow m\triangleright\gunderline{\phi_{a}}\\ -{\color{greenunder}\text{definition~(\ref{eq:runner-phi-def}) for }\phi_{a}:}\quad & =\gunderline{\left(a\Rightarrow m(a)\right)}=m\quad. +{\color{greenunder}\text{use Eq.~(\ref{eq:fuseOut-def})}:}\quad & =a\rightarrow m\triangleright\gunderline{\text{fi}_{R}}\triangleright\phi_{a}^{\uparrow R}\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-fuseIn-def})}:}\quad & =a\rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\text{pu}_{R}\bef\gunderline{\text{ftn}_{T}\bef\phi_{a}^{\uparrow R}}\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-monad-is-rigid-functor-derivation1})}:}\quad & =a\rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\gunderline{\text{pu}_{R}\bef\phi_{a}^{\uparrow R\uparrow M\uparrow R}\bef\phi_{a}^{\uparrow R}}\bef\text{ftn}_{R}\\ +{\color{greenunder}\text{naturality of }\text{pu}_{R}:}\quad & =a\rightarrow m\triangleright\text{pu}_{M}^{\uparrow R\uparrow M}\bef\phi_{a}^{\uparrow R\uparrow M}\bef\phi_{a}\bef\gunderline{\text{pu}_{R}\bef\text{ftn}_{R}}\\ +{\color{greenunder}\text{left identity law of }R:}\quad & =a\rightarrow m\triangleright\gunderline{(\text{pu}_{M}\bef\phi_{a})}^{\uparrow R\uparrow M}\bef\phi_{a}\\ +{\color{greenunder}\text{identity law for }\phi_{a}:}\quad & =a\rightarrow m\triangleright\gunderline{\phi_{a}}\\ +{\color{greenunder}\text{definition~(\ref{eq:runner-phi-def}) for }\phi_{a}:}\quad & =\gunderline{\left(a\rightarrow m(a)\right)}=m\quad. \end{align*} Here we used the monadic morphism identity law for $\phi_{a}$, \[ -\text{pu}_{M}\bef\phi_{a}=\big(x\Rightarrow(\_\Rightarrow x)\big)\bef(m\Rightarrow a\triangleright m)=\left(x\Rightarrow a\triangleright(\_\Rightarrow x)\right)=\left(x\Rightarrow x\right)=\text{id}\quad. +\text{pu}_{M}\bef\phi_{a}=\big(x\rightarrow(\_\rightarrow x)\big)\bef(m\rightarrow a\triangleright m)=\left(x\rightarrow a\triangleright(\_\rightarrow x)\right)=\left(x\rightarrow x\right)=\text{id}\quad. \] \subsubsection{Example \label{subsec:Example-fo-fi-not-id}\ref{subsec:Example-fo-fi-not-id}\index{solved examples}} To show that the opposite of the non-degeneracy law does not always -hold, consider the rigid monads $P^{A}\triangleq Z\Rightarrow A$ -and $R^{A}\triangleq\left(A\Rightarrow Q\right)\Rightarrow A$, where +hold, consider the rigid monads $P^{A}\triangleq Z\rightarrow A$ +and $R^{A}\triangleq\left(A\rightarrow Q\right)\rightarrow A$, where $Q$ and $Z$ are fixed types. Since all rigid monads are rigid functors, it follows that the monads $P$ and $R$ have methods $\text{fi}_{P}$, $\text{fo}_{P}$, $\text{fi}_{R}$,$\text{fo}_{R}$ satisfying the @@ -4198,8 +4198,8 @@ \subsubsection{Example \label{subsec:Example-fo-fi-not-id}\ref{subsec:Example-fo To show that $\text{fo}_{P}\bef\text{fi}_{P}=\text{id}$, consider the type signatures of $\text{fo}_{P}$ and $\text{fi}_{P}$: \begin{align*} -\text{fo}_{P} & :P^{A\Rightarrow B}\Rightarrow A\Rightarrow P^{B}\cong\left(Z\Rightarrow A\Rightarrow B\right)\Rightarrow\left(A\Rightarrow Z\Rightarrow B\right)\quad,\\ -\text{fi}_{P} & :\big(A\Rightarrow P^{B}\big)\Rightarrow P^{A\Rightarrow B}\cong\left(A\Rightarrow Z\Rightarrow B\right)\Rightarrow\left(Z\Rightarrow A\Rightarrow B\right)\quad. +\text{fo}_{P} & :P^{A\rightarrow B}\rightarrow A\rightarrow P^{B}\cong\left(Z\rightarrow A\rightarrow B\right)\rightarrow\left(A\rightarrow Z\rightarrow B\right)\quad,\\ +\text{fi}_{P} & :\big(A\rightarrow P^{B}\big)\rightarrow P^{A\rightarrow B}\cong\left(A\rightarrow Z\rightarrow B\right)\rightarrow\left(Z\rightarrow A\rightarrow B\right)\quad. \end{align*} The implementations of these functions are derived uniquely from type signatures, as long as we require that these implementations are natural @@ -4209,47 +4209,47 @@ \subsubsection{Example \label{subsec:Example-fo-fi-not-id}\ref{subsec:Example-fo are inverses of each other. To show this directly, consider the type signature of $\text{fo}_{P}\bef\text{fi}_{P}$, \[ -\big(\text{fo}_{P}\bef\text{fi}_{P}\big):P^{A\Rightarrow B}\Rightarrow P^{A\Rightarrow B}\cong\left(Z\Rightarrow A\Rightarrow B\right)\Rightarrow\left(Z\Rightarrow A\Rightarrow B\right)\quad. +\big(\text{fo}_{P}\bef\text{fi}_{P}\big):P^{A\rightarrow B}\rightarrow P^{A\rightarrow B}\cong\left(Z\rightarrow A\rightarrow B\right)\rightarrow\left(Z\rightarrow A\rightarrow B\right)\quad. \] There is only one implementation for this type signature as a natural -transformation, namely the identity function $\text{id}^{Z\Rightarrow A\Rightarrow B}$. +transformation, namely the identity function $\text{id}^{Z\rightarrow A\rightarrow B}$. For the monad $R$, the type signatures of $\text{fi}_{R}$ and $\text{fo}_{R}$ are \begin{align*} -\text{fi}_{R} & :\left(A\Rightarrow\left(B\Rightarrow Q\right)\Rightarrow B\right)\Rightarrow\left(\left(A\Rightarrow B\right)\Rightarrow Q\right)\Rightarrow A\Rightarrow B\quad,\\ -\text{fo}_{R} & :\left(\left(\left(A\Rightarrow B\right)\Rightarrow Q\right)\Rightarrow A\Rightarrow B\right)\Rightarrow A\Rightarrow\left(B\Rightarrow Q\right)\Rightarrow B\quad, +\text{fi}_{R} & :\left(A\rightarrow\left(B\rightarrow Q\right)\rightarrow B\right)\rightarrow\left(\left(A\rightarrow B\right)\rightarrow Q\right)\rightarrow A\rightarrow B\quad,\\ +\text{fo}_{R} & :\left(\left(\left(A\rightarrow B\right)\rightarrow Q\right)\rightarrow A\rightarrow B\right)\rightarrow A\rightarrow\left(B\rightarrow Q\right)\rightarrow B\quad, \end{align*} and the implementations are again derived uniquely from type signatures, \begin{align*} -f^{:A\Rightarrow\left(B\Rightarrow Q\right)\Rightarrow B} & \triangleright\text{fi}_{R}=x^{:\left(A\Rightarrow B\right)\Rightarrow Q}\Rightarrow a^{:A}\Rightarrow f(a)(b^{:B}\Rightarrow x(\_\Rightarrow b))\quad,\\ -g^{:\left(\left(A\Rightarrow B\right)\Rightarrow Q\right)\Rightarrow A\Rightarrow B} & \triangleright\text{fo}_{R}=a^{:A}\Rightarrow y^{:B\Rightarrow Q}\Rightarrow g(h^{:A\Rightarrow B}\Rightarrow y(h(a)))(a)\quad. +f^{:A\rightarrow\left(B\rightarrow Q\right)\rightarrow B} & \triangleright\text{fi}_{R}=x^{:\left(A\rightarrow B\right)\rightarrow Q}\rightarrow a^{:A}\rightarrow f(a)(b^{:B}\rightarrow x(\_\rightarrow b))\quad,\\ +g^{:\left(\left(A\rightarrow B\right)\rightarrow Q\right)\rightarrow A\rightarrow B} & \triangleright\text{fo}_{R}=a^{:A}\rightarrow y^{:B\rightarrow Q}\rightarrow g(h^{:A\rightarrow B}\rightarrow y(h(a)))(a)\quad. \end{align*} We notice that the implementation of $\text{fi}_{R}$ uses a constant -function, $\left(\_\Rightarrow b\right)$, which is likely to lose +function, $\left(\_\rightarrow b\right)$, which is likely to lose information. Indeed, while $\text{fi}_{R}\bef\text{fo}_{R}=\text{id}$ as it must be due to the rigid non-degeneracy law, we find that \begin{align*} {\color{greenunder}\text{expect \emph{not} to equal }g:}\quad & g\triangleright\text{fo}_{R}\bef\text{fi}_{R}=\left(g\triangleright\text{fo}_{R}\right)\triangleright\gunderline{\text{fi}_{R}}\\ -{\color{greenunder}\text{definition of }\text{fi}_{R}:}\quad & =x\Rightarrow a\Rightarrow\gunderline{\text{fo}_{R}}(g)(a)(b\Rightarrow x(\_\Rightarrow b))\\ -{\color{greenunder}\text{definition of }\text{fo}_{R}:}\quad & =x\Rightarrow a\Rightarrow g\big(h^{:A\Rightarrow B}\Rightarrow h(a)\triangleright\gunderline{(b\Rightarrow}x(\_\Rightarrow b))\big)(a)\\ -{\color{greenunder}\text{apply to argument }b:}\quad & =x\Rightarrow a\Rightarrow g\big(h\Rightarrow x(\_\Rightarrow h(a))\big)(a)\quad. +{\color{greenunder}\text{definition of }\text{fi}_{R}:}\quad & =x\rightarrow a\rightarrow\gunderline{\text{fo}_{R}}(g)(a)(b\rightarrow x(\_\rightarrow b))\\ +{\color{greenunder}\text{definition of }\text{fo}_{R}:}\quad & =x\rightarrow a\rightarrow g\big(h^{:A\rightarrow B}\rightarrow h(a)\triangleright\gunderline{(b\rightarrow}x(\_\rightarrow b))\big)(a)\\ +{\color{greenunder}\text{apply to argument }b:}\quad & =x\rightarrow a\rightarrow g\big(h\rightarrow x(\_\rightarrow h(a))\big)(a)\quad. \end{align*} We cannot simplify the last line any further: the functions $g$, $h$, and $x$ are unknown, and we cannot calculate symbolically, -say, the value of $x(\_\Rightarrow h(a))$. If the last line were -equal to $g$, we would expect it to be $x\Rightarrow a\Rightarrow g(x)(a)$. -The difference is in the first argument of $g$, namely we have $h\Rightarrow x(\_\Rightarrow h(a))$ +say, the value of $x(\_\rightarrow h(a))$. If the last line were +equal to $g$, we would expect it to be $x\rightarrow a\rightarrow g(x)(a)$. +The difference is in the first argument of $g$, namely we have $h\rightarrow x(\_\rightarrow h(a))$ instead of $x$. The two last expressions are not always equal; they would be equal if we had \[ -\left(h\Rightarrow x(h)\right)=\left(h\Rightarrow x(k\Rightarrow h(k))\right) +\left(h\rightarrow x(h)\right)=\left(h\rightarrow x(k\rightarrow h(k))\right) \] -instead of $h\Rightarrow x(\_\Rightarrow h(a))$. Consider again the -argument of $x$ in the two last expressions: $k\Rightarrow h(a)$ -instead of $k\Rightarrow h(k)$. Since $h$ is not always a constant -function ($h$ is an arbitrary function of type $A\Rightarrow B$), -the two expressions $k\Rightarrow h(a)$ and $k\Rightarrow h(k)$ +instead of $h\rightarrow x(\_\rightarrow h(a))$. Consider again the +argument of $x$ in the two last expressions: $k\rightarrow h(a)$ +instead of $k\rightarrow h(k)$. Since $h$ is not always a constant +function ($h$ is an arbitrary function of type $A\rightarrow B$), +the two expressions $k\rightarrow h(a)$ and $k\rightarrow h(k)$ are generally not equal. So, we must conclude that $\text{fo}_{R}\bef\text{fi}_{R}\neq\text{id}$. \subsubsection{Exercise \label{subsec:Exercise-pair-functor-is-rigid}\ref{subsec:Exercise-pair-functor-is-rigid}\index{exercises}} @@ -4263,7 +4263,7 @@ \subsubsection{Exercise \label{subsec:Exercise-option-not-rigid}\ref{subsec:Exer \subsubsection{Exercise \label{subsec:Exercise-continuation-not-rigid-1}\ref{subsec:Exercise-continuation-not-rigid-1}} -Show that the functor $F^{A}\triangleq\left(A\Rightarrow Z\right)\Rightarrow Z$ +Show that the functor $F^{A}\triangleq\left(A\rightarrow Z\right)\rightarrow Z$ is not rigid. (Here $Z$ is a fixed type.) Since all rigid monads are rigid functors, we can reuse all the rigid @@ -4274,7 +4274,7 @@ \subsubsection{Exercise \label{subsec:Exercise-continuation-not-rigid-1}\ref{sub \subsubsection{Statement \label{subsec:Statement-rigid-functor-h-p}\ref{subsec:Statement-rigid-functor-h-p}} -The functor $S^{\bullet}\triangleq H^{\bullet}\Rightarrow P^{\bullet}$ +The functor $S^{\bullet}\triangleq H^{\bullet}\rightarrow P^{\bullet}$ is rigid when $H$ is any contrafunctor and $P$ is any rigid functor. (Note that $P$ does not need to be a monad.) @@ -4284,44 +4284,44 @@ \subsubsection{Statement \label{subsec:Statement-rigid-functor-h-p}\ref{subsec:S satisfy the non-degeneracy law~(\ref{eq:rigid-non-degeneracy-law}). The function $\text{fi}_{S}$ is then defined by \begin{align*} -\text{fi}_{S} & :\big(A\Rightarrow H^{B}\Rightarrow P^{B}\big)\Rightarrow H^{A\Rightarrow B}\Rightarrow P^{A\Rightarrow B}\quad,\\ -\text{fi}_{S} & =f^{:A\Rightarrow H^{B}\Rightarrow P^{B}}\Rightarrow h^{:H^{A\Rightarrow B}}\Rightarrow\text{fi}_{P}\big(a\Rightarrow f(a)\big(\left(b\Rightarrow\_\Rightarrow b\right)^{\downarrow H}h\big)\big)\quad, +\text{fi}_{S} & :\big(A\rightarrow H^{B}\rightarrow P^{B}\big)\rightarrow H^{A\rightarrow B}\rightarrow P^{A\rightarrow B}\quad,\\ +\text{fi}_{S} & =f^{:A\rightarrow H^{B}\rightarrow P^{B}}\rightarrow h^{:H^{A\rightarrow B}}\rightarrow\text{fi}_{P}\big(a\rightarrow f(a)\big(\left(b\rightarrow\_\rightarrow b\right)^{\downarrow H}h\big)\big)\quad, \end{align*} or, using the forwarding notation, \[ -h\triangleright\text{fi}_{S}(f)=\big(a\Rightarrow h\triangleright\left(b\Rightarrow\_\Rightarrow b\right)^{\downarrow H}\triangleright f(a)\big)\triangleright\text{fi}_{P}\quad. +h\triangleright\text{fi}_{S}(f)=\big(a\rightarrow h\triangleright\left(b\rightarrow\_\rightarrow b\right)^{\downarrow H}\triangleright f(a)\big)\triangleright\text{fi}_{P}\quad. \] Let us write the definition of $\text{fo}_{S}$ as well, \begin{align*} -\text{fo}_{S} & :\big(H^{A\Rightarrow B}\Rightarrow P^{A\Rightarrow B}\big)\Rightarrow A\Rightarrow H^{B}\Rightarrow P^{B}\quad,\\ -\text{fo}_{S} & =g^{:H^{A\Rightarrow B}\Rightarrow P^{A\Rightarrow B}}\Rightarrow a^{:A}\Rightarrow h^{:H^{B}}\Rightarrow\text{fo}_{P}\bigg(g\big(\left(p^{:A\Rightarrow B}\Rightarrow p(a)\right)^{\downarrow H}h\big)\bigg)(a)\quad, +\text{fo}_{S} & :\big(H^{A\rightarrow B}\rightarrow P^{A\rightarrow B}\big)\rightarrow A\rightarrow H^{B}\rightarrow P^{B}\quad,\\ +\text{fo}_{S} & =g^{:H^{A\rightarrow B}\rightarrow P^{A\rightarrow B}}\rightarrow a^{:A}\rightarrow h^{:H^{B}}\rightarrow\text{fo}_{P}\bigg(g\big(\left(p^{:A\rightarrow B}\rightarrow p(a)\right)^{\downarrow H}h\big)\bigg)(a)\quad, \end{align*} or, using the forwarding notation, \[ -\text{fo}_{S}(g)=a\triangleright\big(h\triangleright\left(p\Rightarrow p(a)\right)^{\downarrow H}\bef g\bef\text{fo}_{P}\big)\quad. +\text{fo}_{S}(g)=a\triangleright\big(h\triangleright\left(p\rightarrow p(a)\right)^{\downarrow H}\bef g\bef\text{fo}_{P}\big)\quad. \] To verify the non-degeneracy law for $S$, apply both sides to some arguments; we expect $f\triangleright(\text{fi}_{S}\bef\text{fo}_{S})$ -to equal $f$ for an arbitrary $f:A\Rightarrow H^{B}\Rightarrow P^{B}$. +to equal $f$ for an arbitrary $f:A\rightarrow H^{B}\rightarrow P^{B}$. To compare values, we need to apply both sides further to some arguments $a:A$ and $h:H^{B}$. So we expect the following expression to equal $f(a)(h)$: \begin{align*} \quad & \left(f\triangleright\text{fi}_{S}\bef\text{fo}_{S}\right)(a)(h)=(f\triangleright\text{fi}_{S}\triangleright\gunderline{\text{fo}_{S}})(a)(h)\\ -{\color{greenunder}\text{expand }\text{fo}_{S}:}\quad & =a\triangleright\big(h\triangleright\left(p\Rightarrow a\triangleright p\right)^{\downarrow H}\triangleright\gunderline{\text{fi}_{S}(f)}\triangleright\text{fo}_{P}\big)\\ -{\color{greenunder}\text{expand }\text{fi}_{S}:}\quad & =a\triangleright\big(\big(a\Rightarrow h\triangleright\gunderline{\left(p\Rightarrow p(a)\right)^{\downarrow H}\bef\left(b\Rightarrow\_\Rightarrow b\right)^{\downarrow H}}\bef f(a)\big)\triangleright\text{fi}_{P}\triangleright\text{fo}_{P}\big)\\ -{\color{greenunder}\text{compose }^{\downarrow H}:}\quad & =a\triangleright\big(\big(a\Rightarrow h\triangleright\gunderline{\left((b\Rightarrow\_\Rightarrow b)\bef(p\Rightarrow p(a))\right)^{\downarrow H}}\bef f(a)\big)\triangleright\text{fi}_{P}\gunderline{\triangleright}\text{fo}_{P}\big)\quad. +{\color{greenunder}\text{expand }\text{fo}_{S}:}\quad & =a\triangleright\big(h\triangleright\left(p\rightarrow a\triangleright p\right)^{\downarrow H}\triangleright\gunderline{\text{fi}_{S}(f)}\triangleright\text{fo}_{P}\big)\\ +{\color{greenunder}\text{expand }\text{fi}_{S}:}\quad & =a\triangleright\big(\big(a\rightarrow h\triangleright\gunderline{\left(p\rightarrow p(a)\right)^{\downarrow H}\bef\left(b\rightarrow\_\rightarrow b\right)^{\downarrow H}}\bef f(a)\big)\triangleright\text{fi}_{P}\triangleright\text{fo}_{P}\big)\\ +{\color{greenunder}\text{compose }^{\downarrow H}:}\quad & =a\triangleright\big(\big(a\rightarrow h\triangleright\gunderline{\left((b\rightarrow\_\rightarrow b)\bef(p\rightarrow p(a))\right)^{\downarrow H}}\bef f(a)\big)\triangleright\text{fi}_{P}\gunderline{\triangleright}\text{fo}_{P}\big)\quad. \end{align*} Computing the function composition \[ -(b\Rightarrow\_\Rightarrow b)\bef(p\Rightarrow p(a))=(b\Rightarrow(\_\Rightarrow b)(a))=(b\Rightarrow b)=\text{id}\quad, +(b\rightarrow\_\rightarrow b)\bef(p\rightarrow p(a))=(b\rightarrow(\_\rightarrow b)(a))=(b\rightarrow b)=\text{id}\quad, \] and using the non-degeneracy law $\text{fi}_{P}\bef\text{fo}_{P}=\text{id}$, we can simplify further: \begin{align*} - & a\triangleright\big(\big(a\Rightarrow h\triangleright\gunderline{\left((b\Rightarrow\_\Rightarrow b)\bef(p\Rightarrow p(a))\right)^{\downarrow H}}\bef f(a)\big)\triangleright\text{fi}_{P}\gunderline{\triangleright}\text{fo}_{P}\big)\\ -{\color{greenunder}\text{identity law for }H:}\quad & =a\triangleright\big(\big(a\Rightarrow h\triangleright f(a)\big)\triangleright\gunderline{\text{fi}_{P}\bef\text{fo}_{P}}\big)\\ -{\color{greenunder}\text{non-degeneracy}:}\quad & =\gunderline{a\triangleright\big(a\Rightarrow}h\triangleright f(a)\big)=h\triangleright f(a)\quad. + & a\triangleright\big(\big(a\rightarrow h\triangleright\gunderline{\left((b\rightarrow\_\rightarrow b)\bef(p\rightarrow p(a))\right)^{\downarrow H}}\bef f(a)\big)\triangleright\text{fi}_{P}\gunderline{\triangleright}\text{fo}_{P}\big)\\ +{\color{greenunder}\text{identity law for }H:}\quad & =a\triangleright\big(\big(a\rightarrow h\triangleright f(a)\big)\triangleright\gunderline{\text{fi}_{P}\bef\text{fo}_{P}}\big)\\ +{\color{greenunder}\text{non-degeneracy}:}\quad & =\gunderline{a\triangleright\big(a\rightarrow}h\triangleright f(a)\big)=h\triangleright f(a)\quad. \end{align*} This equals $f(a)(h)$, as required.% \begin{comment} @@ -4339,25 +4339,25 @@ \subsubsection{Statement \label{subsec:Statement-rigid-functor-h-p}\ref{subsec:S Since it is given that $M$ is rigid, we may use its method $\text{fi}_{M}$ satisfying the non-degeneracy law $\text{fo}_{M}\left(\text{fi}_{M}\,f\right)=f$. -Flip the curried arguments of the function type $A\Rightarrow T^{B}\triangleq A\Rightarrow H^{M^{B}}\Rightarrow M^{B}$, -to obtain $H^{M^{B}}\Rightarrow A\Rightarrow M^{B}$, and note that -$A\Rightarrow M^{B}$ can be mapped to $M^{A\Rightarrow B}$ using +Flip the curried arguments of the function type $A\rightarrow T^{B}\triangleq A\rightarrow H^{M^{B}}\rightarrow M^{B}$, +to obtain $H^{M^{B}}\rightarrow A\rightarrow M^{B}$, and note that +$A\rightarrow M^{B}$ can be mapped to $M^{A\rightarrow B}$ using $\text{fi}_{M}$. So we can implement $\tilde{\text{fi}}_{T}$ using $\text{fi}_{M}$: \begin{align*} -\tilde{\text{fi}}_{T} & :\big(H^{M^{B}}\Rightarrow A\Rightarrow M^{B}\big)\Rightarrow H^{M^{A\Rightarrow B}}\Rightarrow M^{A\Rightarrow B}\\ -\tilde{\text{fi}}_{T} & =f\Rightarrow h\Rightarrow\text{fi}_{M}\left(f\big(\left(b\Rightarrow\_\Rightarrow b\right)^{\uparrow M\downarrow H}h\big)\right)\\ -\tilde{\text{fo}}_{T} & :\left(H^{M^{A\Rightarrow B}}\Rightarrow M^{A\Rightarrow B}\right)\Rightarrow H^{M^{B}}\Rightarrow A\Rightarrow M^{B}\\ -\tilde{\text{fo}}_{T} & =g\Rightarrow h\Rightarrow a\Rightarrow\text{fo}_{M}\left(g\big(\left(p^{:A\Rightarrow B}\Rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)\right)a +\tilde{\text{fi}}_{T} & :\big(H^{M^{B}}\rightarrow A\rightarrow M^{B}\big)\rightarrow H^{M^{A\rightarrow B}}\rightarrow M^{A\rightarrow B}\\ +\tilde{\text{fi}}_{T} & =f\rightarrow h\rightarrow\text{fi}_{M}\left(f\big(\left(b\rightarrow\_\rightarrow b\right)^{\uparrow M\downarrow H}h\big)\right)\\ +\tilde{\text{fo}}_{T} & :\left(H^{M^{A\rightarrow B}}\rightarrow M^{A\rightarrow B}\right)\rightarrow H^{M^{B}}\rightarrow A\rightarrow M^{B}\\ +\tilde{\text{fo}}_{T} & =g\rightarrow h\rightarrow a\rightarrow\text{fo}_{M}\left(g\big(\left(p^{:A\rightarrow B}\rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)\right)a \end{align*} To show the non-degeneracy law for $T$, compute \begin{align*} & \tilde{\text{fo}}_{T}\left(\tilde{\text{fi}}_{T}f\right)h^{:H^{M^{B}}}a^{:A}\\ -\text{insert the definition of }\tilde{\text{fo}}_{T}\text{: }\quad & =\text{fo}_{M}\left(\left(\tilde{\text{fi}}_{T}f\right)\big(\left(p\Rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)\right)a\\ -\text{insert the definition of }\tilde{\text{fi}}_{T}\text{: }\quad & =\text{fo}_{M}\left(\text{fi}_{M}\left(f\big(\left(b\Rightarrow\_\Rightarrow b\right)^{\uparrow M\downarrow H}\left(p\Rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)\right)\right)a\\ -\text{nondegeneracy law for }\text{fi}_{M}\text{: }\quad & =f\big(\left(b\Rightarrow\_\Rightarrow b\right)^{\uparrow M\downarrow H}\left(p\Rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)a\\ -\text{composition laws for }M,H\text{: }\quad & =f\big(\left(b\Rightarrow\_\Rightarrow b\bef p\Rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)a\\ -\text{simplify }\text{: }\quad & =f\left(\left(b\Rightarrow b\right)^{\uparrow M\downarrow H}h\right)a\\ +\text{insert the definition of }\tilde{\text{fo}}_{T}\text{: }\quad & =\text{fo}_{M}\left(\left(\tilde{\text{fi}}_{T}f\right)\big(\left(p\rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)\right)a\\ +\text{insert the definition of }\tilde{\text{fi}}_{T}\text{: }\quad & =\text{fo}_{M}\left(\text{fi}_{M}\left(f\big(\left(b\rightarrow\_\rightarrow b\right)^{\uparrow M\downarrow H}\left(p\rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)\right)\right)a\\ +\text{nondegeneracy law for }\text{fi}_{M}\text{: }\quad & =f\big(\left(b\rightarrow\_\rightarrow b\right)^{\uparrow M\downarrow H}\left(p\rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)a\\ +\text{composition laws for }M,H\text{: }\quad & =f\big(\left(b\rightarrow\_\rightarrow b\bef p\rightarrow p\,a\right)^{\uparrow M\downarrow H}h\big)a\\ +\text{simplify }\text{: }\quad & =f\left(\left(b\rightarrow b\right)^{\uparrow M\downarrow H}h\right)a\\ \text{identity laws for }M,H\text{: }\quad & =f\,h\,a\quad. \end{align*} We obtained $\tilde{\text{fo}}_{T}\left(\tilde{\text{fi}}_{T}\,f\right)h\,a=f\,h\,a$. @@ -4366,25 +4366,25 @@ \subsubsection{Statement \label{subsec:Statement-rigid-functor-h-p}\ref{subsec:S \end{comment} \begin{comment} Trying the triangle notation: It seems that $\left(a\triangleright\right)$ -is not so useful, we could just write $\left(f\Rightarrow f(a)\right)$ +is not so useful, we could just write $\left(f\rightarrow f(a)\right)$ instead. \begin{align*} -\tilde{\text{fi}}\left(f\right) & =f\triangleright\tilde{\text{fi}}=\left(b\Rightarrow\_\Rightarrow b\right)^{\downarrow H}\bef f\quad,\\ -\tilde{\text{fo}}\left(g\right) & =g\triangleright\tilde{\text{fo}}=h\Rightarrow a\Rightarrow g((a\triangleright)^{\downarrow H}h)a=h\Rightarrow a\Rightarrow h\triangleright(a\triangleright)^{\downarrow H}\bef g\bef\left(a\triangleright\right)\quad. +\tilde{\text{fi}}\left(f\right) & =f\triangleright\tilde{\text{fi}}=\left(b\rightarrow\_\rightarrow b\right)^{\downarrow H}\bef f\quad,\\ +\tilde{\text{fo}}\left(g\right) & =g\triangleright\tilde{\text{fo}}=h\rightarrow a\rightarrow g((a\triangleright)^{\downarrow H}h)a=h\rightarrow a\rightarrow h\triangleright(a\triangleright)^{\downarrow H}\bef g\bef\left(a\triangleright\right)\quad. \end{align*} Then \begin{align*} & f\triangleright\tilde{\text{fi}}\triangleright\tilde{\text{fo}}\\ - & =h\Rightarrow a\Rightarrow h\triangleright(a\triangleright)^{\downarrow H}\bef\left(f\triangleright\tilde{\text{fi}}\right)\bef\left(a\triangleright\right)\\ - & =h\Rightarrow a\Rightarrow h\triangleright(a\triangleright)^{\downarrow H}\bef\left(b\Rightarrow\_\Rightarrow b\right)^{\downarrow H}\bef f\bef\left(a\triangleright\right)\\ - & =h\Rightarrow a\Rightarrow h\triangleright\left(b\Rightarrow\_\Rightarrow b\bef\left(a\triangleright\right)\right)^{\downarrow H}\bef f\bef\left(a\triangleright\right)\\ - & =h\Rightarrow a\Rightarrow h\triangleright f\bef\left(a\triangleright\right)=h\Rightarrow a\Rightarrow h\triangleright f\triangleright\left(a\triangleright\right)\\ - & =h\Rightarrow a\Rightarrow f(h)(a)=f + & =h\rightarrow a\rightarrow h\triangleright(a\triangleright)^{\downarrow H}\bef\left(f\triangleright\tilde{\text{fi}}\right)\bef\left(a\triangleright\right)\\ + & =h\rightarrow a\rightarrow h\triangleright(a\triangleright)^{\downarrow H}\bef\left(b\rightarrow\_\rightarrow b\right)^{\downarrow H}\bef f\bef\left(a\triangleright\right)\\ + & =h\rightarrow a\rightarrow h\triangleright\left(b\rightarrow\_\rightarrow b\bef\left(a\triangleright\right)\right)^{\downarrow H}\bef f\bef\left(a\triangleright\right)\\ + & =h\rightarrow a\rightarrow h\triangleright f\bef\left(a\triangleright\right)=h\rightarrow a\rightarrow h\triangleright f\triangleright\left(a\triangleright\right)\\ + & =h\rightarrow a\rightarrow f(h)(a)=f \end{align*} What are the simplification rules? \begin{align*} - & a\Rightarrow x\triangleright\left(a\triangleright\right)=x\quad,\\ - & a\Rightarrow a\triangleright f=f\quad,\\ + & a\rightarrow x\triangleright\left(a\triangleright\right)=x\quad,\\ + & a\rightarrow a\triangleright f=f\quad,\\ & x\triangleright\left(a\triangleright\right)=x(a)=a\triangleright x\quad,\\ & x\triangleright y\triangleright\left(a\triangleright\right)=a\triangleright\left(x\triangleright y\right)\quad. \end{align*} @@ -4396,29 +4396,29 @@ \subsubsection{Statement \label{subsec:Statement-rigid-functor-is-pointed}\ref{s A rigid functor $R$ is pointed; the method \lstinline!pure! can be defined as \[ -\text{pu}_{R}(x^{:A})\triangleq\text{id}^{:R^{A}\Rightarrow R^{A}}\triangleright\text{fi}_{R}\triangleright(\_\Rightarrow x)^{\uparrow R}\quad. +\text{pu}_{R}(x^{:A})\triangleq\text{id}^{:R^{A}\rightarrow R^{A}}\triangleright\text{fi}_{R}\triangleright(\_\rightarrow x)^{\uparrow R}\quad. \] In particular, there is a selected value $r_{1}$ of type $R^{\bbnum 1}$ (``wrapped unit''), computed as \begin{equation} -r_{1}\triangleq\text{pu}_{R}(1)=\text{id}\triangleright\text{fi}_{R}\triangleright(\_\Rightarrow1)^{\uparrow R}\quad.\label{eq:rigid-functor-def-of-wrapped-unit} +r_{1}\triangleq\text{pu}_{R}(1)=\text{id}\triangleright\text{fi}_{R}\triangleright(\_\rightarrow1)^{\uparrow R}\quad.\label{eq:rigid-functor-def-of-wrapped-unit} \end{equation} \paragraph{Proof} -The method $\text{fi}_{R}:(X\Rightarrow R^{Y})\Rightarrow R^{X\Rightarrow Y}$ +The method $\text{fi}_{R}:(X\rightarrow R^{Y})\rightarrow R^{X\rightarrow Y}$ with type parameters $X=R^{A}$ and $Y=A$ is applied to the identity -function $\text{id}:R^{A}=R^{A}$, considered as a value of type $X\Rightarrow R^{Y}$. +function $\text{id}:R^{A}=R^{A}$, considered as a value of type $X\rightarrow R^{Y}$. The result is a value \[ -\text{fi}_{R}(\text{id}):R^{R^{A}\Rightarrow A}\quad. +\text{fi}_{R}(\text{id}):R^{R^{A}\rightarrow A}\quad. \] -The result is transformed via the raised constant function $\left(\_\Rightarrow x\right)^{\uparrow R}$, -which takes $R^{R^{A}\Rightarrow A}$ and returns $R^{A}$. The resulting +The result is transformed via the raised constant function $\left(\_\rightarrow x\right)^{\uparrow R}$, +which takes $R^{R^{A}\rightarrow A}$ and returns $R^{A}$. The resulting code can be written as \[ -\text{pu}_{R}(x)\triangleq(\_\Rightarrow x)^{\uparrow R}(\text{fi}_{R}(\text{id}))=\text{id}\triangleright\text{fi}_{R}\triangleright(\_\Rightarrow x)^{\uparrow R}\quad. +\text{pu}_{R}(x)\triangleq(\_\rightarrow x)^{\uparrow R}(\text{fi}_{R}(\text{id}))=\text{id}\triangleright\text{fi}_{R}\triangleright(\_\rightarrow x)^{\uparrow R}\quad. \] The function $\text{pu}_{R}$ defined in this way is a natural transformation since $\text{fi}_{R}$ is one. Applying $\text{pu}_{R}$ to a unit @@ -4441,60 +4441,60 @@ \subsubsection{Theorem \label{subsec:Statement-rigid-functor-wrapped-unit-is-uni The value $r_{1}$ defined by Eq.~(\ref{eq:rigid-functor-def-of-wrapped-unit}) is the only available distinct value of type $R^{\bbnum 1}$. The isomorphism map between $\bbnum 1$ and $R^{\bbnum 1}$ is the function -$\left(1\Rightarrow r_{1}\right)$. +$\left(1\rightarrow r_{1}\right)$. \paragraph{Proof} The plan of the proof is to apply both sides of the non-degeneracy law $\text{fi}_{R}\bef\text{fo}_{R}=\text{id}$ to the identity function -of type $R^{\bbnum 1}\Rightarrow R^{\bbnum 1}$. To adapt the type +of type $R^{\bbnum 1}\rightarrow R^{\bbnum 1}$. To adapt the type parameters, consider the generic type signature of $\text{fi}_{R}\bef\text{fo}_{R}$, \[ -\big(\text{fi}_{R}\bef\text{fo}_{R}\big):(A\Rightarrow R^{B})\Rightarrow(A\Rightarrow R^{B})\quad, +\big(\text{fi}_{R}\bef\text{fo}_{R}\big):(A\rightarrow R^{B})\rightarrow(A\rightarrow R^{B})\quad, \] and set $A=R^{\bbnum 1}$ and $B=\bbnum 1$. The left-hand side of -the law can be now applied to the identity function $\text{id}:R^{\bbnum 1}\Rightarrow R^{\bbnum 1}$, -which yields a value of type $R^{\bbnum 1}\Rightarrow R^{\bbnum 1}$, +the law can be now applied to the identity function $\text{id}:R^{\bbnum 1}\rightarrow R^{\bbnum 1}$, +which yields a value of type $R^{\bbnum 1}\rightarrow R^{\bbnum 1}$, i.e.~a function \[ -f_{1}:R^{\bbnum 1}\Rightarrow R^{\bbnum 1}\quad,\quad\quad f_{1}\triangleq\text{fo}_{R}(\text{fi}_{R}(\text{id}))\quad. +f_{1}:R^{\bbnum 1}\rightarrow R^{\bbnum 1}\quad,\quad\quad f_{1}\triangleq\text{fo}_{R}(\text{fi}_{R}(\text{id}))\quad. \] -We will show that $f_{1}$ is a constant function, $f_{1}=(\_\Rightarrow r_{1})$, +We will show that $f_{1}$ is a constant function, $f_{1}=(\_\rightarrow r_{1})$, always returning the same value $r_{1}$ defined in Statement~\ref{subsec:Statement-rigid-functor-is-pointed}. However, the right-hand side of the non-degeneracy law applied to -$\text{id}$ is the identity function of type $R^{\bbnum 1}\Rightarrow R^{\bbnum 1}$. +$\text{id}$ is the identity function of type $R^{\bbnum 1}\rightarrow R^{\bbnum 1}$. So, the non-degeneracy law means that $f_{1}=\text{id}$. If the identity -function of type $R^{\bbnum 1}\Rightarrow R^{\bbnum 1}$ always returns +function of type $R^{\bbnum 1}\rightarrow R^{\bbnum 1}$ always returns the same value ($r_{1}$), it means that $r_{1}$ is the only distinct value of the type $R^{\bbnum 1}$. To begin the proof, note that for any fixed type $A$, the function -type $A\Rightarrow\bbnum 1$ is equivalent to $\bbnum 1$. This is -so because there exists only one pure function of type $A\Rightarrow\bbnum 1$, -namely $(\_\Rightarrow1)$. In other words, there is only one distinct -value of the type $A\Rightarrow\bbnum 1$, and the value is the function -$\left(\_\Rightarrow1\right)$. The code of this function is uniquely +type $A\rightarrow\bbnum 1$ is equivalent to $\bbnum 1$. This is +so because there exists only one pure function of type $A\rightarrow\bbnum 1$, +namely $(\_\rightarrow1)$. In other words, there is only one distinct +value of the type $A\rightarrow\bbnum 1$, and the value is the function +$\left(\_\rightarrow1\right)$. The code of this function is uniquely determined by its type signature. -The isomorphism between the types $A\Rightarrow\bbnum 1$ and $\bbnum 1$ -is realized by the functions $u:\bbnum 1\Rightarrow A\Rightarrow\bbnum 1$ -and $v:\left(A\Rightarrow\bbnum 1\right)\Rightarrow\bbnum 1$. The +The isomorphism between the types $A\rightarrow\bbnum 1$ and $\bbnum 1$ +is realized by the functions $u:\bbnum 1\rightarrow A\rightarrow\bbnum 1$ +and $v:\left(A\rightarrow\bbnum 1\right)\rightarrow\bbnum 1$. The code of these functions is also uniquely determined by their type signatures: \[ -u=\big(1\Rightarrow\_^{:A}\Rightarrow1\big)\quad,\quad\quad v=\big(\_^{:A\Rightarrow\bbnum 1}\Rightarrow1\big)\quad. +u=\big(1\rightarrow\_^{:A}\rightarrow1\big)\quad,\quad\quad v=\big(\_^{:A\rightarrow\bbnum 1}\rightarrow1\big)\quad. \] -Applying $\text{fi}_{R}$ to the identity function of type $R^{\bbnum 1}\Rightarrow R^{\bbnum 1}$, +Applying $\text{fi}_{R}$ to the identity function of type $R^{\bbnum 1}\rightarrow R^{\bbnum 1}$, we obtain a value $g$, \[ -g:R^{R^{\bbnum 1}\Rightarrow\bbnum 1}\quad,\quad\quad g\triangleq\text{id}\triangleright\text{fi}_{R}\quad. +g:R^{R^{\bbnum 1}\rightarrow\bbnum 1}\quad,\quad\quad g\triangleq\text{id}\triangleright\text{fi}_{R}\quad. \] -Since the type $R^{\bbnum 1}\Rightarrow\bbnum 1$ is equivalent to -$\bbnum 1$, the type $R^{R^{\bbnum 1}\Rightarrow\bbnum 1}$ is equivalent +Since the type $R^{\bbnum 1}\rightarrow\bbnum 1$ is equivalent to +$\bbnum 1$, the type $R^{R^{\bbnum 1}\rightarrow\bbnum 1}$ is equivalent to $R^{\bbnum 1}$. To use this equivalence explicitly, we need to raise the isomorphisms $u$ and $v$ into the functor $R$. The isomorphism -will then map $g:R^{R^{\bbnum 1}\Rightarrow\bbnum 1}$ to some $g_{1}:R^{\bbnum 1}$ +will then map $g:R^{R^{\bbnum 1}\rightarrow\bbnum 1}$ to some $g_{1}:R^{\bbnum 1}$ by \[ g_{1}\triangleq v^{\uparrow R}(g)\quad. @@ -4502,34 +4502,34 @@ \subsubsection{Theorem \label{subsec:Statement-rigid-functor-wrapped-unit-is-uni Substituting the definitions of $g$, $v$, and $r_{1}$, we find that actually $g_{1}=r_{1}$: \[ -g_{1}=\text{id}\triangleright\text{fi}_{R}\triangleright v^{\uparrow R}=\text{id}\triangleright\text{fi}_{R}\triangleright(\_\Rightarrow1)^{\uparrow R}=r_{1}\quad. +g_{1}=\text{id}\triangleright\text{fi}_{R}\triangleright v^{\uparrow R}=\text{id}\triangleright\text{fi}_{R}\triangleright(\_\rightarrow1)^{\uparrow R}=r_{1}\quad. \] We can now map $g_{1}$ back to $g$ via the raised isomorphism $u$: \begin{align} g & =g_{1}\triangleright u^{\uparrow R}=r_{1}\triangleright u^{\uparrow R}\nonumber \\ -{\color{greenunder}\text{definition of }u:}\quad & =r_{1}\triangleright\big(1\Rightarrow\_\Rightarrow1\big)^{\uparrow R}\quad.\label{eq:rigid-functor-derivation1} +{\color{greenunder}\text{definition of }u:}\quad & =r_{1}\triangleright\big(1\rightarrow\_\rightarrow1\big)^{\uparrow R}\quad.\label{eq:rigid-functor-derivation1} \end{align} Compute $\text{fo}_{R}(g)$ as \begin{align*} & \text{fo}_{R}(g)=g\triangleright\text{fo}_{R}\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:fuseOut-def})}:}\quad & =a^{:R^{\bbnum 1}}\Rightarrow g\triangleright\big(f^{:A\Rightarrow\bbnum 1}\Rightarrow f\left(a\right)\big)^{\uparrow R}\\ -{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-functor-derivation1})}:}\quad & =a\Rightarrow r_{1}\triangleright(1\Rightarrow\_^{:A}\Rightarrow1)^{\uparrow R}\triangleright\big(f^{:A\Rightarrow\bbnum 1}\Rightarrow f\left(a\right)\big)^{\uparrow R}\\ -{\color{greenunder}\text{composition under }^{\uparrow R}:}\quad & =a\Rightarrow r_{1}\triangleright(\gunderline{1\Rightarrow1})^{\uparrow R}\\ -{\color{greenunder}(1\Rightarrow1)\text{ is identity}:}\quad & =(a\Rightarrow r_{1}\triangleright\text{id})=(a^{:R^{\bbnum 1}}\Rightarrow r_{1})=(\_^{:R^{\bbnum 1}}\Rightarrow r_{1})\quad. +{\color{greenunder}\text{use Eq.~(\ref{eq:fuseOut-def})}:}\quad & =a^{:R^{\bbnum 1}}\rightarrow g\triangleright\big(f^{:A\rightarrow\bbnum 1}\rightarrow f\left(a\right)\big)^{\uparrow R}\\ +{\color{greenunder}\text{use Eq.~(\ref{eq:rigid-functor-derivation1})}:}\quad & =a\rightarrow r_{1}\triangleright(1\rightarrow\_^{:A}\rightarrow1)^{\uparrow R}\triangleright\big(f^{:A\rightarrow\bbnum 1}\rightarrow f\left(a\right)\big)^{\uparrow R}\\ +{\color{greenunder}\text{composition under }^{\uparrow R}:}\quad & =a\rightarrow r_{1}\triangleright(\gunderline{1\rightarrow1})^{\uparrow R}\\ +{\color{greenunder}(1\rightarrow1)\text{ is identity}:}\quad & =(a\rightarrow r_{1}\triangleright\text{id})=(a^{:R^{\bbnum 1}}\rightarrow r_{1})=(\_^{:R^{\bbnum 1}}\rightarrow r_{1})\quad. \end{align*} So, $\text{fo}_{R}(g)=\text{fo}_{R}(\text{fi}_{R}(\text{id}))$ is -a function of type $R^{\bbnum 1}\Rightarrow R^{\bbnum 1}$ that ignores +a function of type $R^{\bbnum 1}\rightarrow R^{\bbnum 1}$ that ignores its argument and always returns the same value $r_{1}$. By virtue of the non-degeneracy law, $\text{fo}_{R}(g)=\text{id}$. -We see that the identity function $\text{id}:R^{\bbnum 1}\Rightarrow R^{\bbnum 1}$ +We see that the identity function $\text{id}:R^{\bbnum 1}\rightarrow R^{\bbnum 1}$ always returns the same value $r_{1}$. Applying this function to an arbitrary value $x:R^{\bbnum 1}$, we get \[ -x=x\triangleright\text{id}=x\triangleright\text{fo}_{R}(g)=x\triangleright(\_\Rightarrow r_{1})=r_{1}\quad. +x=x\triangleright\text{id}=x\triangleright\text{fo}_{R}(g)=x\triangleright(\_\rightarrow r_{1})=r_{1}\quad. \] It means that all values of type $R^{\bbnum 1}$ are equal to $r_{1}$. -So the function $1\Rightarrow r_{1}$ is indeed an isomorphism between +So the function $1\rightarrow r_{1}$ is indeed an isomorphism between the types $\bbnum 1$ and $R^{\bbnum 1}$. It follows from Theorem~\ref{subsec:Statement-rigid-functor-wrapped-unit-is-unit} @@ -4565,7 +4565,7 @@ \subsubsection{Statement \label{subsec:Statement-rigid-functor-multi-flatMap}\re {*}{*}{*}For a rigid functor $R$ and a monad $M$, an ``$R$-valued \lstinline!flatMap!'' can be defined, \[ -\text{rflm}_{M,R}:(A\Rightarrow R^{M^{B}})\Rightarrow M^{A}\Rightarrow R^{M^{B}}\quad. +\text{rflm}_{M,R}:(A\rightarrow R^{M^{B}})\rightarrow M^{A}\rightarrow R^{M^{B}}\quad. \] A ``refactoring'' is a program transformation that does not significantly @@ -4576,10 +4576,10 @@ \subsubsection{Statement \label{subsec:Statement-rigid-functor-monadic-refactor} {*}{*}{*}Given a rigid functor $R$, a refactoring function can be implemented, \[ -\text{refactor}:((A\Rightarrow B)\Rightarrow C)\Rightarrow(A\Rightarrow R^{B})\Rightarrow R^{C}\quad. +\text{refactor}:((A\rightarrow B)\rightarrow C)\rightarrow(A\rightarrow R^{B})\rightarrow R^{C}\quad. \] -This function transforms a program $p(f^{:A\Rightarrow B}):C$ into -a program $\tilde{p}(\tilde{f}^{:A\Rightarrow R^{B}}):R^{C}$. +This function transforms a program $p(f^{:A\rightarrow B}):C$ into +a program $\tilde{p}(\tilde{f}^{:A\rightarrow R^{B}}):R^{C}$. \section{Recursive monad transformers} @@ -4608,7 +4608,7 @@ \subsection{The codensity monad transformer \texttt{CodT}} The \textbf{\index{codensity monad}codensity monad} over a functor $F$ is defined as \[ -\text{Cod}^{F,A}\triangleq\forall B.\left(A\Rightarrow F^{B}\right)\Rightarrow F^{B} +\text{Cod}^{F,A}\triangleq\forall B.\left(A\rightarrow F^{B}\right)\rightarrow F^{B} \] Properties: @@ -4619,18 +4619,18 @@ \subsection{The codensity monad transformer \texttt{CodT}} such that $\text{inC}\,\bef\text{outC}=\text{id}$ \item A monad transformer for the codensity monad is \[ -T_{\text{Cod}}^{M,A}=\forall B.\left(A\Rightarrow M^{F^{B}}\right)\Rightarrow M^{F^{B}} +T_{\text{Cod}}^{M,A}=\forall B.\left(A\rightarrow M^{F^{B}}\right)\rightarrow M^{F^{B}} \] However, this transformer does not have the base lifting morphism \[ -\text{blift}:\left(\forall B.\left(A\Rightarrow F^{B}\right)\Rightarrow F^{B}\right)\Rightarrow\forall C.\left(A\Rightarrow M^{F^{C}}\right)\Rightarrow M^{F^{C}} +\text{blift}:\left(\forall B.\left(A\rightarrow F^{B}\right)\rightarrow F^{B}\right)\rightarrow\forall C.\left(A\rightarrow M^{F^{C}}\right)\rightarrow M^{F^{C}} \] since this type signature cannot be implemented. The codensity transformer also does not have any of the required ``runner'' transformations $\text{mrun}$ and $\text{brun}$, \begin{align*} -\text{mrun} & :\left(M^{\bullet}\leadsto N^{\bullet}\right)\Rightarrow\left(\forall B.\left(A\Rightarrow M^{F^{B}}\right)\Rightarrow M^{F^{B}}\right)\Rightarrow\forall C.\left(A\Rightarrow N^{F^{C}}\right)\Rightarrow N^{F^{C}}\quad,\\ -\text{brun} & :\left(\left(\forall B.\left(A\Rightarrow F^{B}\right)\Rightarrow F^{B}\right)\Rightarrow A\right)\Rightarrow\left(\forall C.\left(A\Rightarrow M^{F^{C}}\right)\Rightarrow M^{F^{C}}\right)\Rightarrow M^{A}\quad. +\text{mrun} & :\left(M^{\bullet}\leadsto N^{\bullet}\right)\rightarrow\left(\forall B.\left(A\rightarrow M^{F^{B}}\right)\rightarrow M^{F^{B}}\right)\rightarrow\forall C.\left(A\rightarrow N^{F^{C}}\right)\rightarrow N^{F^{C}}\quad,\\ +\text{brun} & :\left(\left(\forall B.\left(A\rightarrow F^{B}\right)\rightarrow F^{B}\right)\rightarrow A\right)\rightarrow\left(\forall C.\left(A\rightarrow M^{F^{C}}\right)\rightarrow M^{F^{C}}\right)\rightarrow M^{A}\quad. \end{align*} \end{itemize} @@ -4668,8 +4668,8 @@ \subsubsection{Exercise \label{subsec:Exercise-monad-transformer-extra-layer}\re \subsubsection{Exercise \label{subsec:Exercise-monad-transformer-extra-layer-1}\ref{subsec:Exercise-monad-transformer-extra-layer-1} } -Show that there exist monadic morphisms between the selection $\left(A\Rightarrow R\right)\Rightarrow A$ -and the continuation $\left(A\Rightarrow R\right)\Rightarrow R$ monads. +Show that there exist monadic morphisms between the selection $\left(A\rightarrow R\right)\rightarrow A$ +and the continuation $\left(A\rightarrow R\right)\rightarrow R$ monads. \begin{comment} Chapter eleven of the functional programming tutorial computations diff --git a/sofp-src/sofp-traversable.lyx b/sofp-src/sofp-traversable.lyx index 379fb635b..fa9826107 100644 --- a/sofp-src/sofp-traversable.lyx +++ b/sofp-src/sofp-traversable.lyx @@ -109,9 +109,6 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} @@ -250,7 +247,7 @@ Consider data of type \end_inset and processing -\begin_inset Formula $f:A\Rightarrow\text{Future}^{B}$ +\begin_inset Formula $f:A\rightarrow\text{Future}^{B}$ \end_inset @@ -262,7 +259,7 @@ Typically, we want to wait until the entire data set is processed \begin_layout Standard What we need is -\begin_inset Formula $\text{List}^{A}\Rightarrow\left(A\Rightarrow\text{Future}^{B}\right)\Rightarrow\text{Future}^{\text{List}^{B}}$ +\begin_inset Formula $\text{List}^{A}\rightarrow\left(A\rightarrow\text{Future}^{B}\right)\rightarrow\text{Future}^{\text{List}^{B}}$ \end_inset @@ -270,7 +267,7 @@ What we need is \begin_layout Standard Generalize: -\begin_inset Formula $L^{A}\Rightarrow\left(A\Rightarrow F^{B}\right)\Rightarrow F^{L^{B}}$ +\begin_inset Formula $L^{A}\rightarrow\left(A\rightarrow F^{B}\right)\rightarrow F^{L^{B}}$ \end_inset for some type constructors @@ -334,7 +331,7 @@ zip \size default \color inherit as -\begin_inset Formula $F^{B}\times F^{B}\Rightarrow F^{B\times B}$ +\begin_inset Formula $F^{B}\times F^{B}\rightarrow F^{B\times B}$ \end_inset @@ -493,7 +490,7 @@ traverse \begin_inset Formula \[ -\text{fmap}_{L}:(A\Rightarrow F^{B})\Rightarrow L^{A}\Rightarrow L^{F^{B}} +\text{fmap}_{L}:(A\rightarrow F^{B})\rightarrow L^{A}\rightarrow L^{F^{B}} \] \end_inset @@ -531,7 +528,7 @@ sequence \size default \color inherit -\begin_inset Formula $:L^{F^{B}}\Rightarrow F^{L^{B}}$ +\begin_inset Formula $:L^{F^{B}}\rightarrow F^{L^{B}}$ \end_inset @@ -559,7 +556,7 @@ sequence \begin_inset Formula \[ -\text{trav}\,f^{\underline{A\Rightarrow F^{B}}}=\text{fmap}_{L}\,f\bef\text{seq} +\text{trav}\,f^{\underline{A\rightarrow F^{B}}}=\text{fmap}_{L}\,f\bef\text{seq} \] \end_inset @@ -568,7 +565,7 @@ sequence \begin_inset Formula \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & L^{F^{B}}\ar[rd]\sp(0.45){\text{seq}}\\ -L^{A}\ar[ru]\sp(0.45){\text{fmap}_{L}\,f^{\underline{A\Rightarrow F^{B}}}}\ar[rr]\sb(0.45){\text{trav}\,f^{\underline{A\Rightarrow F^{B}}}} & & F^{L^{B}} +L^{A}\ar[ru]\sp(0.45){\text{fmap}_{L}\,f^{\underline{A\rightarrow F^{B}}}}\ar[rr]\sb(0.45){\text{trav}\,f^{\underline{A\rightarrow F^{B}}}} & & F^{L^{B}} } \] @@ -597,7 +594,7 @@ Future.sequence \size default \color inherit -\begin_inset Formula $:\text{List}^{\text{Future}^{X}}\Rightarrow\text{Future}^{\text{List}^{X}}$ +\begin_inset Formula $:\text{List}^{\text{Future}^{X}}\rightarrow\text{Future}^{\text{List}^{X}}$ \end_inset @@ -617,7 +614,7 @@ Examples: \begin_layout Standard Non-traversable: -\begin_inset Formula $L^{A}\equiv R\Rightarrow A$ +\begin_inset Formula $L^{A}\equiv R\rightarrow A$ \end_inset ; lazy list ( @@ -637,7 +634,7 @@ Note: We cannot have \emph default the opposite transformation -\begin_inset Formula $F^{L^{B}}\Rightarrow L^{F^{B}}$ +\begin_inset Formula $F^{L^{B}}\rightarrow L^{F^{B}}$ \end_inset @@ -692,7 +689,7 @@ L^{A}\equiv Z\times A\times...\times A+Y\times A\times...\times A+...+Q\times A+ To implement \size small -\begin_inset Formula $\text{seq}:L^{F^{B}}\Rightarrow F^{L^{B}}$ +\begin_inset Formula $\text{seq}:L^{F^{B}}\rightarrow F^{L^{B}}$ \end_inset @@ -736,7 +733,7 @@ Lift \end_inset using -\begin_inset Formula $Z\Rightarrow F^{A}\Rightarrow F^{Z\times A}$ +\begin_inset Formula $Z\rightarrow F^{A}\rightarrow F^{Z\times A}$ \end_inset (or with @@ -797,7 +794,7 @@ literal "false" \begin_layout Standard Example: -\begin_inset Formula $L^{A}\equiv E\Rightarrow A$ +\begin_inset Formula $L^{A}\equiv E\rightarrow A$ \end_inset ; @@ -807,7 +804,7 @@ Example: ; can't have \size small -\begin_inset Formula $\text{seq}:L^{F^{B}}\Rightarrow F^{L^{B}}$ +\begin_inset Formula $\text{seq}:L^{F^{B}}\rightarrow F^{L^{B}}$ \end_inset @@ -919,7 +916,7 @@ traverse \begin_inset Formula \[ -\text{trav}:(A\Rightarrow F^{B})\Rightarrow L^{A}\Rightarrow F^{L^{B}} +\text{trav}:(A\rightarrow F^{B})\rightarrow L^{A}\rightarrow F^{L^{B}} \] \end_inset @@ -968,7 +965,7 @@ pure \size default \color inherit -\begin_inset Formula $:A\Rightarrow F^{A}$ +\begin_inset Formula $:A\rightarrow F^{A}$ \end_inset must be lifted to @@ -980,7 +977,7 @@ pure \size default \color inherit -\begin_inset Formula $:L^{A}\Rightarrow F^{L^{A}}$ +\begin_inset Formula $:L^{A}\rightarrow F^{L^{A}}$ \end_inset @@ -995,7 +992,7 @@ Identity \end_inset as -\begin_inset Formula $\text{id}^{\underline{A\Rightarrow A}}$ +\begin_inset Formula $\text{id}^{\underline{A\rightarrow A}}$ \end_inset with @@ -1003,7 +1000,7 @@ Identity \end_inset (identity functor) lifted to -\begin_inset Formula $\text{id}^{\underline{L^{A}\Rightarrow L^{A}}}$ +\begin_inset Formula $\text{id}^{\underline{L^{A}\rightarrow L^{A}}}$ \end_inset @@ -1018,15 +1015,15 @@ Compose \end_inset -\begin_inset Formula $f:A\Rightarrow F^{B}$ +\begin_inset Formula $f:A\rightarrow F^{B}$ \end_inset and -\begin_inset Formula $g:B\Rightarrow G^{C}$ +\begin_inset Formula $g:B\rightarrow G^{C}$ \end_inset to get -\begin_inset Formula $h:A\Rightarrow F^{G^{C}}$ +\begin_inset Formula $h:A\rightarrow F^{G^{C}}$ \end_inset , where @@ -1143,7 +1140,7 @@ Identity law: For any applicative functor \begin_inset Formula \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc}\ L^{A}\ar[rr]\sp(0.45){\text{pure}^{\underline{L^{A}\Rightarrow F^{L^{A}}}}}\ar[rr]\sb(0.45){\text{trav}\,(\text{pure}^{\underline{A\Rightarrow F^{A}}})} & & F^{L^{A}}} +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc}\ L^{A}\ar[rr]\sp(0.45){\text{pure}^{\underline{L^{A}\rightarrow F^{L^{A}}}}}\ar[rr]\sb(0.45){\text{trav}\,(\text{pure}^{\underline{A\rightarrow F^{A}}})} & & F^{L^{A}}} \] \end_inset @@ -1169,11 +1166,11 @@ So, we need only one identity law \begin_layout Standard Composition law: For any -\begin_inset Formula $f^{\underline{A\Rightarrow F^{B}}}$ +\begin_inset Formula $f^{\underline{A\rightarrow F^{B}}}$ \end_inset and -\begin_inset Formula $g^{\underline{B\Rightarrow G^{C}}}$ +\begin_inset Formula $g^{\underline{B\rightarrow G^{C}}}$ \end_inset , & applicative @@ -1195,15 +1192,15 @@ Composition law: For any \begin_inset Formula \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{L^{B}}\ar[rd]\sp(0.55){\ \ \ \ \text{fmap}_{F}\big(\text{trav}^{G}\,g\big)^{\underline{L^{B}\Rightarrow G^{L^{C}}}}}\\ -L^{A}\ar[ru]\sp(0.45){\text{trav}^{F}\,f^{\underline{A\Rightarrow F^{B}}}}\ar[rr]\sb(0.45){\text{trav}^{F^{G}}\,h^{\underline{A\Rightarrow F^{G^{C}}}}} & & F^{G^{L^{C}}} +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{L^{B}}\ar[rd]\sp(0.55){\ \ \ \ \text{fmap}_{F}\big(\text{trav}^{G}\,g\big)^{\underline{L^{B}\rightarrow G^{L^{C}}}}}\\ +L^{A}\ar[ru]\sp(0.45){\text{trav}^{F}\,f^{\underline{A\rightarrow F^{B}}}}\ar[rr]\sb(0.45){\text{trav}^{F^{G}}\,h^{\underline{A\rightarrow F^{G^{C}}}}} & & F^{G^{L^{C}}} } \] \end_inset where -\begin_inset Formula $h^{\underline{A\Rightarrow F^{G^{C}}}}\equiv f\bef g^{F\uparrow}$ +\begin_inset Formula $h^{\underline{A\rightarrow F^{G^{C}}}}\equiv f\bef g^{F\uparrow}$ \end_inset . @@ -1285,11 +1282,11 @@ Naturality law: \end_inset with -\begin_inset Formula $g^{\underline{A\Rightarrow B}}$ +\begin_inset Formula $g^{\underline{A\rightarrow B}}$ \end_inset , mapping -\begin_inset Formula $L^{F^{A}}\Rightarrow F^{L^{B}}$ +\begin_inset Formula $L^{F^{A}}\rightarrow F^{L^{B}}$ \end_inset @@ -1436,7 +1433,7 @@ bisequence exists such that \begin_inset Formula \[ -\text{biseq}:S^{F^{A},F^{B}}\Rightarrow F^{S^{A,B}} +\text{biseq}:S^{F^{A},F^{B}}\rightarrow F^{S^{A,B}} \] \end_inset @@ -1566,7 +1563,7 @@ traverse \size default \color inherit becomes -\begin_inset Formula $\left(A\Rightarrow Z\right)\Rightarrow L^{A}\Rightarrow Z$ +\begin_inset Formula $\left(A\rightarrow Z\right)\rightarrow L^{A}\rightarrow Z$ \end_inset @@ -1594,7 +1591,7 @@ seq \size default \color inherit becomes -\begin_inset Formula $L^{Z}\Rightarrow Z$ +\begin_inset Formula $L^{Z}\rightarrow Z$ \end_inset @@ -1662,13 +1659,13 @@ foldMap \size default \color inherit with -\begin_inset Formula $Z\equiv(B\Rightarrow B)$ +\begin_inset Formula $Z\equiv(B\rightarrow B)$ \end_inset : \begin_inset Formula \[ -\text{foldl}:\left(A\Rightarrow B\Rightarrow B\right)\Rightarrow L^{A}\Rightarrow B\Rightarrow B +\text{foldl}:\left(A\rightarrow B\rightarrow B\right)\rightarrow L^{A}\rightarrow B\rightarrow B \] \end_inset @@ -1729,7 +1726,7 @@ applicative profunctors \begin_inset Formula \[ -\text{seq}:C^{F^{A}}\Rightarrow F^{C^{A}}\equiv\text{pure}^{C\downarrow}\bef\text{pure} +\text{seq}:C^{F^{A}}\rightarrow F^{C^{A}}\equiv\text{pure}^{C\downarrow}\bef\text{pure} \] \end_inset @@ -1751,15 +1748,15 @@ But not profunctors that are neither functors not contrafunctors \begin_layout Standard Counterexample: -\begin_inset Formula $P^{A}\equiv A\Rightarrow A$ +\begin_inset Formula $P^{A}\equiv A\rightarrow A$ \end_inset ; need -\begin_inset Formula $\text{seq}:\left(F^{A}\Rightarrow F^{A}\right)\Rightarrow F^{A\Rightarrow A}$ +\begin_inset Formula $\text{seq}:\left(F^{A}\rightarrow F^{A}\right)\rightarrow F^{A\rightarrow A}$ \end_inset ; we can't get an -\begin_inset Formula $A\Rightarrow A$ +\begin_inset Formula $A\rightarrow A$ \end_inset , so the only implementation is to return @@ -1783,11 +1780,11 @@ Traversing profunctors \begin_layout Standard Counterexample 1: contrafunctor -\begin_inset Formula $L^{A}\equiv A\Rightarrow R$ +\begin_inset Formula $L^{A}\equiv A\rightarrow R$ \end_inset and contrafunctor -\begin_inset Formula $F^{A}\equiv A\Rightarrow S$ +\begin_inset Formula $F^{A}\equiv A\rightarrow S$ \end_inset , a @@ -1799,7 +1796,7 @@ seq \size default \color inherit of type -\begin_inset Formula $L^{F^{A}}\Rightarrow F^{L^{A}}$ +\begin_inset Formula $L^{F^{A}}\rightarrow F^{L^{A}}$ \end_inset must return @@ -1811,7 +1808,7 @@ seq \begin_layout Standard Counterexample 2: contrafunctor -\begin_inset Formula $F^{A}\equiv\left(R\Rightarrow A\right)\Rightarrow S$ +\begin_inset Formula $F^{A}\equiv\left(R\rightarrow A\right)\rightarrow S$ \end_inset and functor @@ -2034,7 +2031,7 @@ generic in the functor \begin_inset Formula \[ -\text{trav}^{F,A,B}:(A\Rightarrow F^{B})\Rightarrow L^{A}\Rightarrow F^{L^{B}} +\text{trav}^{F,A,B}:(A\rightarrow F^{B})\rightarrow L^{A}\rightarrow F^{L^{B}} \] \end_inset @@ -2096,7 +2093,7 @@ generic in : have \size footnotesize -\begin_inset Formula $\text{fmap}:\left(A\Rightarrow B\right)\Rightarrow F^{A}\Rightarrow F^{B}$ +\begin_inset Formula $\text{fmap}:\left(A\rightarrow B\right)\rightarrow F^{A}\rightarrow F^{B}$ \end_inset @@ -2117,7 +2114,7 @@ Generic in means mapping \size footnotesize -\begin_inset Formula $\left(F\Rightarrow G\right)\Rightarrow\text{trav}^{F}\Rightarrow\text{trav}^{G}$ +\begin_inset Formula $\left(F\rightarrow G\right)\rightarrow\text{trav}^{F}\rightarrow\text{trav}^{G}$ \end_inset @@ -2131,7 +2128,7 @@ Mathematical formulation: \begin_layout Standard For any natural transformation -\begin_inset Formula $F^{A}\Rightarrow G^{A}$ +\begin_inset Formula $F^{A}\rightarrow G^{A}$ \end_inset between applicative functors @@ -2177,7 +2174,7 @@ Such a natural transformation is a morphism of applicative functors Category theory can describe \size footnotesize -\begin_inset Formula $\left(F\Rightarrow G\right)\Rightarrow\text{trav}^{F}\Rightarrow\text{trav}^{G}$ +\begin_inset Formula $\left(F\rightarrow G\right)\rightarrow\text{trav}^{F}\rightarrow\text{trav}^{G}$ \end_inset @@ -2231,7 +2228,7 @@ Show that any traversable functor admits a method \begin_inset Formula \[ -\text{consume}:(L^{A}\Rightarrow B)\Rightarrow L^{F^{A}}\Rightarrow F^{B} +\text{consume}:(L^{A}\rightarrow B)\rightarrow L^{F^{A}}\rightarrow F^{B} \] \end_inset @@ -2260,7 +2257,7 @@ consume \size footnotesize Show that -\begin_inset Formula $\text{seq}:L^{F^{A}}\Rightarrow F^{L^{A}}=\text{id}$ +\begin_inset Formula $\text{seq}:L^{F^{A}}\rightarrow F^{L^{A}}=\text{id}$ \end_inset if we choose @@ -2275,7 +2272,7 @@ Show that \size footnotesize Show that the identity law is not satisfied by an implementation of -\begin_inset Formula $\text{seq}:L^{F^{A}}\Rightarrow F^{L^{A}}$ +\begin_inset Formula $\text{seq}:L^{F^{A}}\rightarrow F^{L^{A}}$ \end_inset for diff --git a/sofp-src/sofp-traversable.tex b/sofp-src/sofp-traversable.tex index 6ff2475ae..35f2685fc 100644 --- a/sofp-src/sofp-traversable.tex +++ b/sofp-src/sofp-traversable.tex @@ -6,13 +6,13 @@ \section{Slides} \subsection{Motivation for the \texttt{\textcolor{blue}{\footnotesize{}traverse}} operation} -Consider data of type $\text{List}^{A}$ and processing $f:A\Rightarrow\text{Future}^{B}$ +Consider data of type $\text{List}^{A}$ and processing $f:A\rightarrow\text{Future}^{B}$ Typically, we want to wait until the entire data set is processed -What we need is $\text{List}^{A}\Rightarrow\left(A\Rightarrow\text{Future}^{B}\right)\Rightarrow\text{Future}^{\text{List}^{B}}$ +What we need is $\text{List}^{A}\rightarrow\left(A\rightarrow\text{Future}^{B}\right)\rightarrow\text{Future}^{\text{List}^{B}}$ -Generalize: $L^{A}\Rightarrow\left(A\Rightarrow F^{B}\right)\Rightarrow F^{L^{B}}$ +Generalize: $L^{A}\rightarrow\left(A\rightarrow F^{B}\right)\rightarrow F^{L^{B}}$ for some type constructors $F$, $L$ This operation is called \texttt{\textcolor{blue}{\footnotesize{}traverse}} @@ -23,7 +23,7 @@ \subsection{Motivation for the \texttt{\textcolor{blue}{\footnotesize{}traverse} and get $F^{B}\times F^{B}\times F^{B}$ We will get $F^{L^{B}}\equiv F^{B\times B\times B}$ if we can apply -\texttt{\textcolor{blue}{\footnotesize{}zip}} as $F^{B}\times F^{B}\Rightarrow F^{B\times B}$ +\texttt{\textcolor{blue}{\footnotesize{}zip}} as $F^{B}\times F^{B}\rightarrow F^{B\times B}$ So we need to assume that $F$ is applicative @@ -54,7 +54,7 @@ \subsection{Deriving the \texttt{\textcolor{blue}{\footnotesize{}sequence}} oper To derive it, ask: what is missing from \texttt{\textcolor{blue}{\footnotesize{}fmap}} to do the job of \texttt{\textcolor{blue}{\footnotesize{}traverse}}?{\footnotesize{} \[ -\text{fmap}_{L}:(A\Rightarrow F^{B})\Rightarrow L^{A}\Rightarrow L^{F^{B}} +\text{fmap}_{L}:(A\rightarrow F^{B})\rightarrow L^{A}\rightarrow L^{F^{B}} \] }{\footnotesize\par} @@ -62,31 +62,31 @@ \subsection{Deriving the \texttt{\textcolor{blue}{\footnotesize{}sequence}} oper operation gives us $L^{F^{B}}$ instead What's missing is a natural transformation \texttt{\textcolor{blue}{\footnotesize{}sequence}} -$:L^{F^{B}}\Rightarrow F^{L^{B}}$ +$:L^{F^{B}}\rightarrow F^{L^{B}}$ The functions \texttt{\textcolor{blue}{\footnotesize{}traverse}} and \texttt{\textcolor{blue}{\footnotesize{}sequence}} are computationally equivalent:{\footnotesize{} \[ -\text{trav}\,f^{\underline{A\Rightarrow F^{B}}}=\text{fmap}_{L}\,f\bef\text{seq} +\text{trav}\,f^{\underline{A\rightarrow F^{B}}}=\text{fmap}_{L}\,f\bef\text{seq} \] \[ \xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & L^{F^{B}}\ar[rd]\sp(0.45){\text{seq}}\\ -L^{A}\ar[ru]\sp(0.45){\text{fmap}_{L}\,f^{\underline{A\Rightarrow F^{B}}}}\ar[rr]\sb(0.45){\text{trav}\,f^{\underline{A\Rightarrow F^{B}}}} & & F^{L^{B}} +L^{A}\ar[ru]\sp(0.45){\text{fmap}_{L}\,f^{\underline{A\rightarrow F^{B}}}}\ar[rr]\sb(0.45){\text{trav}\,f^{\underline{A\rightarrow F^{B}}}} & & F^{L^{B}} } \] }Here $F$ is an \emph{arbitrary} applicative functor Keep in mind the example \texttt{\textcolor{blue}{\footnotesize{}Future.sequence}} -$:\text{List}^{\text{Future}^{X}}\Rightarrow\text{Future}^{\text{List}^{X}}$ +$:\text{List}^{\text{Future}^{X}}\rightarrow\text{Future}^{\text{List}^{X}}$ Examples: $L^{A}\equiv A\times A\times A$; $L^{A}=\text{List}^{A}$; finite trees -Non-traversable: $L^{A}\equiv R\Rightarrow A$; lazy list (``infinite +Non-traversable: $L^{A}\equiv R\rightarrow A$; lazy list (``infinite product'') -Note: We \emph{cannot have} the opposite transformation $F^{L^{B}}\Rightarrow L^{F^{B}}$ +Note: We \emph{cannot have} the opposite transformation $F^{L^{B}}\rightarrow L^{F^{B}}$ \subsection{Polynomial functors are traversable} @@ -100,13 +100,13 @@ \subsection{Polynomial functors are traversable} \] }{\small\par} -To implement {\small{}$\text{seq}:L^{F^{B}}\Rightarrow F^{L^{B}}$}, +To implement {\small{}$\text{seq}:L^{F^{B}}\rightarrow F^{L^{B}}$}, consider monomial {\small{}$L^{A}\equiv Z\times A\times...\times A$}{\small\par} We have $L^{F^{B}}=Z\times F^{B}\times...\times F^{B}$; apply \texttt{\textcolor{blue}{\footnotesize{}zip}} and get $Z\times F^{B\times...\times B}$ -Lift $Z$ into the functor $F$ using $Z\Rightarrow F^{A}\Rightarrow F^{Z\times A}$ +Lift $Z$ into the functor $F$ using $Z\rightarrow F^{A}\rightarrow F^{Z\times A}$ (or with $F.\text{pure}$) The result is $F^{Z\times B\times...\times B}\equiv F^{L^{B}}$ @@ -121,8 +121,8 @@ \subsection{Polynomial functors are traversable} Non-polynomial functors are not traversable (see \href{http://www.cs.ox.ac.uk/jeremy.gibbons/publications/uitbaf.pdf}{Bird et al., 2013}) -Example: $L^{A}\equiv E\Rightarrow A$; $F^{A}\equiv1+A$; can't have -{\small{}$\text{seq}:L^{F^{B}}\Rightarrow F^{L^{B}}$}{\small\par} +Example: $L^{A}\equiv E\rightarrow A$; $F^{A}\equiv1+A$; can't have +{\small{}$\text{seq}:L^{F^{B}}\rightarrow F^{L^{B}}$}{\small\par} All polynomial functors are traversable, and usually in several ways @@ -140,20 +140,20 @@ \subsection{Motivation for the laws of the \texttt{\textcolor{blue}{\footnotesiz To derive the laws, use the ``lifting'' intuition for \texttt{\textcolor{blue}{\footnotesize{}traverse}},{\footnotesize{} \[ -\text{trav}:(A\Rightarrow F^{B})\Rightarrow L^{A}\Rightarrow F^{L^{B}} +\text{trav}:(A\rightarrow F^{B})\rightarrow L^{A}\rightarrow F^{L^{B}} \] }{\footnotesize\par} {\footnotesize{}L}ook for ``identity'' and ``composition'' laws: -``Identity'' as \texttt{\textcolor{blue}{\footnotesize{}pure}} $:A\Rightarrow F^{A}$ -must be lifted to \texttt{\textcolor{blue}{\footnotesize{}pure}} $:L^{A}\Rightarrow F^{L^{A}}$ +``Identity'' as \texttt{\textcolor{blue}{\footnotesize{}pure}} $:A\rightarrow F^{A}$ +must be lifted to \texttt{\textcolor{blue}{\footnotesize{}pure}} $:L^{A}\rightarrow F^{L^{A}}$ -``Identity'' as $\text{id}^{\underline{A\Rightarrow A}}$ with $F^{A}\equiv A$ -(identity functor) lifted to $\text{id}^{\underline{L^{A}\Rightarrow L^{A}}}$ +``Identity'' as $\text{id}^{\underline{A\rightarrow A}}$ with $F^{A}\equiv A$ +(identity functor) lifted to $\text{id}^{\underline{L^{A}\rightarrow L^{A}}}$ -``Compose'' $f:A\Rightarrow F^{B}$ and $g:B\Rightarrow G^{C}$ -to get $h:A\Rightarrow F^{G^{C}}$, where $F$, $G$ are applicative; +``Compose'' $f:A\rightarrow F^{B}$ and $g:B\rightarrow G^{C}$ +to get $h:A\rightarrow F^{G^{C}}$, where $F$, $G$ are applicative; a traversal with $h$ maps $L^{A}$ to $F^{G^{L^{C}}}$ and must be equal to the composition of traversals with $f$ and then with $g^{F\uparrow}$ @@ -175,7 +175,7 @@ \subsection{Formulation of the laws for \texttt{\textcolor{blue}{\footnotesize{} \text{trav}\left(\text{pure}\right)=\text{pure} \] \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc}\ L^{A}\ar[rr]\sp(0.45){\text{pure}^{\underline{L^{A}\Rightarrow F^{L^{A}}}}}\ar[rr]\sb(0.45){\text{trav}\,(\text{pure}^{\underline{A\Rightarrow F^{A}}})} & & F^{L^{A}}} +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc}\ L^{A}\ar[rr]\sp(0.45){\text{pure}^{\underline{L^{A}\rightarrow F^{L^{A}}}}}\ar[rr]\sb(0.45){\text{trav}\,(\text{pure}^{\underline{A\rightarrow F^{A}}})} & & F^{L^{A}}} \] Second identity law: $\text{trav}^{\text{Id}}(\text{id}^{A})=\text{id}^{L^{A}}$ @@ -183,17 +183,17 @@ \subsection{Formulation of the laws for \texttt{\textcolor{blue}{\footnotesize{} So, we need only one identity law -Composition law: For any $f^{\underline{A\Rightarrow F^{B}}}$ and -$g^{\underline{B\Rightarrow G^{C}}}$, \& applicative $F$ and $G$, +Composition law: For any $f^{\underline{A\rightarrow F^{B}}}$ and +$g^{\underline{B\rightarrow G^{C}}}$, \& applicative $F$ and $G$, \[ \text{trav}\,f\bef\left(\text{trav}\,g\right)^{F\uparrow}=\text{trav}\,\big(f\bef g^{F\uparrow}\big) \] \[ -\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{L^{B}}\ar[rd]\sp(0.55){\ \ \ \ \text{fmap}_{F}\big(\text{trav}^{G}\,g\big)^{\underline{L^{B}\Rightarrow G^{L^{C}}}}}\\ -L^{A}\ar[ru]\sp(0.45){\text{trav}^{F}\,f^{\underline{A\Rightarrow F^{B}}}}\ar[rr]\sb(0.45){\text{trav}^{F^{G}}\,h^{\underline{A\Rightarrow F^{G^{C}}}}} & & F^{G^{L^{C}}} +\xymatrix{\xyScaleY{0.2pc}\xyScaleX{3pc} & F^{L^{B}}\ar[rd]\sp(0.55){\ \ \ \ \text{fmap}_{F}\big(\text{trav}^{G}\,g\big)^{\underline{L^{B}\rightarrow G^{L^{C}}}}}\\ +L^{A}\ar[ru]\sp(0.45){\text{trav}^{F}\,f^{\underline{A\rightarrow F^{B}}}}\ar[rr]\sb(0.45){\text{trav}^{F^{G}}\,h^{\underline{A\rightarrow F^{G^{C}}}}} & & F^{G^{L^{C}}} } \] -where $h^{\underline{A\Rightarrow F^{G^{C}}}}\equiv f\bef g^{F\uparrow}$. +where $h^{\underline{A\rightarrow F^{G^{C}}}}\equiv f\bef g^{F\uparrow}$. (Note: $H^{A}\equiv F^{G^{A}}$ is applicative!) @@ -211,7 +211,7 @@ \subsection{Derivation of the laws for \texttt{\textcolor{blue}{\footnotesize{}s }{\footnotesize\par} Naturality law: $\text{seq}\bef g^{F\uparrow L\uparrow}=g^{L\uparrow F\uparrow}\bef\text{seq}$ -with $g^{\underline{A\Rightarrow B}}$, mapping $L^{F^{A}}\Rightarrow F^{L^{B}}$ +with $g^{\underline{A\rightarrow B}}$, mapping $L^{F^{A}}\rightarrow F^{L^{B}}$ Composition law: {\footnotesize{} \begin{align*} @@ -249,7 +249,7 @@ \subsection{Constructions of traversable and bitraversable functors} A bifunctor $S^{A,B}$ is \textbf{bitraversable} if \texttt{\textcolor{blue}{\footnotesize{}bisequence}} exists such that \[ -\text{biseq}:S^{F^{A},F^{B}}\Rightarrow F^{S^{A,B}} +\text{biseq}:S^{F^{A},F^{B}}\rightarrow F^{S^{A,B}} \] for any applicative functor $F$; the analogous laws must hold @@ -275,12 +275,12 @@ \subsection{Foldable functors: traversing with respect to a monoid} monoid operation $\oplus$ The type signature of \texttt{\textcolor{blue}{\footnotesize{}traverse}} -becomes $\left(A\Rightarrow Z\right)\Rightarrow L^{A}\Rightarrow Z$ +becomes $\left(A\rightarrow Z\right)\rightarrow L^{A}\rightarrow Z$ This method is called \texttt{\textcolor{blue}{\footnotesize{}foldMap}} The type signature of \texttt{\textcolor{blue}{\footnotesize{}seq}} -becomes $L^{Z}\Rightarrow Z$ +becomes $L^{Z}\rightarrow Z$ This is called \texttt{\textcolor{blue}{\footnotesize{}mconcat}} \textendash{} combines all values in $L^{Z}$ with $Z$'s $\oplus$ @@ -294,9 +294,9 @@ \subsection{Foldable functors: traversing with respect to a monoid} The \texttt{\textcolor{blue}{\footnotesize{}foldLeft}} method can be defined via \texttt{\textcolor{blue}{\footnotesize{}foldMap}} with -$Z\equiv(B\Rightarrow B)$: +$Z\equiv(B\rightarrow B)$: \[ -\text{foldl}:\left(A\Rightarrow B\Rightarrow B\right)\Rightarrow L^{A}\Rightarrow B\Rightarrow B +\text{foldl}:\left(A\rightarrow B\rightarrow B\right)\rightarrow L^{A}\rightarrow B\rightarrow B \] @@ -308,7 +308,7 @@ \subsection{Traversable contrafunctors and profunctors are not useful} All contrafunctors $C^{A}$ are traversable w.r.t.~applicative profunctors $F^{A}$,{\footnotesize{} \[ -\text{seq}:C^{F^{A}}\Rightarrow F^{C^{A}}\equiv\text{pure}^{C\downarrow}\bef\text{pure} +\text{seq}:C^{F^{A}}\rightarrow F^{C^{A}}\equiv\text{pure}^{C\downarrow}\bef\text{pure} \] \[ \xymatrix{C^{F^{A}}\ar[r]\sp(0.5){\text{cmap}_{C}\text{pure}_{F}^{A}}\xyScaleY{0.2pc}\xyScaleX{3pc} & C^{A}\ar[r]\sp(0.5){\text{pure}_{F}^{C^{A}}} & F^{C^{A}}} @@ -317,19 +317,19 @@ \subsection{Traversable contrafunctors and profunctors are not useful} But not profunctors that are neither functors not contrafunctors -Counterexample: $P^{A}\equiv A\Rightarrow A$; need $\text{seq}:\left(F^{A}\Rightarrow F^{A}\right)\Rightarrow F^{A\Rightarrow A}$; -we can't get an $A\Rightarrow A$, so the only implementation is to +Counterexample: $P^{A}\equiv A\rightarrow A$; need $\text{seq}:\left(F^{A}\rightarrow F^{A}\right)\rightarrow F^{A\rightarrow A}$; +we can't get an $A\rightarrow A$, so the only implementation is to return $\text{pure}_{F}\left(\text{id}\right)$, which ignores its argument and so will fail the identity law Traversing profunctors $L$ with respect to profunctors $F$: effects are ignored -Counterexample 1: contrafunctor $L^{A}\equiv A\Rightarrow R$ and -contrafunctor $F^{A}\equiv A\Rightarrow S$, a \texttt{\textcolor{blue}{\footnotesize{}seq}} -of type $L^{F^{A}}\Rightarrow F^{L^{A}}$ must return $1+0$ +Counterexample 1: contrafunctor $L^{A}\equiv A\rightarrow R$ and +contrafunctor $F^{A}\equiv A\rightarrow S$, a \texttt{\textcolor{blue}{\footnotesize{}seq}} +of type $L^{F^{A}}\rightarrow F^{L^{A}}$ must return $1+0$ -Counterexample 2: contrafunctor $F^{A}\equiv\left(R\Rightarrow A\right)\Rightarrow S$ +Counterexample 2: contrafunctor $F^{A}\equiv\left(R\rightarrow A\right)\rightarrow S$ and functor $L^{A}\equiv1+A$; \texttt{\textcolor{blue}{\footnotesize{}seq}} must return $1+0$ @@ -367,28 +367,28 @@ \subsection{Naturality with respect to applicative functor as parameter} \vspace{-0.15cm}The{\footnotesize{} }\texttt{\textcolor{blue}{\footnotesize{}traverse}} method must be ``generic in the functor $F$'':{\footnotesize{} \[ -\text{trav}^{F,A,B}:(A\Rightarrow F^{B})\Rightarrow L^{A}\Rightarrow F^{L^{B}} +\text{trav}^{F,A,B}:(A\rightarrow F^{B})\rightarrow L^{A}\rightarrow F^{L^{B}} \] }Which means: The code of \texttt{\textcolor{blue}{\footnotesize{}traverse}} can only use \texttt{\textcolor{blue}{\footnotesize{}pure}} and \texttt{\textcolor{blue}{\footnotesize{}zip}} from $F$ A functor {\footnotesize{}$F^{A}$ }is ``generic in $A$'': have -{\footnotesize{}$\text{fmap}:\left(A\Rightarrow B\right)\Rightarrow F^{A}\Rightarrow F^{B}$}{\footnotesize\par} +{\footnotesize{}$\text{fmap}:\left(A\rightarrow B\right)\rightarrow F^{A}\rightarrow F^{B}$}{\footnotesize\par} -``Generic in $F$'' means mapping {\footnotesize{}$\left(F\Rightarrow G\right)\Rightarrow\text{trav}^{F}\Rightarrow\text{trav}^{G}$} +``Generic in $F$'' means mapping {\footnotesize{}$\left(F\rightarrow G\right)\rightarrow\text{trav}^{F}\rightarrow\text{trav}^{G}$} in some way Mathematical formulation: -For any natural transformation $F^{A}\Rightarrow G^{A}$ between applicative +For any natural transformation $F^{A}\rightarrow G^{A}$ between applicative functors $F$ and $G$ such that $F.\text{pure}$ and $F.\text{zip}$ are mapped into $G.\text{pure}$ and $G.\text{zip}$, the result of transforming $\text{trav}^{F}$ is $\text{trav}^{G}$ Such a natural transformation is a morphism of applicative functors -Category theory can describe {\footnotesize{}$\left(F\Rightarrow G\right)\Rightarrow\text{trav}^{F}\Rightarrow\text{trav}^{G}$} +Category theory can describe {\footnotesize{}$\left(F\rightarrow G\right)\rightarrow\text{trav}^{F}\rightarrow\text{trav}^{G}$} as a ``lifting'' Use a more general definition of category than what we had so far @@ -400,17 +400,17 @@ \subsection{Exercises} {\footnotesize{}\vspace{-0.15cm}Show that any traversable functor $L$ admits a method \[ -\text{consume}:(L^{A}\Rightarrow B)\Rightarrow L^{F^{A}}\Rightarrow F^{B} +\text{consume}:(L^{A}\rightarrow B)\rightarrow L^{F^{A}}\rightarrow F^{B} \] for any applicative functor $F$. Show that }\texttt{\textcolor{blue}{\footnotesize{}traverse}}{\footnotesize{} and }\texttt{\textcolor{blue}{\footnotesize{}consume}}{\footnotesize{} are equivalent.}{\footnotesize\par} -{\footnotesize{}Show that $\text{seq}:L^{F^{A}}\Rightarrow F^{L^{A}}=\text{id}$ +{\footnotesize{}Show that $\text{seq}:L^{F^{A}}\rightarrow F^{L^{A}}=\text{id}$ if we choose $F^{A}\equiv A$ as the identity functor. }{\footnotesize\par} {\footnotesize{}Show that the identity law is not satisfied by an -implementation of $\text{seq}:L^{F^{A}}\Rightarrow F^{L^{A}}$ for +implementation of $\text{seq}:L^{F^{A}}\rightarrow F^{L^{A}}$ for $F^{A}\equiv1+A$ when $\text{seq}$ always returns an empty option.}{\footnotesize\par} {\footnotesize{}Show that $K^{A}\equiv G^{H^{A}}$ is traversable diff --git a/sofp-src/sofp-typeclasses.lyx b/sofp-src/sofp-typeclasses.lyx index 8bbe160a0..bc9bb2552 100644 --- a/sofp-src/sofp-typeclasses.lyx +++ b/sofp-src/sofp-typeclasses.lyx @@ -109,15 +109,13 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} \def\mathunderline#1#2{\color{#1}\underline{{\color{black}#2}}\color{black}} % The LyX document will define a macro \gunderline{#1} that will use \mathunderline with the color `greenunder`. %\def\gunderline#1{\mathunderline{greenunder}{#1}} % This is now defined by LyX itself with GUI support. + \end_preamble \options open=any,numbers=noenddot,index=totoc,bibliography=totoc,listof=totoc,fontsize=10pt \use_default_options true @@ -455,7 +453,7 @@ BigDecimal \begin_layout Standard Another example of a similar situation is a function with type signature -\begin_inset Formula $A\times F^{B}\Rightarrow F^{A\times B}$ +\begin_inset Formula $A\times F^{B}\rightarrow F^{A\times B}$ \end_inset , @@ -6659,7 +6657,7 @@ HasDefault \end_inset instance with a type parameter is for functions of type -\begin_inset Formula $A\Rightarrow A$ +\begin_inset Formula $A\rightarrow A$ \end_inset : @@ -6936,7 +6934,7 @@ For every supported type \end_inset , the required data is a function of type -\begin_inset Formula $T\times T\Rightarrow T$ +\begin_inset Formula $T\times T\rightarrow T$ \end_inset . @@ -7548,7 +7546,7 @@ natural any \emph default function of type -\begin_inset Formula $T\times T\Rightarrow T$ +\begin_inset Formula $T\times T\rightarrow T$ \end_inset may be used as the semigroup operation. @@ -7627,7 +7625,7 @@ any (d) \series default For -\begin_inset Formula $T\triangleq S\Rightarrow S$ +\begin_inset Formula $T\triangleq S\rightarrow S$ \end_inset (the type @@ -8313,7 +8311,7 @@ Monoid[T] \end_inset , we need to provide a function of type -\begin_inset Formula $T\times T\Rightarrow T$ +\begin_inset Formula $T\times T\rightarrow T$ \end_inset and a value of type @@ -8483,7 +8481,7 @@ Monoid instances in the type notation, we get \begin_inset Formula \[ -\text{Semigroup}^{T}\triangleq T\times T\Rightarrow T\quad,\quad\quad\text{HasDefault}^{T}\triangleq T\quad,\quad\quad\text{Monoid}^{T}\triangleq\left(T\times T\Rightarrow T\right)\times T\quad. +\text{Semigroup}^{T}\triangleq T\times T\rightarrow T\quad,\quad\quad\text{HasDefault}^{T}\triangleq T\quad,\quad\quad\text{Monoid}^{T}\triangleq\left(T\times T\rightarrow T\right)\times T\quad. \] \end_inset @@ -8729,11 +8727,11 @@ monoidOf \end_inset needs to produce a value of type -\begin_inset Formula $\left(T\times T\Rightarrow T\right)\times T$ +\begin_inset Formula $\left(T\times T\rightarrow T\right)\times T$ \end_inset given values of type -\begin_inset Formula $T\times T\Rightarrow T$ +\begin_inset Formula $T\times T\rightarrow T$ \end_inset and a value of type @@ -8743,7 +8741,7 @@ monoidOf : \begin_inset Formula \[ -\text{monoidOf}:\left(T\times T\Rightarrow T\right)\times T\Rightarrow\left(T\times T\Rightarrow T\right)\times T\quad. +\text{monoidOf}:\left(T\times T\rightarrow T\right)\times T\rightarrow\left(T\times T\rightarrow T\right)\times T\quad. \] \end_inset @@ -8988,7 +8986,7 @@ In the type notation, this type signature is written as \begin_inset Formula \[ -\text{map}:\forall(A,B).\,F^{A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow F^{B}\quad. +\text{map}:\forall(A,B).\,F^{A}\rightarrow\left(A\rightarrow B\right)\rightarrow F^{B}\quad. \] \end_inset @@ -9202,7 +9200,7 @@ Functor[F] \end_inset is a wrapper for a value of type -\begin_inset Formula $\forall(A,B).\,F^{A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow F^{B}$ +\begin_inset Formula $\forall(A,B).\,F^{A}\rightarrow\left(A\rightarrow B\right)\rightarrow F^{B}$ \end_inset . @@ -9707,7 +9705,7 @@ final case class HasMetadata[T](getName: T => String, getCount: T => Long) In the type notation, this type constructor is written as \begin_inset Formula \[ -\text{HasMetadata}^{T}\triangleq(T\Rightarrow\text{String})\times(T\Rightarrow\text{Long})\quad. +\text{HasMetadata}^{T}\triangleq(T\rightarrow\text{String})\times(T\rightarrow\text{Long})\quad. \] \end_inset @@ -9727,7 +9725,7 @@ noprefix "false" \end_inset ), we find that this type is equivalent to -\begin_inset Formula $T\Rightarrow\text{String}\times\text{Long}$ +\begin_inset Formula $T\rightarrow\text{String}\times\text{Long}$ \end_inset . @@ -9741,7 +9739,7 @@ noprefix "false" and consider a more general typeclass whose instances are values of type -\begin_inset Formula $T\Rightarrow Z$ +\begin_inset Formula $T\rightarrow Z$ \end_inset . @@ -9783,7 +9781,7 @@ extractor typeclass , we denote the typeclass by \begin_inset Formula \[ -\text{Extractor}^{T}\triangleq T\Rightarrow Z\quad. +\text{Extractor}^{T}\triangleq T\rightarrow Z\quad. \] \end_inset @@ -9855,7 +9853,7 @@ Unit . To compute -\begin_inset Formula $\text{Extractor}^{\bbnum 1}=\bbnum 1\Rightarrow Z$ +\begin_inset Formula $\text{Extractor}^{\bbnum 1}=\bbnum 1\rightarrow Z$ \end_inset requires creating a value of type @@ -9868,7 +9866,7 @@ Unit \end_inset , a value of type -\begin_inset Formula $\text{Extractor}^{C}=C\Rightarrow Z$ +\begin_inset Formula $\text{Extractor}^{C}=C\rightarrow Z$ \end_inset can be computed only if we can compute a value of type @@ -9894,7 +9892,7 @@ Unit \end_inset is implemented as an identity function of type -\begin_inset Formula $Z\Rightarrow Z$ +\begin_inset Formula $Z\rightarrow Z$ \end_inset : @@ -9926,7 +9924,7 @@ Creating a typeclass instance \end_inset means to compute -\begin_inset Formula $\forall A.\,A\Rightarrow Z$ +\begin_inset Formula $\forall A.\,A\rightarrow Z$ \end_inset ; this is not possible since we cannot create values of type @@ -10034,7 +10032,7 @@ Extractor type signature \begin_inset Formula \[ -\forall(A,B,Z).\,\text{Extractor}^{A}\times\text{Extractor}^{B}\Rightarrow\text{Extractor}^{A\times B}=\left(A\Rightarrow Z\right)\times\left(B\Rightarrow Z\right)\Rightarrow A\times B\Rightarrow Z\quad. +\forall(A,B,Z).\,\text{Extractor}^{A}\times\text{Extractor}^{B}\rightarrow\text{Extractor}^{A\times B}=\left(A\rightarrow Z\right)\times\left(B\rightarrow Z\right)\rightarrow A\times B\rightarrow Z\quad. \] \end_inset @@ -10043,7 +10041,7 @@ We can derive only two fully parametric implementations of this type signature: \begin_inset Formula \[ -f^{:A\Rightarrow Z}\times g^{:B\Rightarrow Z}\Rightarrow a\times b\Rightarrow f(a)\quad\quad\text{ and }\quad\quad f^{:A\Rightarrow Z}\times g^{:B\Rightarrow Z}\Rightarrow a\times b\Rightarrow g(b)\quad. +f^{:A\rightarrow Z}\times g^{:B\rightarrow Z}\rightarrow a\times b\rightarrow f(a)\quad\quad\text{ and }\quad\quad f^{:A\rightarrow Z}\times g^{:B\rightarrow Z}\rightarrow a\times b\rightarrow g(b)\quad. \] \end_inset @@ -10090,7 +10088,7 @@ any , \begin_inset Formula \[ -\text{extractorPair}:\forall(A,B,Z).\,\text{Extractor}^{A}\Rightarrow\text{Extractor}^{A\times B}\quad. +\text{extractorPair}:\forall(A,B,Z).\,\text{Extractor}^{A}\rightarrow\text{Extractor}^{A\times B}\quad. \] \end_inset @@ -10196,7 +10194,7 @@ Given typeclass instances ? Writing out the types, we get \begin_inset Formula \[ -\forall(A,B,Z).\,\text{Extractor}^{A}\times\text{Extractor}^{B}\Rightarrow\text{Extractor}^{A+B}=\left(A\Rightarrow Z\right)\times\left(B\Rightarrow Z\right)\Rightarrow A+B\Rightarrow Z\quad. +\forall(A,B,Z).\,\text{Extractor}^{A}\times\text{Extractor}^{B}\rightarrow\text{Extractor}^{A+B}=\left(A\rightarrow Z\right)\times\left(B\rightarrow Z\right)\rightarrow A+B\rightarrow Z\quad. \] \end_inset @@ -10218,10 +10216,10 @@ noprefix "false" ), we have a unique implementation of this function: \begin_inset Formula \[ -\text{extractorEither}\triangleq f^{:A\Rightarrow Z}\times g^{:B\Rightarrow Z}\Rightarrow\begin{array}{|c||c|} +\text{extractorEither}\triangleq f^{:A\rightarrow Z}\times g^{:B\rightarrow Z}\rightarrow\begin{array}{|c||c|} & Z\\ -\hline A & a\Rightarrow f(a)\\ -B & b\Rightarrow g(b) +\hline A & a\rightarrow f(a)\\ +B & b\rightarrow g(b) \end{array}\quad. \] @@ -10379,11 +10377,11 @@ Function types \begin_layout Standard We need to investigate whether -\begin_inset Formula $C\Rightarrow A$ +\begin_inset Formula $C\rightarrow A$ \end_inset or -\begin_inset Formula $A\Rightarrow C$ +\begin_inset Formula $A\rightarrow C$ \end_inset can have an @@ -10410,7 +10408,7 @@ Extractor The required conversion functions must have type signatures \begin_inset Formula \[ -\text{Extractor}^{A}\Rightarrow\text{Extractor}^{A\Rightarrow C}\quad\quad\text{ or }\quad\quad\text{Extractor}^{A}\Rightarrow\text{Extractor}^{C\Rightarrow A}\quad. +\text{Extractor}^{A}\rightarrow\text{Extractor}^{A\rightarrow C}\quad\quad\text{ or }\quad\quad\text{Extractor}^{A}\rightarrow\text{Extractor}^{C\rightarrow A}\quad. \] \end_inset @@ -10418,7 +10416,7 @@ Extractor Writing out the types, we find \begin_inset Formula \[ -\left(A\Rightarrow Z\right)\Rightarrow\left(A\Rightarrow C\right)\Rightarrow Z\quad\quad\text{ or }\quad\quad\left(A\Rightarrow Z\right)\Rightarrow\left(C\Rightarrow A\right)\Rightarrow Z\quad. +\left(A\rightarrow Z\right)\rightarrow\left(A\rightarrow C\right)\rightarrow Z\quad\quad\text{ or }\quad\quad\left(A\rightarrow Z\right)\rightarrow\left(C\rightarrow A\right)\rightarrow Z\quad. \] \end_inset @@ -10443,7 +10441,7 @@ None of these type signatures can be implemented. as part of the newly constructed type. So, we consider the pair type -\begin_inset Formula $C\times\left(C\Rightarrow A\right)$ +\begin_inset Formula $C\times\left(C\rightarrow A\right)$ \end_inset and find that its @@ -10463,17 +10461,17 @@ Extractor \end_inset a value of type -\begin_inset Formula $C\times\left(C\Rightarrow A\right)\Rightarrow Z$ +\begin_inset Formula $C\times\left(C\rightarrow A\right)\rightarrow Z$ \end_inset , can be derived from a value of type -\begin_inset Formula $A\Rightarrow Z$ +\begin_inset Formula $A\rightarrow Z$ \end_inset as \begin_inset Formula \[ -f^{:A\Rightarrow Z}\Rightarrow c^{:C}\times g^{:C\Rightarrow A}\Rightarrow f(g(c))\quad. +f^{:A\rightarrow Z}\rightarrow c^{:C}\times g^{:C\rightarrow A}\rightarrow f(g(c))\quad. \] \end_inset @@ -10496,11 +10494,11 @@ def extractorFunc[Z, A, C](implicit ti: Extractor[Z, A]) = \end_inset Examples of this construction are the type expressions -\begin_inset Formula $C\times\left(C\Rightarrow Z\right)$ +\begin_inset Formula $C\times\left(C\rightarrow Z\right)$ \end_inset and -\begin_inset Formula $D\times\left(D\Rightarrow Z\times P\right)$ +\begin_inset Formula $D\times\left(D\rightarrow Z\times P\right)$ \end_inset . @@ -10520,7 +10518,7 @@ Extractor \end_inset instance exists for the type -\begin_inset Formula $C\Rightarrow A$ +\begin_inset Formula $C\rightarrow A$ \end_inset is when the type @@ -10557,7 +10555,7 @@ HasDefault \end_inset in -\begin_inset Formula $C\times(C\Rightarrow A)$ +\begin_inset Formula $C\times(C\rightarrow A)$ \end_inset and instead substitute the default value when necessary. @@ -10606,7 +10604,7 @@ Extractor must be also an extractor type). For the function construction, -\begin_inset Formula $F_{3}^{C,A}\triangleq C\times\left(C\Rightarrow A\right)$ +\begin_inset Formula $F_{3}^{C,A}\triangleq C\times\left(C\rightarrow A\right)$ \end_inset . @@ -10774,7 +10772,7 @@ Extractor types, such as \begin_inset Formula \begin{equation} -T\triangleq F_{3}^{C,F_{2}^{Z,F_{1}^{T,P}}}=C\times\left(C\Rightarrow Z+P\times T\right)\quad.\label{eq:example-good-recursive-equation-extractor} +T\triangleq F_{3}^{C,F_{2}^{Z,F_{1}^{T,P}}}=C\times\left(C\rightarrow Z+P\times T\right)\quad.\label{eq:example-good-recursive-equation-extractor} \end{equation} \end_inset @@ -10790,7 +10788,7 @@ infinite exponential-polynomial type expression \begin_inset Formula \[ -T=C\times\left(C\Rightarrow Z+P\times C\times\left(C\Rightarrow Z+P\times C\times\left(C\Rightarrow Z+...\right)\right)\right)\quad. +T=C\times\left(C\rightarrow Z+P\times C\times\left(C\rightarrow Z+P\times C\times\left(C\rightarrow Z+...\right)\right)\right)\quad. \] \end_inset @@ -10872,7 +10870,7 @@ Extractor , we implemented a function with type \begin_inset Formula \[ -\text{extractorF}:\text{Extractor}^{A}\Rightarrow\text{Extractor}^{F^{A}}\quad. +\text{extractorF}:\text{Extractor}^{A}\rightarrow\text{Extractor}^{F^{A}}\quad. \] \end_inset @@ -10896,7 +10894,7 @@ Since , we are able to implement a function \begin_inset Formula \[ -\text{extractorS}:\text{Extractor}^{A}\Rightarrow\text{Extractor}^{S^{A}}\quad. +\text{extractorS}:\text{Extractor}^{A}\rightarrow\text{Extractor}^{S^{A}}\quad. \] \end_inset @@ -10920,7 +10918,7 @@ Extractor is then defined recursively as \begin_inset Formula \[ -x^{:T\Rightarrow Z}\triangleq\text{extractorS}\left(x\right)\quad. +x^{:T\rightarrow Z}\triangleq\text{extractorS}\left(x\right)\quad. \] \end_inset @@ -10987,7 +10985,7 @@ The type constructor is defined by \begin_inset Formula \[ -S^{A}\triangleq C\times\left(C\Rightarrow Z+P\times A\right)\quad. +S^{A}\triangleq C\times\left(C\rightarrow Z+P\times A\right)\quad. \] \end_inset @@ -11023,13 +11021,13 @@ Extractor[T] => Extractor[S[T]] \end_inset , which is -\begin_inset Formula $\left(T\Rightarrow Z\right)\Rightarrow S^{T}\Rightarrow Z$ +\begin_inset Formula $\left(T\rightarrow Z\right)\rightarrow S^{T}\rightarrow Z$ \end_inset , we begin with a typed hole \begin_inset Formula \[ -f^{:T\Rightarrow Z}\Rightarrow s^{:C\times\left(C\Rightarrow Z+P\times T\right)}\Rightarrow\text{???}^{:Z}\quad. +f^{:T\rightarrow Z}\rightarrow s^{:C\times\left(C\rightarrow Z+P\times T\right)}\rightarrow\text{???}^{:Z}\quad. \] \end_inset @@ -11039,7 +11037,7 @@ To fill \end_inset , we could apply -\begin_inset Formula $f^{:T\Rightarrow Z}$ +\begin_inset Formula $f^{:T\rightarrow Z}$ \end_inset to some value of type @@ -11051,7 +11049,7 @@ To fill \end_inset can be obtained if we apply the function of type -\begin_inset Formula $C\Rightarrow Z+P\times T$ +\begin_inset Formula $C\rightarrow Z+P\times T$ \end_inset to the given value of type @@ -11062,7 +11060,7 @@ To fill So we write \begin_inset Formula \[ -f^{:T\Rightarrow Z}\Rightarrow c^{:C}\times g^{:C\Rightarrow Z+P\times T}\Rightarrow g(c)\triangleright\text{???}^{:Z+P\times T\Rightarrow Z}\quad. +f^{:T\rightarrow Z}\rightarrow c^{:C}\times g^{:C\rightarrow Z+P\times T}\rightarrow g(c)\triangleright\text{???}^{:Z+P\times T\rightarrow Z}\quad. \] \end_inset @@ -11071,10 +11069,10 @@ The new typed hole has a function type. We can write the code in matrix notation as \begin_inset Formula \[ -\text{extractorS}\triangleq f^{:T\Rightarrow Z}\Rightarrow c^{:C}\times g^{:C\Rightarrow Z+P\times T}\Rightarrow g(c)\triangleright\begin{array}{|c||c|} +\text{extractorS}\triangleq f^{:T\rightarrow Z}\rightarrow c^{:C}\times g^{:C\rightarrow Z+P\times T}\rightarrow g(c)\triangleright\begin{array}{|c||c|} & Z\\ \hline Z & \text{id}\\ -P\times T & p^{:P}\times t^{:T}\Rightarrow f(t) +P\times T & p^{:P}\times t^{:T}\rightarrow f(t) \end{array}\quad. \] @@ -11367,7 +11365,7 @@ expanded function , \begin_inset Formula \[ -\text{extractorT}\triangleq t\Rightarrow\text{extractorS}\left(\text{extractorT}\right)(t)\quad. +\text{extractorT}\triangleq t\rightarrow\text{extractorS}\left(\text{extractorT}\right)(t)\quad. \] \end_inset @@ -11404,7 +11402,7 @@ expanded function \end_inset -\begin_inset Formula $t\Rightarrow f(t)$ +\begin_inset Formula $t\rightarrow f(t)$ \end_inset is equivalent to just @@ -11487,7 +11485,7 @@ This code is clearly invalid. But if we expand the right-hand side of the recursive equation to \begin_inset Formula \[ -f\triangleq t\Rightarrow k(f)(t) +f\triangleq t\rightarrow k(f)(t) \] \end_inset @@ -11585,7 +11583,7 @@ Extractor An example is the type expression \begin_inset Formula \[ -K^{Z,P,Q,R,S}\triangleq Z\times P+Q\times\left(Q\Rightarrow Z+R\times\left(R\Rightarrow Z\times S\right)\right)\quad. +K^{Z,P,Q,R,S}\triangleq Z\times P+Q\times\left(Q\rightarrow Z+R\times\left(R\rightarrow Z\times S\right)\right)\quad. \] \end_inset @@ -11946,7 +11944,7 @@ Product of extractor type \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Extractor}^{A}\Rightarrow\text{Extractor}^{A\times B}$ +\begin_inset Formula $\text{Extractor}^{A}\rightarrow\text{Extractor}^{A\times B}$ \end_inset @@ -11992,7 +11990,7 @@ Co-product of extractor types \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Extractor}^{A}\times\text{Extractor}^{B}\Rightarrow\text{Extractor}^{A+B}$ +\begin_inset Formula $\text{Extractor}^{A}\times\text{Extractor}^{B}\rightarrow\text{Extractor}^{A+B}$ \end_inset @@ -12034,11 +12032,11 @@ Function from or to another type \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Extractor}^{A}\Rightarrow\text{Extractor}^{A\Rightarrow C}$ +\begin_inset Formula $\text{Extractor}^{A}\rightarrow\text{Extractor}^{A\rightarrow C}$ \end_inset or -\begin_inset Formula $\text{Extractor}^{C\Rightarrow A}$ +\begin_inset Formula $\text{Extractor}^{C\rightarrow A}$ \end_inset @@ -12052,7 +12050,7 @@ Function from or to another type \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Extractor}^{C\times\left(C\Rightarrow A\right)}$ +\begin_inset Formula $\text{Extractor}^{C\times\left(C\rightarrow A\right)}$ \end_inset @@ -12079,7 +12077,7 @@ Recursive types \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Extractor}^{A}\Rightarrow\text{Extractor}^{S^{A}}$ +\begin_inset Formula $\text{Extractor}^{A}\rightarrow\text{Extractor}^{S^{A}}$ \end_inset where @@ -12232,7 +12230,7 @@ Eq \end_inset is a function of type -\begin_inset Formula $A\times A\Rightarrow\bbnum 2$ +\begin_inset Formula $A\times A\rightarrow\bbnum 2$ \end_inset (where @@ -12457,7 +12455,7 @@ true . The example shown above violates that law when we choose -\begin_inset Formula $x\triangleq n^{:\text{Int}}\Rightarrow n$ +\begin_inset Formula $x\triangleq n^{:\text{Int}}\rightarrow n$ \end_inset . @@ -12477,7 +12475,7 @@ Eq \end_inset typeclass, defining -\begin_inset Formula $\text{Eq}^{A}\triangleq A\times A\Rightarrow\bbnum 2$ +\begin_inset Formula $\text{Eq}^{A}\triangleq A\times A\rightarrow\bbnum 2$ \end_inset . @@ -12633,7 +12631,7 @@ equal \end_inset according to this definition, and yet many functions -\begin_inset Formula $f^{:A\times B\Rightarrow C}$ +\begin_inset Formula $f^{:A\times B\rightarrow C}$ \end_inset exist such that @@ -12891,7 +12889,7 @@ Eq \end_inset instance for -\begin_inset Formula $R\Rightarrow A$ +\begin_inset Formula $R\rightarrow A$ \end_inset where @@ -12901,7 +12899,7 @@ Eq is some other type? This would be possible with a function of type \begin_inset Formula \begin{equation} -\forall A.\,(A\times A\Rightarrow\bbnum 2)\Rightarrow\left(R\Rightarrow A\right)\times\left(R\Rightarrow A\right)\Rightarrow\bbnum 2\quad.\label{eq:type-signature-function-comparison} +\forall A.\,(A\times A\rightarrow\bbnum 2)\rightarrow\left(R\rightarrow A\right)\times\left(R\rightarrow A\right)\rightarrow\bbnum 2\quad.\label{eq:type-signature-function-comparison} \end{equation} \end_inset @@ -12925,7 +12923,7 @@ Here we assume that the type , say. But in those cases the type -\begin_inset Formula $R\Rightarrow A$ +\begin_inset Formula $R\rightarrow A$ \end_inset can be simplified to a polynomial type, e.g. @@ -12933,11 +12931,11 @@ Here we assume that the type \end_inset -\begin_inset Formula $\bbnum 1\Rightarrow A\cong A$ +\begin_inset Formula $\bbnum 1\rightarrow A\cong A$ \end_inset and -\begin_inset Formula $\bbnum 2\Rightarrow A\cong A\times A$ +\begin_inset Formula $\bbnum 2\rightarrow A\cong A\times A$ \end_inset , etc.) Without values of type @@ -13022,7 +13020,7 @@ true \begin_layout Standard We will be able to evaluate functions of type -\begin_inset Formula $R\Rightarrow A$ +\begin_inset Formula $R\rightarrow A$ \end_inset if some chosen values of type @@ -13105,7 +13103,7 @@ g Another way to see the problem is to write the type equivalence \begin_inset Formula \[ -R\Rightarrow A\cong\bbnum 1+S\Rightarrow A\cong A\times(S\Rightarrow A)\quad, +R\rightarrow A\cong\bbnum 1+S\rightarrow A\cong A\times(S\rightarrow A)\quad, \] \end_inset @@ -13124,11 +13122,11 @@ Eq \end_inset instance for -\begin_inset Formula $S\Rightarrow A$ +\begin_inset Formula $S\rightarrow A$ \end_inset to define the equality operation for -\begin_inset Formula $R\Rightarrow A$ +\begin_inset Formula $R\rightarrow A$ \end_inset . @@ -13146,7 +13144,7 @@ if , we will again reduce the situation to the product construction with the function type -\begin_inset Formula $T\Rightarrow A$ +\begin_inset Formula $T\rightarrow A$ \end_inset . @@ -13176,7 +13174,7 @@ known \emph default and finite number of distinct values. In that case, we can write code that applies functions of type -\begin_inset Formula $R\Rightarrow A$ +\begin_inset Formula $R\rightarrow A$ \end_inset to every possible value of the argument of type @@ -13192,11 +13190,11 @@ known \begin_layout Standard So, we can compare functions -\begin_inset Formula $f_{1}^{:R\Rightarrow A}$ +\begin_inset Formula $f_{1}^{:R\rightarrow A}$ \end_inset and -\begin_inset Formula $f_{2}^{:R\Rightarrow A}$ +\begin_inset Formula $f_{2}^{:R\rightarrow A}$ \end_inset only if we are able to check whether @@ -13221,7 +13219,7 @@ every \begin_layout Standard We conclude that functions of type -\begin_inset Formula $R\Rightarrow A$ +\begin_inset Formula $R\rightarrow A$ \end_inset cannot have an @@ -13242,7 +13240,7 @@ Eq . A similar argument shows that functions of type -\begin_inset Formula $A\Rightarrow R$ +\begin_inset Formula $A\rightarrow R$ \end_inset also cannot have a useful @@ -13259,11 +13257,11 @@ Eq instance. The only exceptions are types -\begin_inset Formula $R\Rightarrow A$ +\begin_inset Formula $R\rightarrow A$ \end_inset or -\begin_inset Formula $A\Rightarrow R$ +\begin_inset Formula $A\rightarrow R$ \end_inset that are equivalent to some polynomial types. @@ -13360,7 +13358,7 @@ Eq of type \begin_inset Formula \[ -\text{eqS}:\text{Eq}^{A}\Rightarrow\text{Eq}^{S^{A}}\quad. +\text{eqS}:\text{Eq}^{A}\rightarrow\text{Eq}^{S^{A}}\quad. \] \end_inset @@ -13447,7 +13445,7 @@ eqT needs to be implemented as an expanded function, \begin_inset Formula \[ -\text{eqT}\triangleq t^{:T}\times t^{:T}\Rightarrow\text{eqS}\,(\text{eqT})\left(t\times t\right)\quad, +\text{eqT}\triangleq t^{:T}\times t^{:T}\rightarrow\text{eqS}\,(\text{eqT})\left(t\times t\right)\quad, \] \end_inset @@ -14175,7 +14173,7 @@ Unit \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Eq}^{T}\triangleq T\times T\Rightarrow\bbnum 2$ +\begin_inset Formula $\text{Eq}^{T}\triangleq T\times T\rightarrow\bbnum 2$ \end_inset @@ -14245,7 +14243,7 @@ Eq \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Eq}^{A}\times\text{Eq}^{B}\Rightarrow\text{Eq}^{A\times B}$ +\begin_inset Formula $\text{Eq}^{A}\times\text{Eq}^{B}\rightarrow\text{Eq}^{A\times B}$ \end_inset @@ -14303,7 +14301,7 @@ Eq \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Eq}^{A}\times\text{Eq}^{B}\Rightarrow\text{Eq}^{A+B}$ +\begin_inset Formula $\text{Eq}^{A}\times\text{Eq}^{B}\rightarrow\text{Eq}^{A+B}$ \end_inset @@ -14341,7 +14339,7 @@ Recursive types \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Eq}^{A}\Rightarrow\text{Eq}^{S^{A}}$ +\begin_inset Formula $\text{Eq}^{A}\rightarrow\text{Eq}^{S^{A}}$ \end_inset where @@ -14440,7 +14438,7 @@ Semigroup \end_inset when an associative binary operation of type -\begin_inset Formula $T\times T\Rightarrow T$ +\begin_inset Formula $T\times T\rightarrow T$ \end_inset is available. @@ -14585,16 +14583,16 @@ A semigroup instance parametric in type \end_inset means a value of type -\begin_inset Formula $\forall T.\,T\times T\Rightarrow T$ +\begin_inset Formula $\forall T.\,T\times T\rightarrow T$ \end_inset . There are two implementations of this type signature: -\begin_inset Formula $a^{:T}\times b^{:T}\Rightarrow a$ +\begin_inset Formula $a^{:T}\times b^{:T}\rightarrow a$ \end_inset and -\begin_inset Formula $a^{:T}\times b^{:T}\Rightarrow b$ +\begin_inset Formula $a^{:T}\times b^{:T}\rightarrow b$ \end_inset . @@ -14692,7 +14690,7 @@ To compute that instance means, in the general case, to implement a function with type \begin_inset Formula \[ -\text{semigroupPair}:\forall(A,B).\,\text{Semigroup}^{A}\times\text{Semigroup}^{B}\Rightarrow\text{Semigroup}^{A\times B}\quad. +\text{semigroupPair}:\forall(A,B).\,\text{Semigroup}^{A}\times\text{Semigroup}^{B}\rightarrow\text{Semigroup}^{A\times B}\quad. \] \end_inset @@ -14700,7 +14698,7 @@ To compute that instance means, in the general case, to implement a function Writing out the type expressions, we get the type signature \begin_inset Formula \[ -\text{semigroupPair}:\forall(A,B).\,\left(A\times A\Rightarrow A\right)\times\left(B\times B\Rightarrow B\right)\Rightarrow\left(A\times B\times A\times B\Rightarrow A\times B\right)\quad. +\text{semigroupPair}:\forall(A,B).\,\left(A\times A\rightarrow A\right)\times\left(B\times B\rightarrow B\right)\rightarrow\left(A\times B\times A\times B\rightarrow A\times B\right)\quad. \] \end_inset @@ -14711,7 +14709,7 @@ While this type signature can be implemented in a number of ways, we look The code should be a function of the form \begin_inset Formula \[ -\text{semigroupPair}\triangleq f^{:A\times A\Rightarrow A}\times g^{:B\times B\Rightarrow B}\Rightarrow a_{1}^{:A}\times b_{1}^{:B}\times a_{2}^{:A}\times b_{2}^{:B}\Rightarrow???^{:A}\times???^{:B}\quad. +\text{semigroupPair}\triangleq f^{:A\times A\rightarrow A}\times g^{:B\times B\rightarrow B}\rightarrow a_{1}^{:A}\times b_{1}^{:B}\times a_{2}^{:A}\times b_{2}^{:B}\rightarrow???^{:A}\times???^{:B}\quad. \] \end_inset @@ -14752,7 +14750,7 @@ Since we are trying to define the new semigroup operation through the previously and write \begin_inset Formula \[ -f^{:A\times A\Rightarrow A}\times g^{:B\times B\Rightarrow B}\Rightarrow a_{1}^{:A}\times b_{1}^{:B}\times a_{2}^{:A}\times b_{2}^{:B}\Rightarrow f(a_{1},a_{2})\times g(b_{1},b_{2})\quad. +f^{:A\times A\rightarrow A}\times g^{:B\times B\rightarrow B}\rightarrow a_{1}^{:A}\times b_{1}^{:B}\times a_{2}^{:A}\times b_{2}^{:B}\rightarrow f(a_{1},a_{2})\times g(b_{1},b_{2})\quad. \] \end_inset @@ -14853,7 +14851,7 @@ Semigroup of two semigroups, we need \begin_inset Formula \[ -\text{semigroupEither}:\forall(A,B).\,\text{Semigroup}^{A}\times\text{Semigroup}^{B}\Rightarrow\text{Semigroup}^{A+B}\quad. +\text{semigroupEither}:\forall(A,B).\,\text{Semigroup}^{A}\times\text{Semigroup}^{B}\rightarrow\text{Semigroup}^{A+B}\quad. \] \end_inset @@ -14861,7 +14859,7 @@ Semigroup Writing out the type expressions, we get the type signature \begin_inset Formula \[ -\text{semigroupEither}:\forall(A,B).\,\left(A\times A\Rightarrow A\right)\times\left(B\times B\Rightarrow B\right)\Rightarrow\left(A+B\right)\times\left(A+B\right)\Rightarrow A+B\quad. +\text{semigroupEither}:\forall(A,B).\,\left(A\times A\rightarrow A\right)\times\left(B\times B\rightarrow B\right)\rightarrow\left(A+B\right)\times\left(A+B\right)\rightarrow A+B\quad. \] \end_inset @@ -14869,7 +14867,7 @@ Writing out the type expressions, we get the type signature Begin by writing a function with a typed hole: \begin_inset Formula \[ -\text{semigroupEither}\triangleq f^{:A\times A\Rightarrow A}\times g^{:B\times B\Rightarrow B}\Rightarrow c^{:\left(A+B\right)\times\left(A+B\right)}\Rightarrow\text{???}^{:A+B}\quad. +\text{semigroupEither}\triangleq f^{:A\times A\rightarrow A}\times g^{:B\times B\rightarrow B}\rightarrow c^{:\left(A+B\right)\times\left(A+B\right)}\rightarrow\text{???}^{:A+B}\quad. \] \end_inset @@ -14889,12 +14887,12 @@ Transforming the type expression we can continue to write the function's code in matrix notation, \begin_inset Formula \[ -f^{:A\times A\Rightarrow A}\times g^{:B\times B\Rightarrow B}\Rightarrow\begin{array}{|c||cc|} +f^{:A\times A\rightarrow A}\times g^{:B\times B\rightarrow B}\rightarrow\begin{array}{|c||cc|} & A & B\\ -\hline A\times A & \text{???}^{:A\times A\Rightarrow A} & \text{???}^{:A\times A\Rightarrow B}\\ -A\times B & \text{???}^{:A\times B\Rightarrow A} & \text{???}^{:A\times B\Rightarrow B}\\ -B\times A & \text{???}^{:B\times A\Rightarrow A} & \text{???}^{:B\times A\Rightarrow B}\\ -B\times B & \text{???}^{:B\times B\Rightarrow A} & \text{???}^{:B\times B\Rightarrow B} +\hline A\times A & \text{???}^{:A\times A\rightarrow A} & \text{???}^{:A\times A\rightarrow B}\\ +A\times B & \text{???}^{:A\times B\rightarrow A} & \text{???}^{:A\times B\rightarrow B}\\ +B\times A & \text{???}^{:B\times A\rightarrow A} & \text{???}^{:B\times A\rightarrow B}\\ +B\times B & \text{???}^{:B\times B\rightarrow A} & \text{???}^{:B\times B\rightarrow B} \end{array}\quad. \] @@ -14933,11 +14931,11 @@ The matrix is To save space, we will omit the types in the matrices. The first and the last rows of the matrix must contain functions of types -\begin_inset Formula $A\times A\Rightarrow A$ +\begin_inset Formula $A\times A\rightarrow A$ \end_inset and -\begin_inset Formula $B\times B\Rightarrow B$ +\begin_inset Formula $B\times B\rightarrow B$ \end_inset , and so it is natural to fill them with @@ -14951,11 +14949,11 @@ To save space, we will omit the types in the matrices. : \begin_inset Formula \[ -f^{:A\times A\Rightarrow A}\times g^{:B\times B\Rightarrow B}\Rightarrow\begin{array}{||cc|} -f^{:A\times A\Rightarrow A} & \bbnum 0\\ -\text{???}^{:A\times B\Rightarrow A} & \text{???}^{:A\times B\Rightarrow B}\\ -\text{???}^{:B\times A\Rightarrow A} & \text{???}^{:B\times A\Rightarrow B}\\ -\bbnum 0 & g^{:B\times B\Rightarrow B} +f^{:A\times A\rightarrow A}\times g^{:B\times B\rightarrow B}\rightarrow\begin{array}{||cc|} +f^{:A\times A\rightarrow A} & \bbnum 0\\ +\text{???}^{:A\times B\rightarrow A} & \text{???}^{:A\times B\rightarrow B}\\ +\text{???}^{:B\times A\rightarrow A} & \text{???}^{:B\times A\rightarrow B}\\ +\bbnum 0 & g^{:B\times B\rightarrow B} \end{array}\quad. \] @@ -14964,26 +14962,26 @@ f^{:A\times A\Rightarrow A} & \bbnum 0\\ The remaining two rows can be filled in four different ways: \begin_inset Formula \begin{align*} -f\times g\Rightarrow\begin{array}{||cc|} -f^{:A\times A\Rightarrow A} & \bbnum 0\\ -a^{:A}\times b^{:B}\Rightarrow a & \bbnum 0\\ -b^{:B}\times a^{:A}\Rightarrow a & \bbnum 0\\ -\bbnum 0 & g^{:B\times B\Rightarrow B} -\end{array}~\quad,\quad\quad & ~f\times g\Rightarrow\begin{array}{||cc|} +f\times g\rightarrow\begin{array}{||cc|} +f^{:A\times A\rightarrow A} & \bbnum 0\\ +a^{:A}\times b^{:B}\rightarrow a & \bbnum 0\\ +b^{:B}\times a^{:A}\rightarrow a & \bbnum 0\\ +\bbnum 0 & g^{:B\times B\rightarrow B} +\end{array}~\quad,\quad\quad & ~f\times g\rightarrow\begin{array}{||cc|} f & \bbnum 0\\ -\bbnum 0 & a^{:A}\times b^{:B}\Rightarrow b\\ -\bbnum 0 & b^{:B}\times a^{:A}\Rightarrow b\\ +\bbnum 0 & a^{:A}\times b^{:B}\rightarrow b\\ +\bbnum 0 & b^{:B}\times a^{:A}\rightarrow b\\ \bbnum 0 & g \end{array}\quad,\\ -f\times g\Rightarrow\begin{array}{||cc|} -f^{:A\times A\Rightarrow A} & \bbnum 0\\ -\bbnum 0 & a^{:A}\times b^{:B}\Rightarrow b\\ -b^{:B}\times a^{:A}\Rightarrow a & \bbnum 0\\ -\bbnum 0 & g^{:B\times B\Rightarrow B} -\end{array}\quad,\quad\quad & f\times g\Rightarrow\begin{array}{||cc|} +f\times g\rightarrow\begin{array}{||cc|} +f^{:A\times A\rightarrow A} & \bbnum 0\\ +\bbnum 0 & a^{:A}\times b^{:B}\rightarrow b\\ +b^{:B}\times a^{:A}\rightarrow a & \bbnum 0\\ +\bbnum 0 & g^{:B\times B\rightarrow B} +\end{array}\quad,\quad\quad & f\times g\rightarrow\begin{array}{||cc|} f & \bbnum 0\\ -a^{:A}\times b^{:B}\Rightarrow a & \bbnum 0\\ -\bbnum 0 & b^{:B}\times a^{:A}\Rightarrow b\\ +a^{:A}\times b^{:B}\rightarrow a & \bbnum 0\\ +\bbnum 0 & b^{:B}\times a^{:A}\rightarrow b\\ \bbnum 0 & g \end{array}\quad. \end{align*} @@ -15632,11 +15630,11 @@ If \end_inset is any fixed type, are the types -\begin_inset Formula $A\Rightarrow E$ +\begin_inset Formula $A\rightarrow E$ \end_inset and/or -\begin_inset Formula $E\Rightarrow A$ +\begin_inset Formula $E\rightarrow A$ \end_inset semigroups? To create a @@ -15652,13 +15650,13 @@ Semigroup \end_inset instance for -\begin_inset Formula $E\Rightarrow A$ +\begin_inset Formula $E\rightarrow A$ \end_inset means to implement the type signature \begin_inset Formula \[ -\text{Semigroup}^{A}\Rightarrow\text{Semigroup}^{E\Rightarrow A}=\left(A\times A\Rightarrow A\right)\Rightarrow\left(E\Rightarrow A\right)\times\left(E\Rightarrow A\right)\Rightarrow E\Rightarrow A\quad. +\text{Semigroup}^{A}\rightarrow\text{Semigroup}^{E\rightarrow A}=\left(A\times A\rightarrow A\right)\rightarrow\left(E\rightarrow A\right)\times\left(E\rightarrow A\right)\rightarrow E\rightarrow A\quad. \] \end_inset @@ -15666,7 +15664,7 @@ Semigroup An implementation that preserves information is \begin_inset Formula \[ -\text{semigroupFunc}\triangleq f^{:A\times A\Rightarrow A}\Rightarrow g_{1}^{:E\Rightarrow A}\times g_{2}^{:E\Rightarrow A}\Rightarrow e^{:E}\Rightarrow f(g_{1}(e),g_{2}(e))\quad. +\text{semigroupFunc}\triangleq f^{:A\times A\rightarrow A}\rightarrow g_{1}^{:E\rightarrow A}\times g_{2}^{:E\rightarrow A}\rightarrow e^{:E}\rightarrow f(g_{1}(e),g_{2}(e))\quad. \] \end_inset @@ -15676,7 +15674,7 @@ This defines the new \end_inset operation by -\begin_inset Formula $g_{1}\oplus g_{2}\triangleq e\Rightarrow g_{1}(e)\oplus_{A}g_{2}(e)$ +\begin_inset Formula $g_{1}\oplus g_{2}\triangleq e\rightarrow g_{1}(e)\oplus_{A}g_{2}(e)$ \end_inset . @@ -15715,12 +15713,12 @@ In the pipe notation, \begin_layout Standard The type -\begin_inset Formula $A\Rightarrow E$ +\begin_inset Formula $A\rightarrow E$ \end_inset only allows semigroup operations that discard the left or the right element: the type signature -\begin_inset Formula $f^{:A\times A\Rightarrow A}\Rightarrow h_{1}^{:A\Rightarrow E}\times h_{2}^{:A\Rightarrow E}\Rightarrow\text{???}^{:A\Rightarrow E}$ +\begin_inset Formula $f^{:A\times A\rightarrow A}\rightarrow h_{1}^{:A\rightarrow E}\times h_{2}^{:A\rightarrow E}\rightarrow\text{???}^{:A\rightarrow E}$ \end_inset can be implemented only by discarding @@ -15737,7 +15735,7 @@ The type . Either choice makes -\begin_inset Formula $A\Rightarrow E$ +\begin_inset Formula $A\rightarrow E$ \end_inset into a trivial semigroup. @@ -15801,7 +15799,7 @@ Semigroup[A] This gives us a function \begin_inset Formula \[ -\text{semigroupS}:\text{Semigroup}^{A}\Rightarrow\text{Semigroup}^{S^{A}}\quad. +\text{semigroupS}:\text{Semigroup}^{A}\rightarrow\text{Semigroup}^{S^{A}}\quad. \] \end_inset @@ -16007,7 +16005,7 @@ Product of semigroups \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Semigroup}^{A}\times\text{Semigroup}^{B}\Rightarrow\text{Semigroup}^{A\times B}$ +\begin_inset Formula $\text{Semigroup}^{A}\times\text{Semigroup}^{B}\rightarrow\text{Semigroup}^{A\times B}$ \end_inset @@ -16053,7 +16051,7 @@ Co-product of semigroups \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Semigroup}^{A}\times\text{Semigroup}^{B}\Rightarrow\text{Semigroup}^{A+B}$ +\begin_inset Formula $\text{Semigroup}^{A}\times\text{Semigroup}^{B}\rightarrow\text{Semigroup}^{A+B}$ \end_inset @@ -16095,7 +16093,7 @@ Function from another type \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Semigroup}^{A}\Rightarrow\text{Semigroup}^{E\Rightarrow A}$ +\begin_inset Formula $\text{Semigroup}^{A}\rightarrow\text{Semigroup}^{E\rightarrow A}$ \end_inset @@ -16133,7 +16131,7 @@ Recursive types \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Semigroup}^{A}\Rightarrow\text{Semigroup}^{S^{A}}$ +\begin_inset Formula $\text{Semigroup}^{A}\rightarrow\text{Semigroup}^{S^{A}}$ \end_inset where @@ -16230,13 +16228,13 @@ Monoid instance is a value of type \begin_inset Formula \[ -\text{Monoid}^{A}\triangleq\left(A\times A\Rightarrow A\right)\times A\quad. +\text{Monoid}^{A}\triangleq\left(A\times A\rightarrow A\right)\times A\quad. \] \end_inset For the binary operation -\begin_inset Formula $A\times A\Rightarrow A$ +\begin_inset Formula $A\times A\rightarrow A$ \end_inset , we can re-use the results of structural analysis for semigroups. @@ -16398,7 +16396,7 @@ For two monoids is computed by \begin_inset Formula \[ -\text{monoidPair}:\forall(A,B).\,\text{Monoid}^{A}\times\text{Monoid}^{B}\Rightarrow\text{Monoid}^{A\times B}\quad. +\text{monoidPair}:\forall(A,B).\,\text{Monoid}^{A}\times\text{Monoid}^{B}\rightarrow\text{Monoid}^{A\times B}\quad. \] \end_inset @@ -16703,7 +16701,7 @@ noprefix "false" \end_inset will show that the function type -\begin_inset Formula $R\Rightarrow A$ +\begin_inset Formula $R\rightarrow A$ \end_inset is a lawful monoid for any type @@ -16719,7 +16717,7 @@ noprefix "false" \begin_layout Standard Additionally, the function type -\begin_inset Formula $R\Rightarrow R$ +\begin_inset Formula $R\rightarrow R$ \end_inset is a monoid for any type @@ -16736,11 +16734,11 @@ Additionally, the function type \end_inset and the empty value are defined as -\begin_inset Formula $f^{:R\Rightarrow R}\oplus g^{:R\Rightarrow R}\triangleq f\bef g$ +\begin_inset Formula $f^{:R\rightarrow R}\oplus g^{:R\rightarrow R}\triangleq f\bef g$ \end_inset and -\begin_inset Formula $e_{R\Rightarrow R}\triangleq\text{id}^{R}$ +\begin_inset Formula $e_{R\rightarrow R}\triangleq\text{id}^{R}$ \end_inset . @@ -16886,7 +16884,7 @@ Monoid : \begin_inset Formula \[ -\text{monoidS}:\text{Monoid}^{A}\Rightarrow\text{Monoid}^{S^{A}}\quad. +\text{monoidS}:\text{Monoid}^{A}\rightarrow\text{Monoid}^{S^{A}}\quad. \] \end_inset @@ -16910,7 +16908,7 @@ As we saw before, the code for this definition will terminate only if we \end_inset is not a function type: it is a pair -\begin_inset Formula $\left(A\times A\Rightarrow A\right)\times A$ +\begin_inset Formula $\left(A\times A\rightarrow A\right)\times A$ \end_inset . @@ -16929,17 +16927,17 @@ monoidT , we need to rewrite that type into an equivalent function type, \begin_inset Formula \[ -\text{Monoid}^{A}=\left(A\times A\Rightarrow A\right)\times A\cong\left(A\times A\Rightarrow A\right)\times\left(\bbnum 1\Rightarrow A\right)\cong\left(\bbnum 1+A\times A\Rightarrow A\right)\quad, +\text{Monoid}^{A}=\left(A\times A\rightarrow A\right)\times A\cong\left(A\times A\rightarrow A\right)\times\left(\bbnum 1\rightarrow A\right)\cong\left(\bbnum 1+A\times A\rightarrow A\right)\quad, \] \end_inset where we used the known type equivalences -\begin_inset Formula $A\cong\bbnum 1\Rightarrow A$ +\begin_inset Formula $A\cong\bbnum 1\rightarrow A$ \end_inset and -\begin_inset Formula $\left(A\Rightarrow C\right)\times\left(B\Rightarrow C\right)\cong A+B\Rightarrow C$ +\begin_inset Formula $\left(A\rightarrow C\right)\times\left(B\rightarrow C\right)\cong A+B\rightarrow C$ \end_inset . @@ -17015,7 +17013,7 @@ or defined as \begin_inset Formula \[ -S^{A}\triangleq\left(\text{Int}+A\right)\times\text{Int}+\text{String}\times\left(A\Rightarrow\left(A\Rightarrow\text{Int}\right)\Rightarrow A\right)\quad. +S^{A}\triangleq\left(\text{Int}+A\right)\times\text{Int}+\text{String}\times\left(A\rightarrow\left(A\rightarrow\text{Int}\right)\rightarrow A\right)\quad. \] \end_inset @@ -17930,7 +17928,7 @@ Product of monoids \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Monoid}^{A}\times\text{Monoid}^{B}\Rightarrow\text{Monoid}^{A\times B}$ +\begin_inset Formula $\text{Monoid}^{A}\times\text{Monoid}^{B}\rightarrow\text{Monoid}^{A\times B}$ \end_inset @@ -17976,7 +17974,7 @@ Co-product of monoid \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Monoid}^{A}\times\text{Semigroup}^{B}\Rightarrow\text{Monoid}^{A+B}$ +\begin_inset Formula $\text{Monoid}^{A}\times\text{Semigroup}^{B}\rightarrow\text{Monoid}^{A+B}$ \end_inset @@ -18018,7 +18016,7 @@ Function from another type \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Monoid}^{A}\Rightarrow\text{Monoid}^{E\Rightarrow A}$ +\begin_inset Formula $\text{Monoid}^{A}\rightarrow\text{Monoid}^{E\rightarrow A}$ \end_inset @@ -18032,7 +18030,7 @@ Function from another type \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Monoid}^{E\Rightarrow A}$ +\begin_inset Formula $\text{Monoid}^{E\rightarrow A}$ \end_inset @@ -18059,7 +18057,7 @@ Recursive types \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Monoid}^{A}\Rightarrow\text{Monoid}^{S^{A}}$ +\begin_inset Formula $\text{Monoid}^{A}\rightarrow\text{Monoid}^{S^{A}}$ \end_inset where @@ -18340,7 +18338,7 @@ The code notation for this function is \end_inset , and the type signature is written as -\begin_inset Formula $\text{pu}_{F}:\forall A.\,A\Rightarrow F^{A}$ +\begin_inset Formula $\text{pu}_{F}:\forall A.\,A\rightarrow F^{A}$ \end_inset . @@ -18804,7 +18802,7 @@ pure \end_inset and a function -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset applied to the wrapped value via @@ -18905,7 +18903,7 @@ pure \end_inset ; it must hold for any -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset : @@ -19057,7 +19055,7 @@ pointed functor pointed \series default if there exists a fully parametric function -\begin_inset Formula $\text{pu}_{T}:\forall A.\,A\Rightarrow F^{A}$ +\begin_inset Formula $\text{pu}_{T}:\forall A.\,A\rightarrow F^{A}$ \end_inset satisfying the naturality law @@ -19075,7 +19073,7 @@ noprefix "false" \end_inset ) for any function -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset . @@ -19114,7 +19112,7 @@ noprefix "false" \end_inset ) are functions of type -\begin_inset Formula $A\Rightarrow F^{B}$ +\begin_inset Formula $A\rightarrow F^{B}$ \end_inset . @@ -19123,7 +19121,7 @@ noprefix "false" \end_inset and -\begin_inset Formula $f^{:\bbnum 1\Rightarrow B}\triangleq(\_\Rightarrow b)$ +\begin_inset Formula $f^{:\bbnum 1\rightarrow B}\triangleq(\_\rightarrow b)$ \end_inset , where @@ -19139,7 +19137,7 @@ noprefix "false" and must evaluate to the same result, \begin_inset Formula \[ -1\triangleright\text{pu}_{F}\triangleright(\_\Rightarrow b)^{\uparrow F}=1\triangleright f\triangleright\text{pu}_{F}\quad. +1\triangleright\text{pu}_{F}\triangleright(\_\rightarrow b)^{\uparrow F}=1\triangleright f\triangleright\text{pu}_{F}\quad. \] \end_inset @@ -19151,7 +19149,7 @@ Since , we find \begin_inset Formula \begin{equation} -\text{pu}_{F}(1)\triangleright(\_\Rightarrow b)^{\uparrow F}=\text{pu}_{F}(b)\quad.\label{eq:pu-via-wu} +\text{pu}_{F}(1)\triangleright(\_\rightarrow b)^{\uparrow F}=\text{pu}_{F}(b)\quad.\label{eq:pu-via-wu} \end{equation} \end_inset @@ -19175,7 +19173,7 @@ noprefix "false" \end_inset and to any function -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset . @@ -19277,7 +19275,7 @@ wrapped unit by using the code \begin_inset Formula \[ -\text{pu}_{F}(b)\triangleq\text{pu}_{F}(1)\triangleright(\_\Rightarrow b)^{\uparrow F}\quad +\text{pu}_{F}(b)\triangleq\text{pu}_{F}(1)\triangleright(\_\rightarrow b)^{\uparrow F}\quad \] \end_inset @@ -19349,23 +19347,23 @@ def pure[A](x: A): F[A] = wu.map { _ => x } \begin_inset Formula \begin{equation} -\text{pu}_{F}^{:A\Rightarrow F^{A}}\triangleq x^{:A}\Rightarrow\text{wu}_{F}\triangleright(\_\Rightarrow x)^{\uparrow F}\quad.\label{eq:pu-via-wu-def} +\text{pu}_{F}^{:A\rightarrow F^{A}}\triangleq x^{:A}\rightarrow\text{wu}_{F}\triangleright(\_\rightarrow x)^{\uparrow F}\quad.\label{eq:pu-via-wu-def} \end{equation} \end_inset Does this function satisfy the naturality law with respect to an arbitrary -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset ? It does: \begin_inset Formula \begin{align*} \text{expect to equal }x\triangleright f\bef\text{pu}_{F}:\quad & x\triangleright\text{pu}_{F}\bef f^{\uparrow F}\\ -\text{definition of }\text{pu}_{F}:\quad & =\text{wu}_{F}\triangleright(\_\Rightarrow x)^{\uparrow F}\bef f^{\uparrow F}\\ -\text{functor composition law of }F:\quad & =\text{wu}_{F}\triangleright(\left(\_\Rightarrow x\right)\bef f)^{\uparrow F}\\ -\text{compute function composition}:\quad & =\text{wu}_{F}\triangleright(\_\Rightarrow f(x))^{\uparrow F}\\ +\text{definition of }\text{pu}_{F}:\quad & =\text{wu}_{F}\triangleright(\_\rightarrow x)^{\uparrow F}\bef f^{\uparrow F}\\ +\text{functor composition law of }F:\quad & =\text{wu}_{F}\triangleright(\left(\_\rightarrow x\right)\bef f)^{\uparrow F}\\ +\text{compute function composition}:\quad & =\text{wu}_{F}\triangleright(\_\rightarrow f(x))^{\uparrow F}\\ \text{definition of }\text{pu}_{F}:\quad & =\text{pu}_{F}(f(x))\\ \triangleright\text{-notation}:\quad & =x\triangleright f\triangleright\text{pu}_{F}=x\triangleright f\bef\text{pu}_{F}\quad. \end{align*} @@ -19380,8 +19378,8 @@ Applied to the unit value, this new function gives \begin_inset Formula \begin{align*} \triangleright\text{-notation}:\quad & \text{pu}_{F}(1)=1\triangleright\text{pu}_{F}\\ -\text{definition of }\text{pu}_{F}\text{ via }\text{wu}_{F}:\quad & =\text{wu}_{F}\triangleright(\_\Rightarrow1)^{\uparrow F}\\ -\text{the function }(\_\Rightarrow1)\text{ is the identity function }\text{id}^{:\bbnum 1\Rightarrow\bbnum 1}:\quad & =\text{wu}_{F}\triangleright\text{id}^{\uparrow F}\\ +\text{definition of }\text{pu}_{F}\text{ via }\text{wu}_{F}:\quad & =\text{wu}_{F}\triangleright(\_\rightarrow1)^{\uparrow F}\\ +\text{the function }(\_\rightarrow1)\text{ is the identity function }\text{id}^{:\bbnum 1\rightarrow\bbnum 1}:\quad & =\text{wu}_{F}\triangleright\text{id}^{\uparrow F}\\ \text{functor identity law of }F:\quad & =\text{wu}_{F}\triangleright\text{id}=\text{wu}_{F}\quad. \end{align*} @@ -20589,7 +20587,7 @@ contramap \end_inset with a constant function -\begin_inset Formula $A\Rightarrow\bbnum 1$ +\begin_inset Formula $A\rightarrow\bbnum 1$ \end_inset : @@ -20801,11 +20799,11 @@ If \end_inset is a pointed functor, the exponential functor -\begin_inset Formula $L^{A}\triangleq C^{A}\Rightarrow F^{A}$ +\begin_inset Formula $L^{A}\triangleq C^{A}\rightarrow F^{A}$ \end_inset will be pointed if we are able to produce a value -\begin_inset Formula $\text{wu}_{L}:C^{\bbnum 1}\Rightarrow F^{\bbnum 1}$ +\begin_inset Formula $\text{wu}_{L}:C^{\bbnum 1}\rightarrow F^{\bbnum 1}$ \end_inset . @@ -20823,7 +20821,7 @@ If . So, we have to set -\begin_inset Formula $\text{wu}_{L}\triangleq(\_\Rightarrow\text{wu}_{F})$ +\begin_inset Formula $\text{wu}_{L}\triangleq(\_\rightarrow\text{wu}_{F})$ \end_inset . @@ -21263,7 +21261,7 @@ Can we recognize a pointed functor by looking at its type expression, e.g. \begin_inset Formula \[ -F^{A,B}\triangleq\left((\bbnum 1+A\Rightarrow\text{Int})\Rightarrow A\times B\right)+\text{String}\times A\times A\quad? +F^{A,B}\triangleq\left((\bbnum 1+A\rightarrow\text{Int})\rightarrow A\times B\right)+\text{String}\times A\times A\quad? \] \end_inset @@ -21307,7 +21305,7 @@ To answer this question with respect to and obtain the type expression \begin_inset Formula \[ -F^{\bbnum 1,B}=\left((\bbnum 1+\bbnum 1\Rightarrow\text{Int})\Rightarrow\bbnum 1\times B\right)+\text{String}\times\bbnum 1\times\bbnum 1\cong\left(\left(\bbnum 2\Rightarrow\text{Int}\right)\Rightarrow B\right)+\text{String}\quad. +F^{\bbnum 1,B}=\left((\bbnum 1+\bbnum 1\rightarrow\text{Int})\rightarrow\bbnum 1\times B\right)+\text{String}\times\bbnum 1\times\bbnum 1\cong\left(\left(\bbnum 2\rightarrow\text{Int}\right)\rightarrow B\right)+\text{String}\quad. \] \end_inset @@ -21324,7 +21322,7 @@ The functor At the outer level, this type expression is a disjunctive type with two parts; it is sufficient to compute one of the parts. Can we compute a value of type -\begin_inset Formula $\left(\bbnum 2\Rightarrow\text{Int}\right)\Rightarrow B$ +\begin_inset Formula $\left(\bbnum 2\rightarrow\text{Int}\right)\rightarrow B$ \end_inset ? Since the parameter @@ -21336,7 +21334,7 @@ The functor \end_inset using a given value of type -\begin_inset Formula $\bbnum 2\Rightarrow\text{Int}$ +\begin_inset Formula $\bbnum 2\rightarrow\text{Int}$ \end_inset . @@ -21382,7 +21380,7 @@ Considering now the type parameter and obtain \begin_inset Formula \[ -F^{A,\bbnum 1}=\left((\bbnum 1+A\Rightarrow\text{Int})\Rightarrow A\times\bbnum 1\right)+\text{String}\times A\times A\quad. +F^{A,\bbnum 1}=\left((\bbnum 1+A\rightarrow\text{Int})\rightarrow A\times\bbnum 1\right)+\text{String}\times A\times A\quad. \] \end_inset @@ -21402,7 +21400,7 @@ The type from scratch. The function type -\begin_inset Formula $(\bbnum 1+A\Rightarrow\text{Int})\Rightarrow A\times\bbnum 1$ +\begin_inset Formula $(\bbnum 1+A\rightarrow\text{Int})\rightarrow A\times\bbnum 1$ \end_inset cannot be implemented because a value of type @@ -21410,7 +21408,7 @@ The type \end_inset cannot be computed from a function -\begin_inset Formula $\bbnum 1+A\Rightarrow\text{Int}$ +\begin_inset Formula $\bbnum 1+A\rightarrow\text{Int}$ \end_inset that @@ -21587,7 +21585,7 @@ Composition of pointed functors/contrafunctors \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Pointed}^{F^{\bullet}}\times\text{Pointed}^{G^{\bullet}}\Rightarrow\text{Pointed}^{F^{G^{\bullet}}}$ +\begin_inset Formula $\text{Pointed}^{F^{\bullet}}\times\text{Pointed}^{G^{\bullet}}\rightarrow\text{Pointed}^{F^{G^{\bullet}}}$ \end_inset @@ -21633,7 +21631,7 @@ Product of pointed functors \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Pointed}^{F^{\bullet}}\times\text{Pointed}^{G^{\bullet}}\Rightarrow\text{Pointed}^{F^{\bullet}\times G^{\bullet}}$ +\begin_inset Formula $\text{Pointed}^{F^{\bullet}}\times\text{Pointed}^{G^{\bullet}}\rightarrow\text{Pointed}^{F^{\bullet}\times G^{\bullet}}$ \end_inset @@ -21679,7 +21677,7 @@ Co-product of a pointed functor \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Pointed}^{F^{\bullet}}\times\text{Functor}^{G^{\bullet}}\Rightarrow\text{Pointed}^{F^{\bullet}+G^{\bullet}}$ +\begin_inset Formula $\text{Pointed}^{F^{\bullet}}\times\text{Functor}^{G^{\bullet}}\rightarrow\text{Pointed}^{F^{\bullet}+G^{\bullet}}$ \end_inset @@ -21725,7 +21723,7 @@ Function from any \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Pointed}^{F^{\bullet}}\times\text{Contrafunctor}^{C^{\bullet}}\Rightarrow\text{Pointed}^{C^{\bullet}\Rightarrow F^{\bullet}}$ +\begin_inset Formula $\text{Pointed}^{F^{\bullet}}\times\text{Contrafunctor}^{C^{\bullet}}\rightarrow\text{Pointed}^{C^{\bullet}\rightarrow F^{\bullet}}$ \end_inset @@ -21763,7 +21761,7 @@ Recursive types \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Pointed}^{F^{\bullet}}\Rightarrow\text{Pointed}^{S^{\bullet,F^{\bullet}}}$ +\begin_inset Formula $\text{Pointed}^{F^{\bullet}}\rightarrow\text{Pointed}^{S^{\bullet,F^{\bullet}}}$ \end_inset where @@ -21907,7 +21905,7 @@ def extract[F[_], A]: F[A] => A \begin_inset Formula \[ -\text{ex}:\forall A.\,F^{A}\Rightarrow A\quad. +\text{ex}:\forall A.\,F^{A}\rightarrow A\quad. \] \end_inset @@ -22131,7 +22129,7 @@ noprefix "false" \end_inset ) are functions of type -\begin_inset Formula $F^{A}\Rightarrow B$ +\begin_inset Formula $F^{A}\rightarrow B$ \end_inset . @@ -22200,11 +22198,11 @@ extract \end_inset and -\begin_inset Formula $f^{:\bbnum 1\Rightarrow B}\triangleq(1\Rightarrow b)$ +\begin_inset Formula $f^{:\bbnum 1\rightarrow B}\triangleq(1\rightarrow b)$ \end_inset in the naturality law, both sides will become functions of type -\begin_inset Formula $F^{\bbnum 1}\Rightarrow B$ +\begin_inset Formula $F^{\bbnum 1}\rightarrow B$ \end_inset . @@ -22341,7 +22339,7 @@ A constant functor not \emph default co-pointed because we cannot implement -\begin_inset Formula $\forall A.\,Z\Rightarrow A$ +\begin_inset Formula $\forall A.\,Z\rightarrow A$ \end_inset (a value of an arbitrary type @@ -22365,7 +22363,7 @@ The identity functor \end_inset is co-pointed with -\begin_inset Formula $\text{ex}\triangleq\text{id}^{:A\Rightarrow A}$ +\begin_inset Formula $\text{ex}\triangleq\text{id}^{:A\rightarrow A}$ \end_inset . @@ -22402,7 +22400,7 @@ Composition of two co-pointed functors is co-pointed: \begin_inset Formula \[ -\text{ex}_{F\circ G}\triangleq h^{:F^{G^{A}}}\Rightarrow\text{ex}_{G}(\text{ex}_{F}(h))\quad\text{ or equivalently }\quad\text{ex}_{F\circ G}=\text{ex}_{F}\bef\text{ex}_{G}\quad. +\text{ex}_{F\circ G}\triangleq h^{:F^{G^{A}}}\rightarrow\text{ex}_{G}(\text{ex}_{F}(h))\quad\text{ or equivalently }\quad\text{ex}_{F\circ G}=\text{ex}_{F}\bef\text{ex}_{G}\quad. \] \end_inset @@ -22467,7 +22465,7 @@ If functors \end_inset are co-pointed, we can implement a function of type -\begin_inset Formula $F^{A}\times G^{A}\Rightarrow A$ +\begin_inset Formula $F^{A}\times G^{A}\rightarrow A$ \end_inset in two different ways: by discarding @@ -22507,13 +22505,13 @@ extract method will be \begin_inset Formula \[ -\text{ex}_{F\times G}\triangleq f^{:F^{A}}\times g^{:G^{A}}\Rightarrow\text{ex}_{F}(f)=\nabla_{1}\bef\text{ex}_{F}\quad, +\text{ex}_{F\times G}\triangleq f^{:F^{A}}\times g^{:G^{A}}\rightarrow\text{ex}_{F}(f)=\nabla_{1}\bef\text{ex}_{F}\quad, \] \end_inset where we used the pair projection function -\begin_inset Formula $\nabla_{1}\triangleq(a\times b\Rightarrow a)$ +\begin_inset Formula $\nabla_{1}\triangleq(a\times b\rightarrow a)$ \end_inset . @@ -22610,7 +22608,7 @@ For co-pointed functors \end_inset , there is only one possible implementation of the type signature -\begin_inset Formula $\text{ex}_{F+G}:F^{A}+G^{A}\Rightarrow A$ +\begin_inset Formula $\text{ex}_{F+G}:F^{A}+G^{A}\rightarrow A$ \end_inset , given that we have functions @@ -22758,7 +22756,7 @@ Functions \begin_layout Standard An exponential functor of the form -\begin_inset Formula $L^{A}\triangleq C^{A}\Rightarrow P^{A}$ +\begin_inset Formula $L^{A}\triangleq C^{A}\rightarrow P^{A}$ \end_inset (where @@ -22771,13 +22769,13 @@ An exponential functor of the form is a functor) will be co-pointed if we can implement a function of type -\begin_inset Formula $\forall A.\,(C^{A}\Rightarrow P^{A})\Rightarrow A$ +\begin_inset Formula $\forall A.\,(C^{A}\rightarrow P^{A})\rightarrow A$ \end_inset , \begin_inset Formula \[ -\text{ex}_{L}\triangleq h^{:C^{A}\Rightarrow P^{A}}\Rightarrow\text{???}^{:A}\quad. +\text{ex}_{L}\triangleq h^{:C^{A}\rightarrow P^{A}}\rightarrow\text{???}^{:A}\quad. \] \end_inset @@ -22894,20 +22892,20 @@ cpure \end_inset is co-pointed and use its method -\begin_inset Formula $\text{ex}_{P}:P^{A}\Rightarrow A$ +\begin_inset Formula $\text{ex}_{P}:P^{A}\rightarrow A$ \end_inset . Finally we have \begin_inset Formula \begin{equation} -\text{ex}_{L}\triangleq h^{:C^{A}\Rightarrow P^{A}}\Rightarrow\text{ex}_{P}(h(\text{pu}_{C}))\quad\quad\text{ or equivalently}\quad\quad h^{:C^{A}\Rightarrow P^{A}}\triangleright\text{ex}_{L}=\text{pu}_{C}\triangleright h\triangleright\text{ex}_{P}\quad.\label{eq:def-of-ex-for-C-mapsto-P} +\text{ex}_{L}\triangleq h^{:C^{A}\rightarrow P^{A}}\rightarrow\text{ex}_{P}(h(\text{pu}_{C}))\quad\quad\text{ or equivalently}\quad\quad h^{:C^{A}\rightarrow P^{A}}\triangleright\text{ex}_{L}=\text{pu}_{C}\triangleright h\triangleright\text{ex}_{P}\quad.\label{eq:def-of-ex-for-C-mapsto-P} \end{equation} \end_inset To verify the naturality law, we apply both sides to an arbitrary -\begin_inset Formula $h^{:C^{A}\Rightarrow P^{A}}$ +\begin_inset Formula $h^{:C^{A}\rightarrow P^{A}}$ \end_inset and compute @@ -23069,7 +23067,7 @@ noprefix "false" \end_inset is co-pointed if a method -\begin_inset Formula $\text{ex}_{F}:(F^{A}\Rightarrow A)\cong(S^{A,F^{A}}\Rightarrow A)$ +\begin_inset Formula $\text{ex}_{F}:(F^{A}\rightarrow A)\cong(S^{A,F^{A}}\rightarrow A)$ \end_inset can be defined. @@ -23086,7 +23084,7 @@ noprefix "false" \end_inset , we may assume (by induction) that an extractor function -\begin_inset Formula $F^{A}\Rightarrow A$ +\begin_inset Formula $F^{A}\rightarrow A$ \end_inset is already available when applied to the recursively used @@ -23111,7 +23109,7 @@ bimap \end_inset to map -\begin_inset Formula $S^{A,F^{A}}\Rightarrow S^{A,A}$ +\begin_inset Formula $S^{A,F^{A}}\rightarrow S^{A,A}$ \end_inset . @@ -23143,7 +23141,7 @@ co-pointed bifunctor \end_inset if a fully parametric function -\begin_inset Formula $\text{ex}_{S}:S^{A,A}\Rightarrow A$ +\begin_inset Formula $\text{ex}_{S}:S^{A,A}\rightarrow A$ \end_inset exists satisfying the corresponding naturality law @@ -23165,7 +23163,7 @@ Assuming that by recursion, \begin_inset Formula \[ -\text{ex}_{F}\triangleq s^{:S^{A,F^{A}}}\Rightarrow s\triangleright\big(\text{bimap}_{S}(\text{id})(\text{ex}_{F})\big)\triangleright\text{ex}_{S}\quad\text{ or equivalently}\quad\text{ex}_{F}\triangleq\text{bimap}_{S}(\text{id})(\text{ex}_{F})\bef\text{ex}_{S}\quad. +\text{ex}_{F}\triangleq s^{:S^{A,F^{A}}}\rightarrow s\triangleright\big(\text{bimap}_{S}(\text{id})(\text{ex}_{F})\big)\triangleright\text{ex}_{S}\quad\text{ or equivalently}\quad\text{ex}_{F}\triangleq\text{bimap}_{S}(\text{id})(\text{ex}_{F})\bef\text{ex}_{S}\quad. \] \end_inset @@ -23210,7 +23208,7 @@ The bifunctor \end_inset is co-pointed because there exists a suitable function -\begin_inset Formula $\text{ex}_{S}:S^{A,A}\Rightarrow A$ +\begin_inset Formula $\text{ex}_{S}:S^{A,A}\rightarrow A$ \end_inset . @@ -23406,7 +23404,7 @@ Can we recognize a co-pointed functor by looking at its type expression, e.g. \begin_inset Formula \[ -F^{A,B}\triangleq\left(\left(\bbnum 1+A\Rightarrow\text{Int}\right)\Rightarrow A\times B\right)+\text{String}\times A\times A\quad? +F^{A,B}\triangleq\left(\left(\bbnum 1+A\rightarrow\text{Int}\right)\rightarrow A\times B\right)+\text{String}\times A\times A\quad? \] \end_inset @@ -23453,12 +23451,12 @@ It remains to consider \end_inset is co-pointed, but we still need to check -\begin_inset Formula $\left(\bbnum 1+A\Rightarrow\text{Int}\right)\Rightarrow A\times B$ +\begin_inset Formula $\left(\bbnum 1+A\rightarrow\text{Int}\right)\rightarrow A\times B$ \end_inset , which is a function type. The function construction requires -\begin_inset Formula $\bbnum 1+A\Rightarrow\text{Int}$ +\begin_inset Formula $\bbnum 1+A\rightarrow\text{Int}$ \end_inset to be a pointed contrafunctor and @@ -23479,12 +23477,12 @@ It remains to consider \end_inset since we have -\begin_inset Formula $\nabla_{1}:A\times B\Rightarrow A$ +\begin_inset Formula $\nabla_{1}:A\times B\rightarrow A$ \end_inset . It remains to check that the contrafunctor -\begin_inset Formula $C^{A}\triangleq\bbnum 1+A\Rightarrow\text{Int}$ +\begin_inset Formula $C^{A}\triangleq\bbnum 1+A\rightarrow\text{Int}$ \end_inset is pointed. @@ -23511,7 +23509,7 @@ noprefix "false" \end_inset ); this requires us to compute a value of type -\begin_inset Formula $\bbnum 1+\bbnum 1\Rightarrow\text{Int}$ +\begin_inset Formula $\bbnum 1+\bbnum 1\rightarrow\text{Int}$ \end_inset . @@ -23621,7 +23619,7 @@ Identity functor \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{id}:A\Rightarrow A$ +\begin_inset Formula $\text{id}:A\rightarrow A$ \end_inset @@ -23659,7 +23657,7 @@ Composition of co-pointed functors \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Copointed}^{F^{\bullet}}\times\text{Copointed}^{G^{\bullet}}\Rightarrow\text{Copointed}^{F^{G^{\bullet}}}$ +\begin_inset Formula $\text{Copointed}^{F^{\bullet}}\times\text{Copointed}^{G^{\bullet}}\rightarrow\text{Copointed}^{F^{G^{\bullet}}}$ \end_inset @@ -23705,7 +23703,7 @@ Product of co-pointed functor \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Copointed}^{F^{\bullet}}\times\text{Functor}^{G^{\bullet}}\Rightarrow\text{Copointed}^{F^{\bullet}\times G^{\bullet}}$ +\begin_inset Formula $\text{Copointed}^{F^{\bullet}}\times\text{Functor}^{G^{\bullet}}\rightarrow\text{Copointed}^{F^{\bullet}\times G^{\bullet}}$ \end_inset @@ -23751,7 +23749,7 @@ Co-product of co-pointed functors \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Copointed}^{F^{\bullet}}\times\text{Copointed}^{G^{\bullet}}\Rightarrow\text{Copointed}^{F^{\bullet}+G^{\bullet}}$ +\begin_inset Formula $\text{Copointed}^{F^{\bullet}}\times\text{Copointed}^{G^{\bullet}}\rightarrow\text{Copointed}^{F^{\bullet}+G^{\bullet}}$ \end_inset @@ -23797,7 +23795,7 @@ Function from pointed \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{\text{Pointed}^{C^{\bullet}}}\times\text{Copointed}^{F^{\bullet}}\Rightarrow\text{Copointed}^{C^{\bullet}\Rightarrow F^{\bullet}}$ +\begin_inset Formula $\text{\text{Pointed}^{C^{\bullet}}}\times\text{Copointed}^{F^{\bullet}}\rightarrow\text{Copointed}^{C^{\bullet}\rightarrow F^{\bullet}}$ \end_inset @@ -23835,7 +23833,7 @@ Recursive types \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Copointed}^{F^{\bullet}}\Rightarrow\text{Copointed}^{S^{\bullet,F^{\bullet}}}$ +\begin_inset Formula $\text{Copointed}^{F^{\bullet}}\rightarrow\text{Copointed}^{S^{\bullet,F^{\bullet}}}$ \end_inset where @@ -23937,13 +23935,13 @@ pointed . We also needed to assume that the naturality law holds for all functions -\begin_inset Formula $f^{:A\Rightarrow B}$ +\begin_inset Formula $f^{:A\rightarrow B}$ \end_inset , \begin_inset Formula \begin{equation} -\text{pu}_{C}\triangleright f^{\downarrow C}=\text{pu}_{C}\quad\text{ or equivalently }\quad\text{cmap}_{C}(f^{:A\Rightarrow B})(\text{pu}_{C}^{:C^{B}})=\text{pu}_{C}^{:C^{A}}\quad.\label{eq:naturality-law-for-pure-for-contrafunctors} +\text{pu}_{C}\triangleright f^{\downarrow C}=\text{pu}_{C}\quad\text{ or equivalently }\quad\text{cmap}_{C}(f^{:A\rightarrow B})(\text{pu}_{C}^{:C^{B}})=\text{pu}_{C}^{:C^{A}}\quad.\label{eq:naturality-law-for-pure-for-contrafunctors} \end{equation} \end_inset @@ -23998,7 +23996,7 @@ noprefix "false" ) then gives \begin_inset Formula \begin{equation} -\text{pu}_{C}^{A}=\text{wu}_{C}\triangleright(\_^{:A}\Rightarrow1)^{\downarrow C}\quad.\label{eq:def-pure-via-wu-for-contrafunctor} +\text{pu}_{C}^{A}=\text{wu}_{C}\triangleright(\_^{:A}\rightarrow1)^{\downarrow C}\quad.\label{eq:def-pure-via-wu-for-contrafunctor} \end{equation} \end_inset @@ -24067,9 +24065,9 @@ noprefix "false" \begin_inset Formula \begin{align*} \text{expect to equal }\text{pu}_{C}^{A}:\quad & \text{pu}_{C}^{B}\triangleright f^{\downarrow C}\\ -\text{use definition~(\ref{eq:def-pure-via-wu-for-contrafunctor})}:\quad & =\text{wu}_{C}\triangleright\gunderline{(\_^{:B}\Rightarrow1)^{\downarrow C}\triangleright f^{\downarrow C}}\\ -\text{composition law for contrafunctor }C:\quad & =\text{wu}_{C}\triangleright(\gunderline{f\bef(\_^{:B}\Rightarrow1)})^{\downarrow C}\\ -\text{compute function composition}:\quad & =\text{wu}_{C}\triangleright(\_^{:A}\Rightarrow1)^{\downarrow C}=\text{pu}_{C}^{A}\quad. +\text{use definition~(\ref{eq:def-pure-via-wu-for-contrafunctor})}:\quad & =\text{wu}_{C}\triangleright\gunderline{(\_^{:B}\rightarrow1)^{\downarrow C}\triangleright f^{\downarrow C}}\\ +\text{composition law for contrafunctor }C:\quad & =\text{wu}_{C}\triangleright(\gunderline{f\bef(\_^{:B}\rightarrow1)})^{\downarrow C}\\ +\text{compute function composition}:\quad & =\text{wu}_{C}\triangleright(\_^{:A}\rightarrow1)^{\downarrow C}=\text{pu}_{C}^{A}\quad. \end{align*} \end_inset @@ -24443,7 +24441,7 @@ Functions \begin_layout Standard The exponential contrafunctor construction is -\begin_inset Formula $L^{A}\triangleq F^{A}\Rightarrow C^{A}$ +\begin_inset Formula $L^{A}\triangleq F^{A}\rightarrow C^{A}$ \end_inset , where @@ -24460,7 +24458,7 @@ The exponential contrafunctor construction is \end_inset means to create a function of type -\begin_inset Formula $F^{\bbnum 1}\Rightarrow C^{\bbnum 1}$ +\begin_inset Formula $F^{\bbnum 1}\rightarrow C^{\bbnum 1}$ \end_inset . @@ -24482,7 +24480,7 @@ The exponential contrafunctor construction is \end_inset must be a constant function -\begin_inset Formula $(\_^{:F^{\bbnum 1}}\Rightarrow\text{wu}_{C})$ +\begin_inset Formula $(\_^{:F^{\bbnum 1}}\rightarrow\text{wu}_{C})$ \end_inset , where we assumed that a value @@ -24491,7 +24489,7 @@ The exponential contrafunctor construction is is available. Thus, -\begin_inset Formula $F^{A}\Rightarrow C^{A}$ +\begin_inset Formula $F^{A}\rightarrow C^{A}$ \end_inset is pointed when @@ -24588,7 +24586,7 @@ Can we recognize a pointed contrafunctor by looking at its type expression, e.g. \begin_inset Formula \[ -C^{A,B}\triangleq\left(\bbnum 1+A\Rightarrow B\right)+(\text{String}\times A\times B\Rightarrow\text{String})\text{ with respect to type parameter }A? +C^{A,B}\triangleq\left(\bbnum 1+A\rightarrow B\right)+(\text{String}\times A\times B\rightarrow\text{String})\text{ with respect to type parameter }A? \] \end_inset @@ -24603,12 +24601,12 @@ We need to set . In this example, -\begin_inset Formula $C^{\bbnum 1,B}=\left(\bbnum 1+\bbnum 1\Rightarrow B\right)+(\text{String}\times\bbnum 1\times B\Rightarrow\text{String})$ +\begin_inset Formula $C^{\bbnum 1,B}=\left(\bbnum 1+\bbnum 1\rightarrow B\right)+(\text{String}\times\bbnum 1\times B\rightarrow\text{String})$ \end_inset . A value of this type is -\begin_inset Formula $\text{wu}_{C}\triangleq\bbnum 0+(s^{:\text{String}}\times1\times b^{:B}\Rightarrow s)$ +\begin_inset Formula $\text{wu}_{C}\triangleq\bbnum 0+(s^{:\text{String}}\times1\times b^{:B}\rightarrow s)$ \end_inset . @@ -24739,7 +24737,7 @@ Composition of pointed functors/contrafunctors \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Pointed}^{F^{\bullet}}\times\text{Pointed}^{G^{\bullet}}\Rightarrow\text{Pointed}^{F^{G^{\bullet}}}$ +\begin_inset Formula $\text{Pointed}^{F^{\bullet}}\times\text{Pointed}^{G^{\bullet}}\rightarrow\text{Pointed}^{F^{G^{\bullet}}}$ \end_inset @@ -24785,7 +24783,7 @@ Product of pointed contrafunctors \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Pointed}^{F^{\bullet}}\times\text{Pointed}^{G^{\bullet}}\Rightarrow\text{Pointed}^{F^{\bullet}\times G^{\bullet}}$ +\begin_inset Formula $\text{Pointed}^{F^{\bullet}}\times\text{Pointed}^{G^{\bullet}}\rightarrow\text{Pointed}^{F^{\bullet}\times G^{\bullet}}$ \end_inset @@ -24831,7 +24829,7 @@ Co-product of a pointed \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Pointed}^{F^{\bullet}}\times\text{Contrafunctor}^{G^{\bullet}}\Rightarrow\text{Pointed}^{F^{\bullet}+G^{\bullet}}$ +\begin_inset Formula $\text{Pointed}^{F^{\bullet}}\times\text{Contrafunctor}^{G^{\bullet}}\rightarrow\text{Pointed}^{F^{\bullet}+G^{\bullet}}$ \end_inset @@ -24877,7 +24875,7 @@ Function from a functor \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Pointed}^{C^{\bullet}}\times\text{Functor}^{F^{\bullet}}\Rightarrow\text{Pointed}^{F^{\bullet}\Rightarrow C^{\bullet}}$ +\begin_inset Formula $\text{Pointed}^{C^{\bullet}}\times\text{Functor}^{F^{\bullet}}\rightarrow\text{Pointed}^{F^{\bullet}\rightarrow C^{\bullet}}$ \end_inset @@ -24915,7 +24913,7 @@ Recursive types \begin_layout Plain Layout \size footnotesize -\begin_inset Formula $\text{Pointed}^{C^{\bullet}}\Rightarrow\text{Pointed}^{S^{\bullet,C^{\bullet}}}$ +\begin_inset Formula $\text{Pointed}^{C^{\bullet}}\rightarrow\text{Pointed}^{S^{\bullet,C^{\bullet}}}$ \end_inset where @@ -25796,7 +25794,7 @@ Monoid \end_inset instance for the type -\begin_inset Formula $\bbnum 1+(\text{String}\Rightarrow\text{String})$ +\begin_inset Formula $\bbnum 1+(\text{String}\rightarrow\text{String})$ \end_inset . @@ -25823,13 +25821,13 @@ noprefix "false" ) that build up the given type expression from simpler parts. Since the type expression -\begin_inset Formula $\bbnum 1+(\text{String}\Rightarrow\text{String})$ +\begin_inset Formula $\bbnum 1+(\text{String}\rightarrow\text{String})$ \end_inset is a co-product at the outer level, we must start with the co-product construct ion, which requires us to choose one of the parts of the disjunction, say -\begin_inset Formula $\text{String}\Rightarrow\text{String}$ +\begin_inset Formula $\text{String}\rightarrow\text{String}$ \end_inset , as the @@ -25858,7 +25856,7 @@ Monoid \end_inset and for -\begin_inset Formula $\text{String}\Rightarrow\text{String}$ +\begin_inset Formula $\text{String}\rightarrow\text{String}$ \end_inset . @@ -25887,13 +25885,13 @@ Monoid \end_inset instance, there are several for -\begin_inset Formula $\text{String}\Rightarrow\text{String}$ +\begin_inset Formula $\text{String}\rightarrow\text{String}$ \end_inset . The function-type construction gives two possible monoid instances: the monoid -\begin_inset Formula $R\Rightarrow A$ +\begin_inset Formula $R\rightarrow A$ \end_inset with @@ -26828,7 +26826,7 @@ Route \end_inset as -\begin_inset Formula $\text{Route}\triangleq P\Rightarrow\bbnum 1+R$ +\begin_inset Formula $\text{Route}\triangleq P\rightarrow\bbnum 1+R$ \end_inset . @@ -27697,7 +27695,7 @@ Contrafunctor \end_inset instance for the type constructor -\begin_inset Formula $C^{A}\triangleq A\Rightarrow\text{Int}$ +\begin_inset Formula $C^{A}\triangleq A\rightarrow\text{Int}$ \end_inset . @@ -27712,7 +27710,7 @@ Since the typeclass method has type parameters, the instance value will have type \begin_inset Formula \[ -\text{contramap}:\forall(A,B).\,C^{A}\Rightarrow(B\Rightarrow A)\Rightarrow C^{B}\quad. +\text{contramap}:\forall(A,B).\,C^{A}\rightarrow(B\rightarrow A)\rightarrow C^{B}\quad. \] \end_inset @@ -27743,7 +27741,7 @@ trait Contrafunctor[C[_]] { def contramap[A, B](c: C[A])(f: B => A): C[B] \end_inset A typeclass instance for the type constructor -\begin_inset Formula $C^{A}\triangleq A\Rightarrow\text{Int}$ +\begin_inset Formula $C^{A}\triangleq A\rightarrow\text{Int}$ \end_inset is created by @@ -27843,7 +27841,7 @@ Functor \end_inset instance for recursive type constructor -\begin_inset Formula $Q^{A}\triangleq\left(\text{Int}\Rightarrow A\right)+\text{Int}+Q^{A}$ +\begin_inset Formula $Q^{A}\triangleq\left(\text{Int}\rightarrow A\right)+\text{Int}+Q^{A}$ \end_inset . @@ -28294,7 +28292,7 @@ noprefix "false" (a) \series default Implement a function with type signature -\begin_inset Formula $C^{A}+C^{B}\Rightarrow C^{A\times B}$ +\begin_inset Formula $C^{A}+C^{B}\rightarrow C^{A\times B}$ \end_inset parameterized by a type constructor @@ -28311,7 +28309,7 @@ noprefix "false" . Show that the inverse type signature -\begin_inset Formula $C^{A\times B}\Rightarrow C^{A}+C^{B}$ +\begin_inset Formula $C^{A\times B}\rightarrow C^{A}+C^{B}$ \end_inset is not implementable for some contrafunctors @@ -28327,7 +28325,7 @@ noprefix "false" (b) \series default Implement a function with type signature -\begin_inset Formula $F^{A\times B}\Rightarrow F^{A}\times F^{B}$ +\begin_inset Formula $F^{A\times B}\rightarrow F^{A}\times F^{B}$ \end_inset parameterized by a type constructor @@ -28344,7 +28342,7 @@ noprefix "false" . Show that the inverse type signature -\begin_inset Formula $F^{A}\times F^{B}\Rightarrow F^{A\times B}$ +\begin_inset Formula $F^{A}\times F^{B}\rightarrow F^{A\times B}$ \end_inset is not implementable for some functors @@ -28366,7 +28364,7 @@ Solution We need to implement a function with type signature \begin_inset Formula \[ -\forall(A,B).\,C^{A}+C^{B}\Rightarrow C^{A\times B}\quad. +\forall(A,B).\,C^{A}+C^{B}\rightarrow C^{A\times B}\quad. \] \end_inset @@ -28405,11 +28403,11 @@ Begin by looking at the types involved. \end_inset of types -\begin_inset Formula $A\times B\Rightarrow A$ +\begin_inset Formula $A\times B\rightarrow A$ \end_inset and -\begin_inset Formula $A\times B\Rightarrow B$ +\begin_inset Formula $A\times B\rightarrow B$ \end_inset . @@ -28418,11 +28416,11 @@ Begin by looking at the types involved. \end_inset , we will get -\begin_inset Formula $\nabla_{1}^{\downarrow C}:C^{A}\Rightarrow C^{A\times B}$ +\begin_inset Formula $\nabla_{1}^{\downarrow C}:C^{A}\rightarrow C^{A\times B}$ \end_inset and -\begin_inset Formula $\nabla_{2}^{\downarrow C}:C^{B}\Rightarrow C^{A\times B}$ +\begin_inset Formula $\nabla_{2}^{\downarrow C}:C^{B}\rightarrow C^{A\times B}$ \end_inset . @@ -28509,7 +28507,7 @@ The code notation for this function is \begin_inset Formula \[ -f^{:C^{A}+C^{B}\Rightarrow C^{A\times B}}\triangleq\begin{array}{|c||c|} +f^{:C^{A}+C^{B}\rightarrow C^{A\times B}}\triangleq\begin{array}{|c||c|} & C^{A\times B}\\ \hline C^{A} & \nabla_{1}^{\downarrow C}\\ C^{B} & \nabla_{2}^{\downarrow C} @@ -28533,13 +28531,13 @@ To show that it is not possible to implement a function with the inverse type signature, \begin_inset Formula \[ -g:\forall(A,B).\,C^{A\times B}\Rightarrow C^{A}+C^{B}\quad, +g:\forall(A,B).\,C^{A\times B}\rightarrow C^{A}+C^{B}\quad, \] \end_inset we choose the contrafunctor -\begin_inset Formula $C^{A}\triangleq A\Rightarrow R$ +\begin_inset Formula $C^{A}\triangleq A\rightarrow R$ \end_inset , where @@ -28550,33 +28548,33 @@ we choose the contrafunctor The type signature becomes \begin_inset Formula \[ -g:\forall(A,B).\,(A\times B\Rightarrow R)\Rightarrow(A\Rightarrow R)+(B\Rightarrow R)\quad. +g:\forall(A,B).\,(A\times B\rightarrow R)\rightarrow(A\rightarrow R)+(B\rightarrow R)\quad. \] \end_inset To implement this function, we need to decide whether to return values of type -\begin_inset Formula $A\Rightarrow R$ +\begin_inset Formula $A\rightarrow R$ \end_inset or -\begin_inset Formula $B\Rightarrow R$ +\begin_inset Formula $B\rightarrow R$ \end_inset . Can we compute a value of type -\begin_inset Formula $A\Rightarrow R$ +\begin_inset Formula $A\rightarrow R$ \end_inset given a value of type -\begin_inset Formula $A\times B\Rightarrow R$ +\begin_inset Formula $A\times B\rightarrow R$ \end_inset ? \begin_inset Formula \[ -g^{:(A\times B\Rightarrow R)\Rightarrow A\Rightarrow R}\triangleq q^{:A\times B\Rightarrow R}\Rightarrow a^{:A}\Rightarrow\text{???}^{:R} +g^{:(A\times B\rightarrow R)\rightarrow A\rightarrow R}\triangleq q^{:A\times B\rightarrow R}\rightarrow a^{:A}\rightarrow\text{???}^{:R} \] \end_inset @@ -28608,20 +28606,20 @@ We cannot compute a value of type \begin_layout Standard Similarly, we are not able to compute a value of type -\begin_inset Formula $B\Rightarrow R$ +\begin_inset Formula $B\rightarrow R$ \end_inset from a value of type -\begin_inset Formula $A\times B\Rightarrow R$ +\begin_inset Formula $A\times B\rightarrow R$ \end_inset . Whatever choice we make, -\begin_inset Formula $A\Rightarrow R$ +\begin_inset Formula $A\rightarrow R$ \end_inset or -\begin_inset Formula $B\Rightarrow R$ +\begin_inset Formula $B\rightarrow R$ \end_inset , we cannot implement the required type signature. @@ -28635,7 +28633,7 @@ Similarly, we are not able to compute a value of type We need to implement a function with type signature \begin_inset Formula \[ -\forall(A,B).\,F^{A\times B}\Rightarrow F^{A}\times F^{B}\quad. +\forall(A,B).\,F^{A\times B}\rightarrow F^{A}\times F^{B}\quad. \] \end_inset @@ -28653,11 +28651,11 @@ The types \end_inset are related by the functions -\begin_inset Formula $\nabla_{1}:A\times B\Rightarrow A$ +\begin_inset Formula $\nabla_{1}:A\times B\rightarrow A$ \end_inset and -\begin_inset Formula $\nabla_{2}:A\times B\Rightarrow B$ +\begin_inset Formula $\nabla_{2}:A\times B\rightarrow B$ \end_inset . @@ -28666,18 +28664,18 @@ The types \end_inset , we obtain -\begin_inset Formula $\nabla_{1}^{\uparrow F}:F^{A\times B}\Rightarrow F^{A}$ +\begin_inset Formula $\nabla_{1}^{\uparrow F}:F^{A\times B}\rightarrow F^{A}$ \end_inset and -\begin_inset Formula $\nabla_{2}^{\uparrow F}:F^{A\times B}\Rightarrow F^{B}$ +\begin_inset Formula $\nabla_{2}^{\uparrow F}:F^{A\times B}\rightarrow F^{B}$ \end_inset . It remains to take the product of the resulting values: \begin_inset Formula \[ -f^{:F^{A\times B}\Rightarrow F^{A}\times F^{B}}\triangleq p^{:F^{A\times B}}\Rightarrow(p\triangleright\nabla_{1}^{\uparrow F})\times(p\triangleright\nabla_{2}^{\uparrow F})\quad. +f^{:F^{A\times B}\rightarrow F^{A}\times F^{B}}\triangleq p^{:F^{A\times B}}\rightarrow(p\triangleright\nabla_{1}^{\uparrow F})\times(p\triangleright\nabla_{2}^{\uparrow F})\quad. \] \end_inset @@ -28713,7 +28711,7 @@ diagonal \end_inset function -\begin_inset Formula $\Delta\triangleq(q^{:Q}\Rightarrow q\times q)$ +\begin_inset Formula $\Delta\triangleq(q^{:Q}\rightarrow q\times q)$ \end_inset and the function product @@ -28723,7 +28721,7 @@ diagonal is \begin_inset Formula \[ -f^{:F^{A\times B}\Rightarrow F^{A}\times F^{B}}\triangleq\Delta\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\quad. +f^{:F^{A\times B}\rightarrow F^{A}\times F^{B}}\triangleq\Delta\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\quad. \] \end_inset @@ -28740,7 +28738,7 @@ If we try implementing a function with the inverse type signature, \begin_inset Formula \begin{equation} -g:\forall(A,B).\,F^{A}\times F^{B}\Rightarrow F^{A\times B}\quad,\label{eq:type-signature-of-g-zip} +g:\forall(A,B).\,F^{A}\times F^{B}\rightarrow F^{A\times B}\quad,\label{eq:type-signature-of-g-zip} \end{equation} \end_inset @@ -28762,7 +28760,7 @@ can \end_inset , and -\begin_inset Formula $F^{A}\triangleq P\Rightarrow A$ +\begin_inset Formula $F^{A}\triangleq P\rightarrow A$ \end_inset . @@ -28791,7 +28789,7 @@ noprefix "false" ) and trying various combinations, we eventually find a suitable functor: -\begin_inset Formula $F^{A}\triangleq(P\Rightarrow A)+(Q\Rightarrow A)$ +\begin_inset Formula $F^{A}\triangleq(P\rightarrow A)+(Q\rightarrow A)$ \end_inset . @@ -28802,7 +28800,7 @@ noprefix "false" becomes \begin_inset Formula \[ -g:\forall(A,B).\,\left((P\Rightarrow A)+(Q\Rightarrow A)\right)\times\left((P\Rightarrow B)+(Q\Rightarrow B)\right)\Rightarrow(P\Rightarrow A\times B)+(Q\Rightarrow A\times B)\quad. +g:\forall(A,B).\,\left((P\rightarrow A)+(Q\rightarrow A)\right)\times\left((P\rightarrow B)+(Q\rightarrow B)\right)\rightarrow(P\rightarrow A\times B)+(Q\rightarrow A\times B)\quad. \] \end_inset @@ -28810,7 +28808,7 @@ g:\forall(A,B).\,\left((P\Rightarrow A)+(Q\Rightarrow A)\right)\times\left((P\Ri The argument of this function is of type \begin_inset Formula \[ -\left((P\Rightarrow A)+(Q\Rightarrow A)\right)\times\left((P\Rightarrow B)+(Q\Rightarrow B)\right)\quad, +\left((P\rightarrow A)+(Q\rightarrow A)\right)\times\left((P\rightarrow B)+(Q\rightarrow B)\right)\quad, \] \end_inset @@ -28818,7 +28816,7 @@ The argument of this function is of type which can be transformed equivalently into a disjunction of four cases, \begin_inset Formula \[ -(P\Rightarrow A)\times(P\Rightarrow B)+(P\Rightarrow A)\times(Q\Rightarrow B)+(Q\Rightarrow A)\times(P\Rightarrow B)+(Q\Rightarrow A)\times(Q\Rightarrow B)\quad. +(P\rightarrow A)\times(P\rightarrow B)+(P\rightarrow A)\times(Q\rightarrow B)+(Q\rightarrow A)\times(P\rightarrow B)+(Q\rightarrow A)\times(Q\rightarrow B)\quad. \] \end_inset @@ -28829,28 +28827,28 @@ Implementing the function requires, in particular, to handle the case when we are given values of types -\begin_inset Formula $P\Rightarrow A$ +\begin_inset Formula $P\rightarrow A$ \end_inset and -\begin_inset Formula $Q\Rightarrow B$ +\begin_inset Formula $Q\rightarrow B$ \end_inset , and we are required to produce a value of type -\begin_inset Formula $(P\Rightarrow A\times B)+(Q\Rightarrow A\times B)$ +\begin_inset Formula $(P\rightarrow A\times B)+(Q\rightarrow A\times B)$ \end_inset . The resulting type signature \begin_inset Formula \[ -(P\Rightarrow A)\times(Q\Rightarrow B)\Rightarrow(P\Rightarrow A\times B)+(Q\Rightarrow A\times B) +(P\rightarrow A)\times(Q\rightarrow B)\rightarrow(P\rightarrow A\times B)+(Q\rightarrow A\times B) \] \end_inset cannot be implemented: If we choose to return a value of type -\begin_inset Formula $P\Rightarrow A\times B$ +\begin_inset Formula $P\rightarrow A\times B$ \end_inset , we would need to produce a pair of type @@ -28879,16 +28877,16 @@ both \end_inset , since the given arguments have types -\begin_inset Formula $P\Rightarrow A$ +\begin_inset Formula $P\rightarrow A$ \end_inset and -\begin_inset Formula $Q\Rightarrow B$ +\begin_inset Formula $Q\rightarrow B$ \end_inset . Similarly, we cannot return a value of type -\begin_inset Formula $Q\Rightarrow A\times B$ +\begin_inset Formula $Q\rightarrow A\times B$ \end_inset . @@ -28900,7 +28898,7 @@ We find that the function \end_inset cannot be implemented for the functor -\begin_inset Formula $F^{A}\triangleq(P\Rightarrow A)+(Q\Rightarrow A)$ +\begin_inset Formula $F^{A}\triangleq(P\rightarrow A)+(Q\rightarrow A)$ \end_inset . @@ -29073,13 +29071,13 @@ def p[A, B, F[_]: Functor]: Either[A, F[B]] => F[Either[A, B]] \begin_layout Standard \noindent -\begin_inset Formula $p^{A,B}:A+F^{B}\Rightarrow F^{A+B}$ +\begin_inset Formula $p^{A,B}:A+F^{B}\rightarrow F^{A+B}$ \end_inset , additionally satisfying the special laws of identity and associativity, \begin_inset Formula \[ -p^{\bbnum 0,B}=(b^{:B}\Rightarrow\bbnum 0+b)^{\uparrow F}\quad,\quad\quad p^{A+B,C}=\begin{array}{|c||cc|} +p^{\bbnum 0,B}=(b^{:B}\rightarrow\bbnum 0+b)^{\uparrow F}\quad,\quad\quad p^{A+B,C}=\begin{array}{|c||cc|} & A & F^{B+C}\\ \hline A & \text{id} & \bbnum 0\\ B+F^{C} & \bbnum 0 & p^{B,C} @@ -29158,7 +29156,7 @@ To show that , \begin_inset Formula \[ -\text{wu}_{F}\triangleq(1+\bbnum 0^{:F^{\bbnum 0}})\triangleright p^{\bbnum 1,\bbnum 0}\triangleright(1+\bbnum 0\Rightarrow1)^{\uparrow F}\quad. +\text{wu}_{F}\triangleq(1+\bbnum 0^{:F^{\bbnum 0}})\triangleright p^{\bbnum 1,\bbnum 0}\triangleright(1+\bbnum 0\rightarrow1)^{\uparrow F}\quad. \] \end_inset @@ -29264,8 +29262,8 @@ def p[F[_]: Functor : Pointed, A, B] \[ p^{A,B}\triangleq\begin{array}{|c||c|} & F^{A+B}\\ -\hline A & (a^{:A}\Rightarrow a+\bbnum 0^{:B})\bef\text{pu}_{F}\\ -F^{B} & (b^{:B}\Rightarrow\bbnum 0^{:A}+b)^{\uparrow F} +\hline A & (a^{:A}\rightarrow a+\bbnum 0^{:B})\bef\text{pu}_{F}\\ +F^{B} & (b^{:B}\rightarrow\bbnum 0^{:A}+b)^{\uparrow F} \end{array}\quad. \] @@ -29283,11 +29281,11 @@ It remains to show that The identity law holds because \begin_inset Formula \begin{align*} -\text{expect to equal }(b^{:B}\Rightarrow\bbnum 0+b)^{\uparrow F}:\quad & p^{\bbnum 0,B}=\begin{array}{|c||c|} +\text{expect to equal }(b^{:B}\rightarrow\bbnum 0+b)^{\uparrow F}:\quad & p^{\bbnum 0,B}=\begin{array}{|c||c|} & F^{\bbnum 0+B}\\ \hline \bbnum 0 & \text{(we can delete this line)}\\ -F^{B} & (b^{:B}\Rightarrow\bbnum 0+b)^{\uparrow F} -\end{array}=(b^{:B}\Rightarrow\bbnum 0+b)^{\uparrow F}\quad. +F^{B} & (b^{:B}\rightarrow\bbnum 0+b)^{\uparrow F} +\end{array}=(b^{:B}\rightarrow\bbnum 0+b)^{\uparrow F}\quad. \end{align*} \end_inset @@ -29306,18 +29304,18 @@ B+F^{C} & \bbnum 0 & p^{B,C} B+F^{C} & \bbnum 0 & p^{B,C} \end{array}\,\bef\,\begin{array}{|c||c|} & F^{A+B+C}\\ -\hline A & (a^{:A}\Rightarrow a+\bbnum 0^{:B+C})\bef\text{pu}_{F}\\ -F^{B+C} & (x^{:B+C}\Rightarrow\bbnum 0^{:A}+x)^{\uparrow F} +\hline A & (a^{:A}\rightarrow a+\bbnum 0^{:B+C})\bef\text{pu}_{F}\\ +F^{B+C} & (x^{:B+C}\rightarrow\bbnum 0^{:A}+x)^{\uparrow F} \end{array}\\ & =\begin{array}{|c||c|} & F^{A+B+C}\\ -\hline A & (a^{:A}\Rightarrow a+\bbnum 0^{:B+C})\bef\text{pu}_{F}\\ -B+F^{C} & p^{B,C}\bef(x^{:B+C}\Rightarrow\bbnum 0^{:A}+x)^{\uparrow F} +\hline A & (a^{:A}\rightarrow a+\bbnum 0^{:B+C})\bef\text{pu}_{F}\\ +B+F^{C} & p^{B,C}\bef(x^{:B+C}\rightarrow\bbnum 0^{:A}+x)^{\uparrow F} \end{array}=\begin{array}{|c||c|} & F^{A+B+C}\\ -\hline A & (a^{:A}\Rightarrow a+\bbnum 0^{:B+C})\bef\text{pu}_{F}\\ -B & (b^{:B}\Rightarrow b+\bbnum 0^{:C})\bef\text{pu}_{F}\bef(x^{:B+C}\Rightarrow\bbnum 0^{:A}+x)^{\uparrow F}\\ -F^{C} & (c^{:C}\Rightarrow\bbnum 0^{:A+B}+c)^{\uparrow F} +\hline A & (a^{:A}\rightarrow a+\bbnum 0^{:B+C})\bef\text{pu}_{F}\\ +B & (b^{:B}\rightarrow b+\bbnum 0^{:C})\bef\text{pu}_{F}\bef(x^{:B+C}\rightarrow\bbnum 0^{:A}+x)^{\uparrow F}\\ +F^{C} & (c^{:C}\rightarrow\bbnum 0^{:A+B}+c)^{\uparrow F} \end{array}\quad. \end{align*} @@ -29347,14 +29345,14 @@ In the last line, we have expanded the type matrix to three rows corresponding \[ p^{A+B,C}=\begin{array}{|c||c|} & F^{A+B+C}\\ -\hline A & (a^{:A}\Rightarrow a+\bbnum 0^{:B}+\bbnum 0^{:C})\bef\text{pu}_{F}\\ -B & (b^{:B}\Rightarrow\bbnum 0^{:A}+b+\bbnum 0^{:C})\bef\text{pu}_{F}\\ -F^{C} & (c^{:C}\Rightarrow\bbnum 0^{:A}+\bbnum 0^{:B}+c)^{\uparrow F} +\hline A & (a^{:A}\rightarrow a+\bbnum 0^{:B}+\bbnum 0^{:C})\bef\text{pu}_{F}\\ +B & (b^{:B}\rightarrow\bbnum 0^{:A}+b+\bbnum 0^{:C})\bef\text{pu}_{F}\\ +F^{C} & (c^{:C}\rightarrow\bbnum 0^{:A}+\bbnum 0^{:B}+c)^{\uparrow F} \end{array}=\begin{array}{|c||c|} & F^{A+B+C}\\ -\hline A & (a^{:A}\Rightarrow a+\bbnum 0^{:B+C})\bef\text{pu}_{F}\\ -B & (b^{:B}\Rightarrow\bbnum 0^{:A}+b+\bbnum 0^{:C})\bef\text{pu}_{F}\\ -F^{C} & (c^{:C}\Rightarrow\bbnum 0^{:A+B}+c)^{\uparrow F} +\hline A & (a^{:A}\rightarrow a+\bbnum 0^{:B+C})\bef\text{pu}_{F}\\ +B & (b^{:B}\rightarrow\bbnum 0^{:A}+b+\bbnum 0^{:C})\bef\text{pu}_{F}\\ +F^{C} & (c^{:C}\rightarrow\bbnum 0^{:A+B}+c)^{\uparrow F} \end{array}\quad. \] @@ -29364,9 +29362,9 @@ The only remaining difference is in the second lines of the matrices. We write those lines separately: \begin_inset Formula \begin{align*} -\text{expect to equal }(b^{:B}\Rightarrow\bbnum 0^{:A}+b+\bbnum 0^{:C})\bef\text{pu}_{F}:\quad & (b^{:B}\Rightarrow b+\bbnum 0^{:C})\bef\gunderline{\text{pu}_{F}\bef(x^{:B+C}\Rightarrow\bbnum 0^{:A}+x)^{\uparrow F}}\\ -\text{use the naturality law of }\text{pu}_{F}:\quad & =\gunderline{(b^{:B}\Rightarrow b+\bbnum 0^{:C})\bef(x^{:B+C}\Rightarrow\bbnum 0^{:A}+x)}\bef\text{pu}_{F}\\ -\text{compute function composition}:\quad & =(b^{:B}\Rightarrow\bbnum 0^{:A}+b+\bbnum 0^{:C})\bef\text{pu}_{F}\quad. +\text{expect to equal }(b^{:B}\rightarrow\bbnum 0^{:A}+b+\bbnum 0^{:C})\bef\text{pu}_{F}:\quad & (b^{:B}\rightarrow b+\bbnum 0^{:C})\bef\gunderline{\text{pu}_{F}\bef(x^{:B+C}\rightarrow\bbnum 0^{:A}+x)^{\uparrow F}}\\ +\text{use the naturality law of }\text{pu}_{F}:\quad & =\gunderline{(b^{:B}\rightarrow b+\bbnum 0^{:C})\bef(x^{:B+C}\rightarrow\bbnum 0^{:A}+x)}\bef\text{pu}_{F}\\ +\text{compute function composition}:\quad & =(b^{:B}\rightarrow\bbnum 0^{:A}+b+\bbnum 0^{:C})\bef\text{pu}_{F}\quad. \end{align*} \end_inset @@ -29610,7 +29608,7 @@ Monoid \end_inset instance for -\begin_inset Formula $R\Rightarrow A$ +\begin_inset Formula $R\rightarrow A$ \end_inset : @@ -29646,7 +29644,7 @@ R = Boolean \end_inset , use the type equivalence -\begin_inset Formula $(R\Rightarrow A)=(\bbnum 2\Rightarrow A)\cong A\times A$ +\begin_inset Formula $(R\rightarrow A)=(\bbnum 2\rightarrow A)\cong A\times A$ \end_inset and verify that the monoid instance @@ -29725,7 +29723,7 @@ def monoidFunc[A: Monoid, R] = Monoid[R => A]( In the code notation: \begin_inset Formula \[ -f^{:R\Rightarrow A}\oplus g^{:R\Rightarrow A}\triangleq a\Rightarrow f(a)\oplus_{A}g(a)\quad,\quad\quad e\triangleq(\_\Rightarrow e_{A})\quad. +f^{:R\rightarrow A}\oplus g^{:R\rightarrow A}\triangleq a\rightarrow f(a)\oplus_{A}g(a)\quad,\quad\quad e\triangleq(\_\rightarrow e_{A})\quad. \] \end_inset @@ -29902,7 +29900,7 @@ Bifunctor \end_inset instance for -\begin_inset Formula $B^{X,Y}\triangleq\left(\text{Int}\Rightarrow X\right)+Y\times Y$ +\begin_inset Formula $B^{X,Y}\triangleq\left(\text{Int}\rightarrow X\right)+Y\times Y$ \end_inset . @@ -29982,7 +29980,7 @@ Profunctor \end_inset instance for -\begin_inset Formula $P^{A}\triangleq A\Rightarrow\left(\text{Int}\times A\right)$ +\begin_inset Formula $P^{A}\triangleq A\rightarrow\left(\text{Int}\times A\right)$ \end_inset . @@ -30161,7 +30159,7 @@ Functor \end_inset instance for -\begin_inset Formula $F^{A}\Rightarrow G^{A}$ +\begin_inset Formula $F^{A}\rightarrow G^{A}$ \end_inset as a function parameterized by type constructors @@ -30257,7 +30255,7 @@ noprefix "false" (a) \series default Implement a function with type signature -\begin_inset Formula $F^{A}+F^{B}\Rightarrow F^{A+B}$ +\begin_inset Formula $F^{A}+F^{B}\rightarrow F^{A+B}$ \end_inset parameterized by a type constructor @@ -30274,7 +30272,7 @@ noprefix "false" . Show that the inverse type signature -\begin_inset Formula $F^{A+B}\Rightarrow F^{A}+F^{B}$ +\begin_inset Formula $F^{A+B}\rightarrow F^{A}+F^{B}$ \end_inset is not implementable for some functors @@ -30292,7 +30290,7 @@ A functor \end_inset for which this is not implementable is -\begin_inset Formula $F^{A}\triangleq R\Rightarrow A$ +\begin_inset Formula $F^{A}\triangleq R\rightarrow A$ \end_inset where @@ -30313,7 +30311,7 @@ A functor (b) \series default Implement a function with type signature -\begin_inset Formula $C^{A+B}\Rightarrow C^{A}\times C^{B}$ +\begin_inset Formula $C^{A+B}\rightarrow C^{A}\times C^{B}$ \end_inset parameterized by a type constructor @@ -30330,7 +30328,7 @@ A functor . Show that the inverse type signature -\begin_inset Formula $C^{A}\times C^{B}\Rightarrow C^{A+B}$ +\begin_inset Formula $C^{A}\times C^{B}\rightarrow C^{A+B}$ \end_inset is not implementable for some contrafunctors @@ -30346,11 +30344,11 @@ status open \begin_layout Plain Layout The function -\begin_inset Formula $C^{A}\times C^{B}\Rightarrow C^{A+B}$ +\begin_inset Formula $C^{A}\times C^{B}\rightarrow C^{A+B}$ \end_inset cannot be implemented for -\begin_inset Formula $C^{A}\triangleq\left(A\Rightarrow P\right)+\left(A\Rightarrow Q\right)$ +\begin_inset Formula $C^{A}\triangleq\left(A\rightarrow P\right)+\left(A\rightarrow Q\right)$ \end_inset . @@ -30359,7 +30357,7 @@ The function \end_inset is necessary because the simpler contrafunctor -\begin_inset Formula $C^{A}\triangleq A\Rightarrow P$ +\begin_inset Formula $C^{A}\triangleq A\rightarrow P$ \end_inset does not provide a counterexample. @@ -30393,7 +30391,7 @@ noprefix "false" \begin_layout Standard Implement a function with type signature -\begin_inset Formula $F^{A\Rightarrow B}\Rightarrow A\Rightarrow F^{B}$ +\begin_inset Formula $F^{A\rightarrow B}\rightarrow A\rightarrow F^{B}$ \end_inset parameterized by a functor @@ -30410,7 +30408,7 @@ Implement a function with type signature . Show that the inverse type signature, -\begin_inset Formula $(A\Rightarrow F^{B})\Rightarrow F^{A\Rightarrow B}$ +\begin_inset Formula $(A\rightarrow F^{B})\rightarrow F^{A\rightarrow B}$ \end_inset , cannot be implemented for some functors @@ -30517,13 +30515,13 @@ def q[A, B, F[_]: Functor]: F[(A, B)] => (A, F[B]) \begin_layout Standard \noindent -\begin_inset Formula $q^{A,B}:F^{A\times B}\Rightarrow A\times F^{B}$ +\begin_inset Formula $q^{A,B}:F^{A\times B}\rightarrow A\times F^{B}$ \end_inset , additionally satisfying the special laws of identity and associativity, \begin_inset Formula \[ -q^{\bbnum 1,B}=f^{:F^{\bbnum 1\times B}}\Rightarrow1\times(f\triangleright(1\times b^{:B}\Rightarrow b)^{\uparrow F})\quad,\quad\quad q^{A,B\times C}\bef(\text{id}^{A}\boxtimes q^{B,C})=q^{A\times B,C}\quad. +q^{\bbnum 1,B}=f^{:F^{\bbnum 1\times B}}\rightarrow1\times(f\triangleright(1\times b^{:B}\rightarrow b)^{\uparrow F})\quad,\quad\quad q^{A,B\times C}\bef(\text{id}^{A}\boxtimes q^{B,C})=q^{A\times B,C}\quad. \] \end_inset @@ -30584,7 +30582,7 @@ The following naturality law should also hold for , \begin_inset Formula \[ -(f^{:A\Rightarrow C}\boxtimes g^{:B\Rightarrow D})^{\uparrow F}\bef q^{C,D}=q^{A,B}\bef f\boxtimes(g^{\uparrow F})\quad. +(f^{:A\rightarrow C}\boxtimes g^{:B\rightarrow D})^{\uparrow F}\bef q^{C,D}=q^{A,B}\bef f\boxtimes(g^{\uparrow F})\quad. \] \end_inset @@ -30648,7 +30646,7 @@ Define the method as \begin_inset Formula \[ -\text{ex}_{F}\triangleq x^{:F^{A}}\Rightarrow x\triangleright(a^{:A}\Rightarrow a\times1)^{\uparrow F}\triangleright q^{A,\bbnum 1}\triangleright\nabla_{1}\quad\text{ or alternatively }\quad\text{ex}_{F}\triangleq(a^{:A}\Rightarrow a\times1)^{\uparrow F}\bef q^{A,\bbnum 1}\bef\nabla_{1}\quad. +\text{ex}_{F}\triangleq x^{:F^{A}}\rightarrow x\triangleright(a^{:A}\rightarrow a\times1)^{\uparrow F}\triangleright q^{A,\bbnum 1}\triangleright\nabla_{1}\quad\text{ or alternatively }\quad\text{ex}_{F}\triangleq(a^{:A}\rightarrow a\times1)^{\uparrow F}\bef q^{A,\bbnum 1}\bef\nabla_{1}\quad. \] \end_inset @@ -30665,8 +30663,8 @@ Show that the naturality law holds for . \begin_inset Formula \begin{align*} -\text{expect to equal }\text{ex}_{F}\bef f:\quad & f^{\uparrow F}\bef\text{ex}_{F}=\gunderline{f^{\uparrow F}\bef(a^{:A}\Rightarrow a\times1)^{\uparrow F}}\bef q^{A,\bbnum 1}\bef\nabla_{1}=(a^{:A}\Rightarrow a\times1)^{\uparrow F}\bef\gunderline{(f\boxtimes\text{id})^{\uparrow F}\bef q^{A,\bbnum 1}}\bef\nabla_{1}\\ - & =(a^{:A}\Rightarrow a\times1)^{\uparrow F}\bef q^{A,\bbnum 1}\bef\gunderline{(f\boxtimes\text{id}^{\uparrow F})\bef\nabla_{1}}=\gunderline{(a^{:A}\Rightarrow a\times1)^{\uparrow F}\bef q^{A,\bbnum 1}\bef\nabla_{1}}\bef f=\text{ex}_{F}\bef f\quad. +\text{expect to equal }\text{ex}_{F}\bef f:\quad & f^{\uparrow F}\bef\text{ex}_{F}=\gunderline{f^{\uparrow F}\bef(a^{:A}\rightarrow a\times1)^{\uparrow F}}\bef q^{A,\bbnum 1}\bef\nabla_{1}=(a^{:A}\rightarrow a\times1)^{\uparrow F}\bef\gunderline{(f\boxtimes\text{id})^{\uparrow F}\bef q^{A,\bbnum 1}}\bef\nabla_{1}\\ + & =(a^{:A}\rightarrow a\times1)^{\uparrow F}\bef q^{A,\bbnum 1}\bef\gunderline{(f\boxtimes\text{id}^{\uparrow F})\bef\nabla_{1}}=\gunderline{(a^{:A}\rightarrow a\times1)^{\uparrow F}\bef q^{A,\bbnum 1}\bef\nabla_{1}}\bef f=\text{ex}_{F}\bef f\quad. \end{align*} \end_inset @@ -30686,7 +30684,7 @@ Given a method as \begin_inset Formula \[ -q^{A,B}\triangleq f^{:F^{A\times B}}\Rightarrow(f\triangleright\nabla_{1}^{\uparrow F}\triangleright\text{ex}_{F}^{A})\times(f\triangleright\nabla_{2}^{\uparrow F})\quad\text{ or alternatively }\quad q^{A,B}\triangleq\Delta\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\bef(\text{ex}_{F}^{A}\boxtimes\text{id})\quad. +q^{A,B}\triangleq f^{:F^{A\times B}}\rightarrow(f\triangleright\nabla_{1}^{\uparrow F}\triangleright\text{ex}_{F}^{A})\times(f\triangleright\nabla_{2}^{\uparrow F})\quad\text{ or alternatively }\quad q^{A,B}\triangleq\Delta\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\bef(\text{ex}_{F}^{A}\boxtimes\text{id})\quad. \] \end_inset @@ -30723,7 +30721,7 @@ because Naturality law: \begin_inset Formula \begin{align*} -(f^{:A\Rightarrow C}\boxtimes g^{:B\Rightarrow D})^{\uparrow F}\bef\Delta\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\bef(\text{ex}_{F}^{A}\boxtimes\text{id}) & =\Delta\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\bef(\text{ex}_{F}^{A}\boxtimes\text{id})\bef f\boxtimes(g^{\uparrow F})\\ +(f^{:A\rightarrow C}\boxtimes g^{:B\rightarrow D})^{\uparrow F}\bef\Delta\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\bef(\text{ex}_{F}^{A}\boxtimes\text{id}) & =\Delta\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\bef(\text{ex}_{F}^{A}\boxtimes\text{id})\bef f\boxtimes(g^{\uparrow F})\\ \Delta\bef((f\boxtimes g)^{\uparrow F}\boxtimes(f\boxtimes g)^{\uparrow F})\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\bef(\text{ex}_{F}^{A}\boxtimes\text{id}) & =\Delta\bef(\nabla_{1}^{\uparrow F}\bef\text{ex}_{F}\bef f)\boxtimes(\nabla_{2}^{\uparrow F}\bef g^{\uparrow F})\\ \Delta\bef(\nabla_{1}^{\uparrow F}\bef\gunderline{f^{\uparrow F}\bef\text{ex}_{F}})\boxtimes(\nabla_{2}^{\uparrow F}\bef g^{\uparrow F}) & =\Delta\bef(\nabla_{1}^{\uparrow F}\bef\gunderline{\text{ex}_{F}\bef f})\boxtimes(\nabla_{2}^{\uparrow F}\bef g^{\uparrow F}) \end{align*} @@ -30733,9 +30731,9 @@ Naturality law: Associativity law: the left-hand side is \begin_inset Formula \begin{align*} - & f^{:F^{A\times B\times C}}\triangleright q^{A,B\times C}\bef(\text{id}^{A}\boxtimes q^{B,C})=(f\triangleright\nabla_{1}^{\uparrow F}\triangleright\text{ex}_{F}^{A})\times(f\triangleright(a\times b\times c\Rightarrow b\times c)^{\uparrow F}\triangleright q^{B,C})\\ - & =(f\triangleright\nabla_{1}^{\uparrow F}\triangleright\text{ex}_{F}^{A})\times(f\triangleright(a\times b\times c\Rightarrow b\times c)^{\uparrow F}\triangleright\nabla_{1}^{\uparrow F}\triangleright\text{ex}_{F}^{B})\times(f\triangleright(a\times b\times c\Rightarrow b\times c)^{\uparrow F}\triangleright\nabla_{2}^{\uparrow F})\\ - & =\left(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\Rightarrow a)\right)\times\left(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\Rightarrow b)\right)\times\left(f\triangleright(a\times b\times c\Rightarrow c)^{\uparrow F}\right)\quad. + & f^{:F^{A\times B\times C}}\triangleright q^{A,B\times C}\bef(\text{id}^{A}\boxtimes q^{B,C})=(f\triangleright\nabla_{1}^{\uparrow F}\triangleright\text{ex}_{F}^{A})\times(f\triangleright(a\times b\times c\rightarrow b\times c)^{\uparrow F}\triangleright q^{B,C})\\ + & =(f\triangleright\nabla_{1}^{\uparrow F}\triangleright\text{ex}_{F}^{A})\times(f\triangleright(a\times b\times c\rightarrow b\times c)^{\uparrow F}\triangleright\nabla_{1}^{\uparrow F}\triangleright\text{ex}_{F}^{B})\times(f\triangleright(a\times b\times c\rightarrow b\times c)^{\uparrow F}\triangleright\nabla_{2}^{\uparrow F})\\ + & =\left(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\rightarrow a)\right)\times\left(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\rightarrow b)\right)\times\left(f\triangleright(a\times b\times c\rightarrow c)^{\uparrow F}\right)\quad. \end{align*} \end_inset @@ -30743,8 +30741,8 @@ Associativity law: the left-hand side is The right-hand side is \begin_inset Formula \begin{align*} - & f^{:F^{A\times B\times C}}\triangleright q^{A\times B,C}=(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\Rightarrow a\times b))\times(f\triangleright(a\times b\times c\Rightarrow c)^{\uparrow F})\\ - & =\left(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\Rightarrow a)\right)\times\left(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\Rightarrow b)\right)\times\left(f\triangleright(a\times b\times c\Rightarrow c)^{\uparrow F}\right)\quad. + & f^{:F^{A\times B\times C}}\triangleright q^{A\times B,C}=(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\rightarrow a\times b))\times(f\triangleright(a\times b\times c\rightarrow c)^{\uparrow F})\\ + & =\left(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\rightarrow a)\right)\times\left(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\rightarrow b)\right)\times\left(f\triangleright(a\times b\times c\rightarrow c)^{\uparrow F}\right)\quad. \end{align*} \end_inset @@ -30824,7 +30822,7 @@ functor \end_inset the equation -\begin_inset Formula $T\triangleq T\Rightarrow\text{Int}$ +\begin_inset Formula $T\triangleq T\rightarrow\text{Int}$ \end_inset ) do not seem to be often useful in practice, and we will not consider them @@ -30910,7 +30908,7 @@ unfix , satisfying the conditions \begin_inset Formula \[ -\text{fix}:S^{T}\Rightarrow T\quad,\quad\quad\text{unfix}:T\Rightarrow S^{T}\quad,\quad\quad\text{fix}\bef\text{unfix}=\text{id}\quad,\quad\quad\text{unfix}\bef\text{fix}=\text{id}\quad. +\text{fix}:S^{T}\rightarrow T\quad,\quad\quad\text{unfix}:T\rightarrow S^{T}\quad,\quad\quad\text{fix}\bef\text{unfix}=\text{id}\quad,\quad\quad\text{unfix}\bef\text{fix}=\text{id}\quad. \] \end_inset @@ -31682,7 +31680,7 @@ noprefix "false" ). As an example, take -\begin_inset Formula $S^{A}\triangleq\text{String}\times(\text{Int}\Rightarrow A)$ +\begin_inset Formula $S^{A}\triangleq\text{String}\times(\text{Int}\rightarrow A)$ \end_inset . @@ -31697,8 +31695,8 @@ noprefix "false" does not hold: \begin_inset Formula \begin{align*} - & S^{\bbnum 0}\cong\text{String}\times(\gunderline{\text{Int}\Rightarrow\bbnum 0})\\ -\text{use the type equivalence }\left(\text{Int}\Rightarrow\bbnum 0\right)\cong\bbnum 0:\quad & \quad\cong\text{String}\times\bbnum 0\cong\bbnum 0\quad. + & S^{\bbnum 0}\cong\text{String}\times(\gunderline{\text{Int}\rightarrow\bbnum 0})\\ +\text{use the type equivalence }\left(\text{Int}\rightarrow\bbnum 0\right)\cong\bbnum 0:\quad & \quad\cong\text{String}\times\bbnum 0\cong\bbnum 0\quad. \end{align*} \end_inset @@ -31911,7 +31909,7 @@ Int A symbolic (and non-rigorous) representation of that type is \begin_inset Formula \[ -T=\text{String}\times(\text{Int}\Rightarrow\text{String}\times(\text{Int}\Rightarrow\text{String}\times(\text{Int}\Rightarrow\text{String}\times...)))\quad. +T=\text{String}\times(\text{Int}\rightarrow\text{String}\times(\text{Int}\rightarrow\text{String}\times(\text{Int}\rightarrow\text{String}\times...)))\quad. \] \end_inset @@ -31921,12 +31919,12 @@ T=\text{String}\times(\text{Int}\Rightarrow\text{String}\times(\text{Int}\Righta \begin_layout Standard As another example, consider -\begin_inset Formula $S^{A}\triangleq\bbnum 1\Rightarrow\text{Int}\times A+\text{String}$ +\begin_inset Formula $S^{A}\triangleq\bbnum 1\rightarrow\text{Int}\times A+\text{String}$ \end_inset . Using the type equivalence -\begin_inset Formula $P\cong(\bbnum 1\Rightarrow P)$ +\begin_inset Formula $P\cong(\bbnum 1\rightarrow P)$ \end_inset , we @@ -32082,7 +32080,7 @@ We can recognize that is not void: \begin_inset Formula \[ -S^{\bbnum 0}=\bbnum 1\Rightarrow\text{Int}\times\bbnum 0+\text{String}\cong\bbnum 1\Rightarrow\text{String}\cong\text{String}\not\cong\bbnum 0\quad. +S^{\bbnum 0}=\bbnum 1\rightarrow\text{Int}\times\bbnum 0+\text{String}\cong\bbnum 1\rightarrow\text{String}\cong\text{String}\not\cong\bbnum 0\quad. \] \end_inset @@ -32114,7 +32112,7 @@ noprefix "false" \end_inset ) shows that -\begin_inset Formula $C^{A}\Rightarrow P^{A}$ +\begin_inset Formula $C^{A}\rightarrow P^{A}$ \end_inset is a functor when @@ -32131,7 +32129,7 @@ noprefix "false" \end_inset contains a sub-expression of the form -\begin_inset Formula $C^{A}\Rightarrow P^{A}$ +\begin_inset Formula $C^{A}\rightarrow P^{A}$ \end_inset , we can use recursion to implement any values of @@ -32165,7 +32163,7 @@ noprefix "false" \end_inset is an argument of the function of type -\begin_inset Formula $C^{A}\Rightarrow P^{A}$ +\begin_inset Formula $C^{A}\rightarrow P^{A}$ \end_inset , so we are not required to produce values of type @@ -32178,7 +32176,7 @@ consume \emph default those values. It follows that we can implement a value of type -\begin_inset Formula $C^{T}\Rightarrow P^{T}$ +\begin_inset Formula $C^{T}\rightarrow P^{T}$ \end_inset (with @@ -32217,7 +32215,7 @@ noprefix "false" \begin_layout Standard In the example -\begin_inset Formula $S^{A}\triangleq\text{String}\times(\text{Int}\Rightarrow A)$ +\begin_inset Formula $S^{A}\triangleq\text{String}\times(\text{Int}\rightarrow A)$ \end_inset , the functor @@ -32227,7 +32225,7 @@ In the example is pointed since \begin_inset Formula \[ -S^{\bbnum 1}\cong\text{String}\times(\text{Int}\Rightarrow\bbnum 1)\cong\text{String}\not\cong\bbnum 0\quad. +S^{\bbnum 1}\cong\text{String}\times(\text{Int}\rightarrow\bbnum 1)\cong\text{String}\not\cong\bbnum 0\quad. \] \end_inset @@ -32237,7 +32235,7 @@ S^{\bbnum 1}\cong\text{String}\times(\text{Int}\Rightarrow\bbnum 1)\cong\text{St \begin_layout Standard This consideration applies to any sub-expression of the form -\begin_inset Formula $C^{A}\Rightarrow P^{A}$ +\begin_inset Formula $C^{A}\rightarrow P^{A}$ \end_inset within the type constructor @@ -32327,7 +32325,7 @@ sufficient \end_inset can be implemented if every function-type sub-expression -\begin_inset Formula $C^{A}\Rightarrow P^{A}$ +\begin_inset Formula $C^{A}\rightarrow P^{A}$ \end_inset in @@ -32509,7 +32507,7 @@ java.lang.ArrayIndexOutOfBoundsException: 3 \end_inset We can denote the type of this function by -\begin_inset Formula $\text{Int}_{[0,n-1]}\Rightarrow A$ +\begin_inset Formula $\text{Int}_{[0,n-1]}\rightarrow A$ \end_inset to indicate the bounds of the index. @@ -32587,13 +32585,13 @@ concat \end_inset ) for arrays, -\begin_inset Formula $\text{Array}_{n}^{A}\triangleq\text{Int}_{[0,n-1]}\Rightarrow A$ +\begin_inset Formula $\text{Array}_{n}^{A}\triangleq\text{Int}_{[0,n-1]}\rightarrow A$ \end_inset , is defined by \begin_inset Formula \[ -a_{1}^{:\text{Array}_{n_{1}}^{A}}\negmedspace+\negthickspace+a_{2}^{:\text{Array}_{n_{2}}^{A}}\triangleq i^{:\text{Int}_{[0,n_{1}+n_{2}-1]}}\Rightarrow\begin{cases} +a_{1}^{:\text{Array}_{n_{1}}^{A}}\negmedspace+\negthickspace+a_{2}^{:\text{Array}_{n_{2}}^{A}}\triangleq i^{:\text{Int}_{[0,n_{1}+n_{2}-1]}}\rightarrow\begin{cases} 0\leq i Array[A] = \begin_inset Formula \begin{align*} f_{2}(\bbnum 1+\bbnum 0^{:A\times\text{List}^{A}}) & \triangleq\text{Array}_{0}^{A}\quad,\\ -f_{2}(\bbnum 0+x^{:A}\times s^{:\text{List}^{A}}) & \triangleq i^{:\text{Int}_{[0,n]}}\Rightarrow\begin{cases} +f_{2}(\bbnum 0+x^{:A}\times s^{:\text{List}^{A}}) & \triangleq i^{:\text{Int}_{[0,n]}}\rightarrow\begin{cases} i=0: & x\quad,\\ i\geq1: & \overline{f_{2}}(s)(i-1)\quad. \end{cases} @@ -33132,18 +33130,18 @@ To show that : \begin_inset Formula \begin{align*} - & g^{:\text{Int}_{[0,n]}\Rightarrow A}\triangleright f_{1}\bef f_{2}=g\triangleright f_{1}\triangleright f_{2}=(\bbnum 0+g(0)\times\overline{f_{1}}(i\Rightarrow g(i+1)))\triangleright f_{2}\\ - & =i\Rightarrow\begin{cases} + & g^{:\text{Int}_{[0,n]}\rightarrow A}\triangleright f_{1}\bef f_{2}=g\triangleright f_{1}\triangleright f_{2}=(\bbnum 0+g(0)\times\overline{f_{1}}(i\rightarrow g(i+1)))\triangleright f_{2}\\ + & =i\rightarrow\begin{cases} i=0: & g(0)\\ -i\geq1: & \gunderline{\overline{f_{2}}(\overline{f_{1}}}(i\Rightarrow g(i+1)))(i-1) -\end{cases}=i\Rightarrow\begin{cases} +i\geq1: & \gunderline{\overline{f_{2}}(\overline{f_{1}}}(i\rightarrow g(i+1)))(i-1) +\end{cases}=i\rightarrow\begin{cases} i=0: & g(0)\\ -i\geq1: & \gunderline{\text{id}}(i\Rightarrow g(i+1)))(i-1) +i\geq1: & \gunderline{\text{id}}(i\rightarrow g(i+1)))(i-1) \end{cases}\\ - & =i\Rightarrow\begin{cases} + & =i\rightarrow\begin{cases} i=0: & g(0)\\ i\geq1: & g(\gunderline{\left(i-1\right)+1}) -\end{cases}=\left(i\Rightarrow g(i)\right)=g. +\end{cases}=\left(i\rightarrow g(i)\right)=g. \end{align*} \end_inset @@ -33155,11 +33153,11 @@ Similarly, we find that via this calculation: \begin_inset Formula \begin{align*} - & (\bbnum 0+x^{:A}\times s^{:\text{List}^{A}})\triangleright f_{2}\bef f_{1}=f_{1}\left(i^{:\text{Int}_{[0,n]}}\Rightarrow\begin{cases} + & (\bbnum 0+x^{:A}\times s^{:\text{List}^{A}})\triangleright f_{2}\bef f_{1}=f_{1}\left(i^{:\text{Int}_{[0,n]}}\rightarrow\begin{cases} i=0: & x\\ i\geq1: & \overline{f_{2}}(s)(i-1) \end{cases}\right)\\ - & =\bbnum 0+x\times\overline{f_{1}}(\gunderline{i\Rightarrow\overline{f_{2}}(s)(i+1-1)})=\bbnum 0+x\times\gunderline{\overline{f_{1}}(\overline{f_{2}}}(s))=\bbnum 0+x\times s\quad. + & =\bbnum 0+x\times\overline{f_{1}}(\gunderline{i\rightarrow\overline{f_{2}}(s)(i+1-1)})=\bbnum 0+x\times\gunderline{\overline{f_{1}}(\overline{f_{2}}}(s))=\bbnum 0+x\times s\quad. \end{align*} \end_inset @@ -33308,7 +33306,7 @@ def concat[A](p: List[A], q: List[A]) p^{:\text{List}^{A}}\negmedspace+\negthickspace+q^{:\text{List}^{A}}\triangleq p\triangleright\begin{array}{|c||c|} & \text{List}^{A}\\ \hline \bbnum 1 & q\\ -A\times\text{List}^{A} & a\times t\Rightarrow\bbnum 0+a\times(t\negmedspace+\negthickspace+q) +A\times\text{List}^{A} & a\times t\rightarrow\bbnum 0+a\times(t\negmedspace+\negthickspace+q) \end{array}\quad. \] @@ -33434,11 +33432,11 @@ By definition of , we have \begin_inset Formula \begin{align*} - & f_{2}(\bbnum 0+a\times t)=i\Rightarrow\begin{cases} + & f_{2}(\bbnum 0+a\times t)=i\rightarrow\begin{cases} i=0: & a\\ i\geq1: & \overline{f_{2}}(t)(i-1) \end{cases}\quad,\\ - & f_{2}(\bbnum 0+a\times(t\negmedspace+\negthickspace+q))=i\Rightarrow\begin{cases} + & f_{2}(\bbnum 0+a\times(t\negmedspace+\negthickspace+q))=i\rightarrow\begin{cases} i=0: & a\\ i\geq1: & \overline{f_{2}}(t\negmedspace+\negthickspace+q)(i-1) \end{cases}\quad. @@ -33471,7 +33469,7 @@ The inductive assumption guarantees that , we get \begin_inset Formula \[ -f_{2}(\bbnum 0+a\times(t\negmedspace+\negthickspace+q))=i\Rightarrow\begin{cases} +f_{2}(\bbnum 0+a\times(t\negmedspace+\negthickspace+q))=i\rightarrow\begin{cases} i=0: & a\\ 1\leq i (a, b)) // Must have `f.map`. \end{lstlisting} @@ -924,7 +924,7 @@ \subsubsection{Example \label{subsec:tc-Example-Pointed-type}\ref{subsec:tc-Exam \end{lstlisting} Another example of a \lstinline!HasDefault! instance with a type -parameter is for functions of type $A\Rightarrow A$: +parameter is for functions of type $A\rightarrow A$: \begin{lstlisting} implicit def defaultFunc[A]: HasDefault[A => A] = HasDefault[A => A](identity) \end{lstlisting} @@ -960,7 +960,7 @@ \subsubsection{Example \label{subsec:tc-Example-Semigroups}\ref{subsec:tc-Exampl \subparagraph{Solution} For every supported type $T$, the required data is a function of -type $T\times T\Rightarrow T$. So, we define the typeclass as a wrapper +type $T\times T\rightarrow T$. So, we define the typeclass as a wrapper over that type: \begin{lstlisting} final case class Semigroup[T](combine: (T, T) => T) @@ -1051,7 +1051,7 @@ \subsubsection{Example \label{subsec:tc-Example-semigroup-alternative-implementa for strings and as addition for integers may appear to be ``natural''. However, alternative implementations are useful in certain applications. As long as the associativity law holds, \emph{any} function of type -$T\times T\Rightarrow T$ may be used as the semigroup operation. +$T\times T\rightarrow T$ may be used as the semigroup operation. The task of this example is to show that the following implementations of the semigroup operation are lawful and to implement the corresponding typeclass instances in Scala. @@ -1065,7 +1065,7 @@ \subsubsection{Example \label{subsec:tc-Example-semigroup-alternative-implementa \textbf{(c)} For $T\triangleq\text{String}$, define $x\oplus y$ as the longer of the strings $x$ and $y$. -\textbf{(d)} For $T\triangleq S\Rightarrow S$ (the type $S$ is fixed), +\textbf{(d)} For $T\triangleq S\rightarrow S$ (the type $S$ is fixed), define $x\oplus y\triangleq x\bef y$ (the forward function composition) or $x\oplus y\triangleq x\circ y$ (the backward function composition). @@ -1190,7 +1190,7 @@ \subsubsection{Example \label{subsec:tc-Example-Monoids-1}\ref{subsec:tc-Example def monoidOf[T](implicit ti1: Semigroup[T], ti2: HasDefault[T]): Monoid[T] = ??? \end{lstlisting} To implement a value of type \lstinline!Monoid[T]!, we need to provide -a function of type $T\times T\Rightarrow T$ and a value of type $T$. +a function of type $T\times T\rightarrow T$ and a value of type $T$. Precisely that data is available in the typeclass instances of \lstinline!Semigroup! and \lstinline!HasDefault!, and so it is natural to use them, \begin{lstlisting} @@ -1210,7 +1210,7 @@ \subsubsection{Example \label{subsec:tc-Example-Monoids-1}\ref{subsec:tc-Example Writing the types of the \lstinline!Semigroup!, \lstinline!HasDefault!, and \lstinline!Monoid! instances in the type notation, we get \[ -\text{Semigroup}^{T}\triangleq T\times T\Rightarrow T\quad,\quad\quad\text{HasDefault}^{T}\triangleq T\quad,\quad\quad\text{Monoid}^{T}\triangleq\left(T\times T\Rightarrow T\right)\times T\quad. +\text{Semigroup}^{T}\triangleq T\times T\rightarrow T\quad,\quad\quad\text{HasDefault}^{T}\triangleq T\quad,\quad\quad\text{Monoid}^{T}\triangleq\left(T\times T\rightarrow T\right)\times T\quad. \] It is clear that \[ @@ -1236,10 +1236,10 @@ \subsubsection{Example \label{subsec:tc-Example-Monoids-1}\ref{subsec:tc-Example Are there alternative implementations of the \lstinline!Monoid! typeclass instance given \lstinline!Semigroup! and \lstinline!HasDefault! instances? The function \lstinline!monoidOf! needs to produce a value -of type $\left(T\times T\Rightarrow T\right)\times T$ given values -of type $T\times T\Rightarrow T$ and a value of type $T$: +of type $\left(T\times T\rightarrow T\right)\times T$ given values +of type $T\times T\rightarrow T$ and a value of type $T$: \[ -\text{monoidOf}:\left(T\times T\Rightarrow T\right)\times T\Rightarrow\left(T\times T\Rightarrow T\right)\times T\quad. +\text{monoidOf}:\left(T\times T\rightarrow T\right)\times T\rightarrow\left(T\times T\rightarrow T\right)\times T\quad. \] When the type signature of \lstinline!monoidOf! is written in this notation, it is clear that \lstinline!monoidOf! should be the identity @@ -1287,7 +1287,7 @@ \subsection{Typeclasses for type constructors\label{subsec:Typeclasses-for-type- \noindent In the type notation, this type signature is written as\vspace{-0.45\baselineskip} \[ -\text{map}:\forall(A,B).\,F^{A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow F^{B}\quad. +\text{map}:\forall(A,B).\,F^{A}\rightarrow\left(A\rightarrow B\right)\rightarrow F^{B}\quad. \] \vspace{-1.5\baselineskip} @@ -1315,7 +1315,7 @@ \subsection{Typeclasses for type constructors\label{subsec:Typeclasses-for-type- \noindent The type constructor \lstinline!Functor! has the type parameter \lstinline!F[_]!, which must be itself a type constructor. For any type constructor \lstinline!F!, a value of type \lstinline!Functor[F]! -is a wrapper for a value of type $\forall(A,B).\,F^{A}\Rightarrow\left(A\Rightarrow B\right)\Rightarrow F^{B}$. +is a wrapper for a value of type $\forall(A,B).\,F^{A}\rightarrow\left(A\rightarrow B\right)\rightarrow F^{B}$. Values of type \lstinline!Functor! (i.e.~typeclass instances) are implemented with the ``\lstinline!new { ... }!'' syntax: \begin{lstlisting} @@ -1405,17 +1405,17 @@ \subsection{Extractors} \end{lstlisting} In the type notation, this type constructor is written as \[ -\text{HasMetadata}^{T}\triangleq(T\Rightarrow\text{String})\times(T\Rightarrow\text{Long})\quad. +\text{HasMetadata}^{T}\triangleq(T\rightarrow\text{String})\times(T\rightarrow\text{Long})\quad. \] Using the standard type equivalences (see Table~\ref{tab:Logical-identities-with-function-types}), -we find that this type is equivalent to $T\Rightarrow\text{String}\times\text{Long}$. +we find that this type is equivalent to $T\rightarrow\text{String}\times\text{Long}$. So, let us denote $\text{String}\times\text{Long}$ by $Z$ and consider -a more general typeclass whose instances are values of type $T\Rightarrow Z$. +a more general typeclass whose instances are values of type $T\rightarrow Z$. We may call this typeclass a ``$Z$-extractor\index{extractor typeclass}'' since types $T$ from its type domain permit us to extract values of type $Z$. With a fixed type $Z$, we denote the typeclass by \[ -\text{Extractor}^{T}\triangleq T\Rightarrow Z\quad. +\text{Extractor}^{T}\triangleq T\rightarrow Z\quad. \] \begin{lstlisting} final case class Extractor[Z, T](extract: T => Z) @@ -1429,14 +1429,14 @@ \subsection{Extractors} We check whether an \lstinline!Extractor! typeclass instance can be computed for the \lstinline!Unit! type or for another fixed type -$C$. To compute $\text{Extractor}^{\bbnum 1}=\bbnum 1\Rightarrow Z$ +$C$. To compute $\text{Extractor}^{\bbnum 1}=\bbnum 1\rightarrow Z$ requires creating a value of type $Z$ from scratch, which we cannot do in a fully parametric function. For a fixed type $C$, a value -of type $\text{Extractor}^{C}=C\Rightarrow Z$ can be computed only +of type $\text{Extractor}^{C}=C\rightarrow Z$ can be computed only if we can compute a value of type $Z$ given a value of type $C$. This is possible only if we choose $C$ as $C=Z$. The typeclass instance for $\text{Extractor}^{Z}$ is implemented as an identity function -of type $Z\Rightarrow Z$: +of type $Z\rightarrow Z$: \begin{lstlisting} implicit def extractorZ[Z] = Extractor[Z, Z](identity) \end{lstlisting} @@ -1445,7 +1445,7 @@ \subsection{Extractors} \paragraph{Type parameters} Creating a typeclass instance $\text{Extractor}^{A}$ for an arbitrary -type $A$ means to compute $\forall A.\,A\Rightarrow Z$; this is +type $A$ means to compute $\forall A.\,A\rightarrow Z$; this is not possible since we cannot create values of type $Z$ using only a value of an unknown type $A$. So, there is no \lstinline!Extractor! for arbitrary types \lstinline!A!. @@ -1462,12 +1462,12 @@ \subsection{Extractors} we see that computing a new typeclass instance from two previous ones requires implementing a conversion function with type signature \[ -\forall(A,B,Z).\,\text{Extractor}^{A}\times\text{Extractor}^{B}\Rightarrow\text{Extractor}^{A\times B}=\left(A\Rightarrow Z\right)\times\left(B\Rightarrow Z\right)\Rightarrow A\times B\Rightarrow Z\quad. +\forall(A,B,Z).\,\text{Extractor}^{A}\times\text{Extractor}^{B}\rightarrow\text{Extractor}^{A\times B}=\left(A\rightarrow Z\right)\times\left(B\rightarrow Z\right)\rightarrow A\times B\rightarrow Z\quad. \] We can derive only two fully parametric implementations of this type signature: \[ -f^{:A\Rightarrow Z}\times g^{:B\Rightarrow Z}\Rightarrow a\times b\Rightarrow f(a)\quad\quad\text{ and }\quad\quad f^{:A\Rightarrow Z}\times g^{:B\Rightarrow Z}\Rightarrow a\times b\Rightarrow g(b)\quad. +f^{:A\rightarrow Z}\times g^{:B\rightarrow Z}\rightarrow a\times b\rightarrow f(a)\quad\quad\text{ and }\quad\quad f^{:A\rightarrow Z}\times g^{:B\rightarrow Z}\rightarrow a\times b\rightarrow g(b)\quad. \] Both implementations give a valid \lstinline!Extractor! instance (since there are no laws to check). However, every choice will use @@ -1475,7 +1475,7 @@ \subsection{Extractors} So, we can simplify this construction by keeping the typeclass constraint only for $A$ and allowing \emph{any} type $B$, \[ -\text{extractorPair}:\forall(A,B,Z).\,\text{Extractor}^{A}\Rightarrow\text{Extractor}^{A\times B}\quad. +\text{extractorPair}:\forall(A,B,Z).\,\text{Extractor}^{A}\rightarrow\text{Extractor}^{A\times B}\quad. \] \begin{lstlisting} def extractorPair[Z, A, B](implicit ti: Extractor[Z, A]) = @@ -1492,15 +1492,15 @@ \subsection{Extractors} can we compute a value of type $\text{Extractor}^{A+B}$? Writing out the types, we get \[ -\forall(A,B,Z).\,\text{Extractor}^{A}\times\text{Extractor}^{B}\Rightarrow\text{Extractor}^{A+B}=\left(A\Rightarrow Z\right)\times\left(B\Rightarrow Z\right)\Rightarrow A+B\Rightarrow Z\quad. +\forall(A,B,Z).\,\text{Extractor}^{A}\times\text{Extractor}^{B}\rightarrow\text{Extractor}^{A+B}=\left(A\rightarrow Z\right)\times\left(B\rightarrow Z\right)\rightarrow A+B\rightarrow Z\quad. \] Due to a known type equivalence (Table~\ref{tab:Logical-identities-with-function-types}), we have a unique implementation of this function: \[ -\text{extractorEither}\triangleq f^{:A\Rightarrow Z}\times g^{:B\Rightarrow Z}\Rightarrow\begin{array}{|c||c|} +\text{extractorEither}\triangleq f^{:A\rightarrow Z}\times g^{:B\rightarrow Z}\rightarrow\begin{array}{|c||c|} & Z\\ -\hline A & a\Rightarrow f(a)\\ -B & b\Rightarrow g(b) +\hline A & a\rightarrow f(a)\\ +B & b\rightarrow g(b) \end{array}\quad. \] \begin{lstlisting} @@ -1528,39 +1528,39 @@ \subsection{Extractors} \paragraph{Function types} -We need to investigate whether $C\Rightarrow A$ or $A\Rightarrow C$ +We need to investigate whether $C\rightarrow A$ or $A\rightarrow C$ can have an \lstinline!Extractor! instance for some choice of $C$, assuming that we have an instance for $A$. The required conversion functions must have type signatures \[ -\text{Extractor}^{A}\Rightarrow\text{Extractor}^{A\Rightarrow C}\quad\quad\text{ or }\quad\quad\text{Extractor}^{A}\Rightarrow\text{Extractor}^{C\Rightarrow A}\quad. +\text{Extractor}^{A}\rightarrow\text{Extractor}^{A\rightarrow C}\quad\quad\text{ or }\quad\quad\text{Extractor}^{A}\rightarrow\text{Extractor}^{C\rightarrow A}\quad. \] Writing out the types, we find \[ -\left(A\Rightarrow Z\right)\Rightarrow\left(A\Rightarrow C\right)\Rightarrow Z\quad\quad\text{ or }\quad\quad\left(A\Rightarrow Z\right)\Rightarrow\left(C\Rightarrow A\right)\Rightarrow Z\quad. +\left(A\rightarrow Z\right)\rightarrow\left(A\rightarrow C\right)\rightarrow Z\quad\quad\text{ or }\quad\quad\left(A\rightarrow Z\right)\rightarrow\left(C\rightarrow A\right)\rightarrow Z\quad. \] None of these type signatures can be implemented. The first one is hopeless since we do not have values of type $A$; the second one is missing values of type $C$. However, since the type $C$ is fixed, we may store a value of type $C$ as part of the newly constructed -type. So, we consider the pair type $C\times\left(C\Rightarrow A\right)$ +type. So, we consider the pair type $C\times\left(C\rightarrow A\right)$ and find that its \lstinline!Extractor! instance, i.e.~a value of -type $C\times\left(C\Rightarrow A\right)\Rightarrow Z$, can be derived -from a value of type $A\Rightarrow Z$ as +type $C\times\left(C\rightarrow A\right)\rightarrow Z$, can be derived +from a value of type $A\rightarrow Z$ as \[ -f^{:A\Rightarrow Z}\Rightarrow c^{:C}\times g^{:C\Rightarrow A}\Rightarrow f(g(c))\quad. +f^{:A\rightarrow Z}\rightarrow c^{:C}\times g^{:C\rightarrow A}\rightarrow f(g(c))\quad. \] \begin{lstlisting} def extractorFunc[Z, A, C](implicit ti: Extractor[Z, A]) = Extractor[Z, (C, C => A)] { case (c, g) => ti.extract(g(c)) } \end{lstlisting} -Examples of this construction are the type expressions $C\times\left(C\Rightarrow Z\right)$ -and $D\times\left(D\Rightarrow Z\times P\right)$. +Examples of this construction are the type expressions $C\times\left(C\rightarrow Z\right)$ +and $D\times\left(D\rightarrow Z\times P\right)$. Another situation where an \lstinline!Extractor! instance exists -for the type $C\Rightarrow A$ is when the type $C$ has a known ``default +for the type $C\rightarrow A$ is when the type $C$ has a known ``default value'' $e_{C}$ (as in the \lstinline!HasDefault! typeclass). In -that case, we may omit the first $C$ in $C\times(C\Rightarrow A)$ +that case, we may omit the first $C$ in $C\times(C\rightarrow A)$ and instead substitute the default value when necessary. \paragraph{Recursive types} @@ -1572,7 +1572,7 @@ \subsection{Extractors} of previous extractor types. For the product construction, we define $F_{1}^{B,A}\triangleq A\times B$. For the co-product construction, $F_{2}^{B,A}\triangleq B+A$ (where $B$ must be also an extractor -type). For the function construction, $F_{3}^{C,A}\triangleq C\times\left(C\Rightarrow A\right)$. +type). For the function construction, $F_{3}^{C,A}\triangleq C\times\left(C\rightarrow A\right)$. Any recursive type equation that uses $F_{1}$, $F_{2}$, and/or $F_{3}$ will define a new recursive type with an \lstinline!Extractor! instance. @@ -1601,12 +1601,12 @@ \subsection{Extractors} Recursive equations involving $F_{3}$ will produce new examples of \lstinline!Extractor! types, such as \begin{equation} -T\triangleq F_{3}^{C,F_{2}^{Z,F_{1}^{T,P}}}=C\times\left(C\Rightarrow Z+P\times T\right)\quad.\label{eq:example-good-recursive-equation-extractor} +T\triangleq F_{3}^{C,F_{2}^{Z,F_{1}^{T,P}}}=C\times\left(C\rightarrow Z+P\times T\right)\quad.\label{eq:example-good-recursive-equation-extractor} \end{equation} Heuristically, this type can be seen as an ``infinite'' exponential-polynomial type expression \[ -T=C\times\left(C\Rightarrow Z+P\times C\times\left(C\Rightarrow Z+P\times C\times\left(C\Rightarrow Z+...\right)\right)\right)\quad. +T=C\times\left(C\rightarrow Z+P\times C\times\left(C\rightarrow Z+P\times C\times\left(C\rightarrow Z+...\right)\right)\right)\quad. \] Types of this form are useful in some applications involving lazy streams. @@ -1620,17 +1620,17 @@ \subsection{Extractors} of $F_{1}$, $F_{2}$, and/or $F_{3}$, we implemented a function with type \[ -\text{extractorF}:\text{Extractor}^{A}\Rightarrow\text{Extractor}^{F^{A}}\quad. +\text{extractorF}:\text{Extractor}^{A}\rightarrow\text{Extractor}^{F^{A}}\quad. \] Since $S$ is a composition of $F_{1}$, $F_{2}$, and/or $F_{3}$, we are able to implement a function \[ -\text{extractorS}:\text{Extractor}^{A}\Rightarrow\text{Extractor}^{S^{A}}\quad. +\text{extractorS}:\text{Extractor}^{A}\rightarrow\text{Extractor}^{S^{A}}\quad. \] The \lstinline!Extractor! instance for the recursive type $T$ is then defined recursively as \[ -x^{:T\Rightarrow Z}\triangleq\text{extractorS}\left(x\right)\quad. +x^{:T\rightarrow Z}\triangleq\text{extractorS}\left(x\right)\quad. \] The types match because the type $T$ is equivalent to the type $S^{T}$. As long as the definition of the recursive type $T$ is valid (i.e.~the @@ -1641,32 +1641,32 @@ \subsection{Extractors} The type constructor $S$ is defined by \[ -S^{A}\triangleq C\times\left(C\Rightarrow Z+P\times A\right)\quad. +S^{A}\triangleq C\times\left(C\rightarrow Z+P\times A\right)\quad. \] \begin{lstlisting} type S[A] = (C, C => Either[Z, (P, A)]) final case class TypeT(t: S[TypeT]) // Define the recursive type `TypeT`. \end{lstlisting} To implement the function of type \lstinline!Extractor[T] => Extractor[S[T]]!, -which is $\left(T\Rightarrow Z\right)\Rightarrow S^{T}\Rightarrow Z$, +which is $\left(T\rightarrow Z\right)\rightarrow S^{T}\rightarrow Z$, we begin with a typed hole \[ -f^{:T\Rightarrow Z}\Rightarrow s^{:C\times\left(C\Rightarrow Z+P\times T\right)}\Rightarrow\text{???}^{:Z}\quad. +f^{:T\rightarrow Z}\rightarrow s^{:C\times\left(C\rightarrow Z+P\times T\right)}\rightarrow\text{???}^{:Z}\quad. \] -To fill $\text{???}^{:Z}$, we could apply $f^{:T\Rightarrow Z}$ +To fill $\text{???}^{:Z}$, we could apply $f^{:T\rightarrow Z}$ to some value of type $T$; but the only value of type $T$ can be -obtained if we apply the function of type $C\Rightarrow Z+P\times T$ +obtained if we apply the function of type $C\rightarrow Z+P\times T$ to the given value of type $C$. So we write \[ -f^{:T\Rightarrow Z}\Rightarrow c^{:C}\times g^{:C\Rightarrow Z+P\times T}\Rightarrow g(c)\triangleright\text{???}^{:Z+P\times T\Rightarrow Z}\quad. +f^{:T\rightarrow Z}\rightarrow c^{:C}\times g^{:C\rightarrow Z+P\times T}\rightarrow g(c)\triangleright\text{???}^{:Z+P\times T\rightarrow Z}\quad. \] The new typed hole has a function type. We can write the code in matrix notation as \[ -\text{extractorS}\triangleq f^{:T\Rightarrow Z}\Rightarrow c^{:C}\times g^{:C\Rightarrow Z+P\times T}\Rightarrow g(c)\triangleright\begin{array}{|c||c|} +\text{extractorS}\triangleq f^{:T\rightarrow Z}\rightarrow c^{:C}\times g^{:C\rightarrow Z+P\times T}\rightarrow g(c)\triangleright\begin{array}{|c||c|} & Z\\ \hline Z & \text{id}\\ -P\times T & p^{:P}\times t^{:T}\Rightarrow f(t) +P\times T & p^{:P}\times t^{:T}\rightarrow f(t) \end{array}\quad. \] \begin{lstlisting} @@ -1716,12 +1716,12 @@ \subsection{Extractors} the case class \lstinline!Extractor! forces us to rewrite Eq.~(\ref{eq:recursive-extractor-def}) in the form of an ``expanded function'', \[ -\text{extractorT}\triangleq t\Rightarrow\text{extractorS}\left(\text{extractorT}\right)(t)\quad. +\text{extractorT}\triangleq t\rightarrow\text{extractorS}\left(\text{extractorT}\right)(t)\quad. \] \begin{lstlisting} def extractorT: Extractor[TypeT] = Extractor { case TypeT(t) => extractorS(extractorT).extract(t) } \end{lstlisting} -Although the ``expanded function\index{expanded function}'' $t\Rightarrow f(t)$ +Although the ``expanded function\index{expanded function}'' $t\rightarrow f(t)$ is equivalent to just $f$, there is an important difference: using ``expanded functions'' makes recursive definitions \index{recursive function!termination} terminate. @@ -1740,7 +1740,7 @@ \subsection{Extractors} This code is clearly invalid. But if we expand the right-hand side of the recursive equation to \[ -f\triangleq t\Rightarrow k(f)(t) +f\triangleq t\rightarrow k(f)(t) \] instead of $f\triangleq k(f)$, the code will become valid: \begin{lstlisting}[mathescape=true] @@ -1760,7 +1760,7 @@ \subsection{Extractors} can be combined to create a new type expression that will always have an \lstinline!Extractor! instance. An example is the type expression \[ -K^{Z,P,Q,R,S}\triangleq Z\times P+Q\times\left(Q\Rightarrow Z+R\times\left(R\Rightarrow Z\times S\right)\right)\quad. +K^{Z,P,Q,R,S}\triangleq Z\times P+Q\times\left(Q\rightarrow Z+R\times\left(R\rightarrow Z\times S\right)\right)\quad. \] Since the type $K$ is built up step by step from fixed types via the product, co-product, and function constructions, an \lstinline!Extractor! @@ -1792,14 +1792,14 @@ \subsection{Extractors} {\footnotesize{}The }\lstinline!Unit!{\footnotesize{} type, or other fixed type $C$} & {\footnotesize{}$\text{Extractor}^{\bbnum 1}$ or $\text{Extractor}^{C}$} & {\footnotesize{}$\text{Extractor}^{Z}$}\tabularnewline \hline -{\footnotesize{}Product of extractor type $A$ and any $B$} & {\footnotesize{}$\text{Extractor}^{A}\Rightarrow\text{Extractor}^{A\times B}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Product of extractor type $A$ and any $B$} & {\footnotesize{}$\text{Extractor}^{A}\rightarrow\text{Extractor}^{A\times B}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Co-product of extractor types $A$ and $B$} & {\footnotesize{}$\text{Extractor}^{A}\times\text{Extractor}^{B}\Rightarrow\text{Extractor}^{A+B}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Co-product of extractor types $A$ and $B$} & {\footnotesize{}$\text{Extractor}^{A}\times\text{Extractor}^{B}\rightarrow\text{Extractor}^{A+B}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Function from or to another type $C$} & {\footnotesize{}$\text{Extractor}^{A}\Rightarrow\text{Extractor}^{A\Rightarrow C}$ -or $\text{Extractor}^{C\Rightarrow A}$} & {\footnotesize{}$\text{Extractor}^{C\times\left(C\Rightarrow A\right)}$}\tabularnewline +{\footnotesize{}Function from or to another type $C$} & {\footnotesize{}$\text{Extractor}^{A}\rightarrow\text{Extractor}^{A\rightarrow C}$ +or $\text{Extractor}^{C\rightarrow A}$} & {\footnotesize{}$\text{Extractor}^{C\times\left(C\rightarrow A\right)}$}\tabularnewline \hline -{\footnotesize{}Recursive types} & {\footnotesize{}$\text{Extractor}^{A}\Rightarrow\text{Extractor}^{S^{A}}$ +{\footnotesize{}Recursive types} & {\footnotesize{}$\text{Extractor}^{A}\rightarrow\text{Extractor}^{S^{A}}$ where $T\triangleq S^{T}$} & {\footnotesize{}$\text{Extractor}^{T}$}\tabularnewline \hline \end{tabular} @@ -1816,7 +1816,7 @@ \subsection{The \texttt{Eq} typeclass\label{subsec:The-Eq-typeclass}} \lstinline!===! constrained to a typeclass called \lstinline!Eq!, ensuring that types can be meaningfully compared for equality. The equality comparison for values of type $A$ is a function of type -$A\times A\Rightarrow\bbnum 2$ (where $\bbnum 2$ denotes the \lstinline!Boolean! +$A\times A\rightarrow\bbnum 2$ (where $\bbnum 2$ denotes the \lstinline!Boolean! type). A function of that type is wrapped by typeclass instances of \lstinline!Eq!. We also define \lstinline!===! as an extension method:\index{typeclass!Eq@\texttt{Eq}} \begin{lstlisting} @@ -1846,10 +1846,10 @@ \subsection{The \texttt{Eq} typeclass\label{subsec:The-Eq-typeclass}} the laws of identity, reflexivity and transitivity. The law of reflexivity\index{reflexivity law} states that $x=x$ for every $x$; so the comparison \lstinline!x === x! should always return \lstinline!true!. The example shown above violates -that law when we choose $x\triangleq n^{:\text{Int}}\Rightarrow n$. +that law when we choose $x\triangleq n^{:\text{Int}}\rightarrow n$. Let us perform structural analysis for the \lstinline!Eq! typeclass, -defining $\text{Eq}^{A}\triangleq A\times A\Rightarrow\bbnum 2$. +defining $\text{Eq}^{A}\triangleq A\times A\rightarrow\bbnum 2$. The results (see Table~\ref{tab:Type-constructions-for-Eq} below) will show which types can be reasonably compared for equality. @@ -1876,7 +1876,7 @@ \subsection{The \texttt{Eq} typeclass\label{subsec:The-Eq-typeclass}} law of the equality operation (if $x=y$ then $f(x)=f(y)$ for any function $f$): we would have pairs such as $a\times b_{1}$ and $a\times b_{2}$ that would be ``equal'' according to this definition, and yet many -functions $f^{:A\times B\Rightarrow C}$ exist such that $f(a\times b_{1})\neq f(a\times b_{2})$. +functions $f^{:A\times B\rightarrow C}$ exist such that $f(a\times b_{1})\neq f(a\times b_{2})$. \paragraph{Co-products} @@ -1910,16 +1910,16 @@ \subsection{The \texttt{Eq} typeclass\label{subsec:The-Eq-typeclass}} \paragraph{Functions} If $A$ has an \lstinline!Eq! instance, can we create an \lstinline!Eq! -instance for $R\Rightarrow A$ where $R$ is some other type? This +instance for $R\rightarrow A$ where $R$ is some other type? This would be possible with a function of type \begin{equation} -\forall A.\,(A\times A\Rightarrow\bbnum 2)\Rightarrow\left(R\Rightarrow A\right)\times\left(R\Rightarrow A\right)\Rightarrow\bbnum 2\quad.\label{eq:type-signature-function-comparison} +\forall A.\,(A\times A\rightarrow\bbnum 2)\rightarrow\left(R\rightarrow A\right)\times\left(R\rightarrow A\right)\rightarrow\bbnum 2\quad.\label{eq:type-signature-function-comparison} \end{equation} Here we assume that the type $R$ is an arbitrary chosen type, so no values of type $R$ can be computed from scratch. (This would not be the case when $R=\bbnum 1$ or $R=\bbnum 2$, say. But in those -cases the type $R\Rightarrow A$ can be simplified to a polynomial -type, e.g.~$\bbnum 1\Rightarrow A\cong A$ and $\bbnum 2\Rightarrow A\cong A\times A$, +cases the type $R\rightarrow A$ can be simplified to a polynomial +type, e.g.~$\bbnum 1\rightarrow A\cong A$ and $\bbnum 2\rightarrow A\cong A\times A$, etc.) Without values of type $R$, we cannot compute any values of type $A$ and cannot apply comparisons to them. Then the only possible implementations of the type signature~(\ref{eq:type-signature-function-comparison}) @@ -1928,7 +1928,7 @@ \subsection{The \texttt{Eq} typeclass\label{subsec:The-Eq-typeclass}} will violate the reflexivity law $x=x$. The implementation that always returns \lstinline!true! is not useful. -We will be able to evaluate functions of type $R\Rightarrow A$ if +We will be able to evaluate functions of type $R\rightarrow A$ if some chosen values of type $R$ are available. Examples of that situation are types $R$ of the form $R\cong\bbnum 1+S$ for some type $S$; we then always have a chosen value $r_{1}\triangleq1+\bbnum 0^{:S}$ @@ -1943,33 +1943,33 @@ \subsection{The \texttt{Eq} typeclass\label{subsec:The-Eq-typeclass}} Another way to see the problem is to write the type equivalence \[ -R\Rightarrow A\cong\bbnum 1+S\Rightarrow A\cong A\times(S\Rightarrow A)\quad, +R\rightarrow A\cong\bbnum 1+S\rightarrow A\cong A\times(S\rightarrow A)\quad, \] which reduces this case to the product construction we saw above. -It follows that we need to have an \lstinline!Eq! instance for $S\Rightarrow A$ -to define the equality operation for $R\Rightarrow A$. If we have +It follows that we need to have an \lstinline!Eq! instance for $S\rightarrow A$ +to define the equality operation for $R\rightarrow A$. If we have a chosen value of type $S$, e.g.~if $S\cong\bbnum 1+T$, we will again reduce the situation to the product construction with the function -type $T\Rightarrow A$. This process will end only if the type $R$ +type $T\rightarrow A$. This process will end only if the type $R$ has the form \[ R\cong\bbnum 1+\bbnum 1+...+\bbnum 1\quad, \] i.e.~if $R$ has a \emph{known} and finite number of distinct values. -In that case, we can write code that applies functions of type $R\Rightarrow A$ +In that case, we can write code that applies functions of type $R\rightarrow A$ to every possible value of the argument of type $R$ and compares all the resulting values of type $A$. -So, we can compare functions $f_{1}^{:R\Rightarrow A}$ and $f_{2}^{:R\Rightarrow A}$ +So, we can compare functions $f_{1}^{:R\rightarrow A}$ and $f_{2}^{:R\rightarrow A}$ only if we are able to check whether $f_{1}(r)=f_{2}(r)$ for \emph{every} possible value of type $R$. We cannot implement such a comparison for a general type $R$. -We conclude that functions of type $R\Rightarrow A$ cannot have an +We conclude that functions of type $R\rightarrow A$ cannot have an \lstinline!Eq! instance for a general type $R$. A similar argument -shows that functions of type $A\Rightarrow R$ also cannot have a -useful \lstinline!Eq! instance. The only exceptions are types $R\Rightarrow A$ -or $A\Rightarrow R$ that are equivalent to some polynomial types. +shows that functions of type $A\rightarrow R$ also cannot have a +useful \lstinline!Eq! instance. The only exceptions are types $R\rightarrow A$ +or $A\rightarrow R$ that are equivalent to some polynomial types. \paragraph{Recursive types} @@ -1986,7 +1986,7 @@ \subsection{The \texttt{Eq} typeclass\label{subsec:The-Eq-typeclass}} instances. To construct the typeclass instance for $T$, we first implement a function $\text{eqS}$ of type \[ -\text{eqS}:\text{Eq}^{A}\Rightarrow\text{Eq}^{S^{A}}\quad. +\text{eqS}:\text{Eq}^{A}\rightarrow\text{Eq}^{S^{A}}\quad. \] This function produces an \lstinline!Eq! instance for $S^{A}$ using \lstinline!Eq! instances of $A$ and of all other types that $S^{A}$ @@ -2000,7 +2000,7 @@ \subsection{The \texttt{Eq} typeclass\label{subsec:The-Eq-typeclass}} The recursive equation for \lstinline!eqT! needs to be implemented as an expanded function, \[ -\text{eqT}\triangleq t^{:T}\times t^{:T}\Rightarrow\text{eqS}\,(\text{eqT})\left(t\times t\right)\quad, +\text{eqT}\triangleq t^{:T}\times t^{:T}\rightarrow\text{eqS}\,(\text{eqT})\left(t\times t\right)\quad, \] and then, as we have seen in the previous section, the recursion will terminate. @@ -2079,15 +2079,15 @@ \subsection{The \texttt{Eq} typeclass\label{subsec:The-Eq-typeclass}} \hline \hline {\footnotesize{}The }\lstinline!Unit!{\footnotesize{} type, or other -primitive type} & {\footnotesize{}$\text{Eq}^{T}\triangleq T\times T\Rightarrow\bbnum 2$} & {\footnotesize{}the method }\lstinline!==!\tabularnewline +primitive type} & {\footnotesize{}$\text{Eq}^{T}\triangleq T\times T\rightarrow\bbnum 2$} & {\footnotesize{}the method }\lstinline!==!\tabularnewline \hline {\footnotesize{}Product of }\lstinline!Eq!{\footnotesize{} types -$A$ and $B$} & {\footnotesize{}$\text{Eq}^{A}\times\text{Eq}^{B}\Rightarrow\text{Eq}^{A\times B}$} & {\footnotesize{}one possibility}\tabularnewline +$A$ and $B$} & {\footnotesize{}$\text{Eq}^{A}\times\text{Eq}^{B}\rightarrow\text{Eq}^{A\times B}$} & {\footnotesize{}one possibility}\tabularnewline \hline {\footnotesize{}Co-product of }\lstinline!Eq!{\footnotesize{} types -$A$ and $B$} & {\footnotesize{}$\text{Eq}^{A}\times\text{Eq}^{B}\Rightarrow\text{Eq}^{A+B}$} & {\footnotesize{}one possibility}\tabularnewline +$A$ and $B$} & {\footnotesize{}$\text{Eq}^{A}\times\text{Eq}^{B}\rightarrow\text{Eq}^{A+B}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Recursive types} & {\footnotesize{}$\text{Eq}^{A}\Rightarrow\text{Eq}^{S^{A}}$ where +{\footnotesize{}Recursive types} & {\footnotesize{}$\text{Eq}^{A}\rightarrow\text{Eq}^{S^{A}}$ where $T\triangleq S^{T}$} & {\footnotesize{}$\text{Eq}^{T}$}\tabularnewline \hline \end{tabular} @@ -2099,7 +2099,7 @@ \subsection{The \texttt{Eq} typeclass\label{subsec:The-Eq-typeclass}} \subsection{Semigroups\label{subsec:Semigroups-constructions}} A type $T$ has an instance of \lstinline!Semigroup! when an associative -binary operation of type $T\times T\Rightarrow T$ is available. We +binary operation of type $T\times T\rightarrow T$ is available. We will now apply structural analysis to this typeclass. The results are shown in Table~\ref{tab:Type-constructions-for-semigroup}. @@ -2122,8 +2122,8 @@ \subsection{Semigroups\label{subsec:Semigroups-constructions}} \paragraph{Type parameters} A semigroup instance parametric in type $T$ means a value of type -$\forall T.\,T\times T\Rightarrow T$. There are two implementations -of this type signature: $a^{:T}\times b^{:T}\Rightarrow a$ and $a^{:T}\times b^{:T}\Rightarrow b$. +$\forall T.\,T\times T\rightarrow T$. There are two implementations +of this type signature: $a^{:T}\times b^{:T}\rightarrow a$ and $a^{:T}\times b^{:T}\rightarrow b$. Both provide an associative binary operation, as Example~\ref{subsec:tc-Example-semigroup-alternative-implementations}(a) shows. So, any type $T$ can be made into a ``trivial'' semigroup in one of these two ways. (\index{``trivial'' semigroup}``Trivial'' @@ -2137,24 +2137,24 @@ \subsection{Semigroups\label{subsec:Semigroups-constructions}} To compute that instance means, in the general case, to implement a function with type \[ -\text{semigroupPair}:\forall(A,B).\,\text{Semigroup}^{A}\times\text{Semigroup}^{B}\Rightarrow\text{Semigroup}^{A\times B}\quad. +\text{semigroupPair}:\forall(A,B).\,\text{Semigroup}^{A}\times\text{Semigroup}^{B}\rightarrow\text{Semigroup}^{A\times B}\quad. \] Writing out the type expressions, we get the type signature \[ -\text{semigroupPair}:\forall(A,B).\,\left(A\times A\Rightarrow A\right)\times\left(B\times B\Rightarrow B\right)\Rightarrow\left(A\times B\times A\times B\Rightarrow A\times B\right)\quad. +\text{semigroupPair}:\forall(A,B).\,\left(A\times A\rightarrow A\right)\times\left(B\times B\rightarrow B\right)\rightarrow\left(A\times B\times A\times B\rightarrow A\times B\right)\quad. \] While this type signature can be implemented in a number of ways, we look for code that preserves information, in hopes of satisfying the associativity law. The code should be a function of the form \[ -\text{semigroupPair}\triangleq f^{:A\times A\Rightarrow A}\times g^{:B\times B\Rightarrow B}\Rightarrow a_{1}^{:A}\times b_{1}^{:B}\times a_{2}^{:A}\times b_{2}^{:B}\Rightarrow???^{:A}\times???^{:B}\quad. +\text{semigroupPair}\triangleq f^{:A\times A\rightarrow A}\times g^{:B\times B\rightarrow B}\rightarrow a_{1}^{:A}\times b_{1}^{:B}\times a_{2}^{:A}\times b_{2}^{:B}\rightarrow???^{:A}\times???^{:B}\quad. \] Since we are trying to define the new semigroup operation through the previously given operations $f$ and $g$, it is natural to apply $f$ and $g$ to the given data $a_{1}$, $a_{2}$, $b_{1}$, $b_{2}$ and write \[ -f^{:A\times A\Rightarrow A}\times g^{:B\times B\Rightarrow B}\Rightarrow a_{1}^{:A}\times b_{1}^{:B}\times a_{2}^{:A}\times b_{2}^{:B}\Rightarrow f(a_{1},a_{2})\times g(b_{1},b_{2})\quad. +f^{:A\times A\rightarrow A}\times g^{:B\times B\rightarrow B}\rightarrow a_{1}^{:A}\times b_{1}^{:B}\times a_{2}^{:A}\times b_{2}^{:B}\rightarrow f(a_{1},a_{2})\times g(b_{1},b_{2})\quad. \] This code defines a new binary operation $\oplus_{A\times B}$ via the previously given $\oplus_{A}$ and $\oplus_{B}$ as @@ -2182,15 +2182,15 @@ \subsection{Semigroups\label{subsec:Semigroups-constructions}} To compute a \lstinline!Semigroup! instance for the co-product $A+B$ of two semigroups, we need \[ -\text{semigroupEither}:\forall(A,B).\,\text{Semigroup}^{A}\times\text{Semigroup}^{B}\Rightarrow\text{Semigroup}^{A+B}\quad. +\text{semigroupEither}:\forall(A,B).\,\text{Semigroup}^{A}\times\text{Semigroup}^{B}\rightarrow\text{Semigroup}^{A+B}\quad. \] Writing out the type expressions, we get the type signature \[ -\text{semigroupEither}:\forall(A,B).\,\left(A\times A\Rightarrow A\right)\times\left(B\times B\Rightarrow B\right)\Rightarrow\left(A+B\right)\times\left(A+B\right)\Rightarrow A+B\quad. +\text{semigroupEither}:\forall(A,B).\,\left(A\times A\rightarrow A\right)\times\left(B\times B\rightarrow B\right)\rightarrow\left(A+B\right)\times\left(A+B\right)\rightarrow A+B\quad. \] Begin by writing a function with a typed hole: \[ -\text{semigroupEither}\triangleq f^{:A\times A\Rightarrow A}\times g^{:B\times B\Rightarrow B}\Rightarrow c^{:\left(A+B\right)\times\left(A+B\right)}\Rightarrow\text{???}^{:A+B}\quad. +\text{semigroupEither}\triangleq f^{:A\times A\rightarrow A}\times g^{:B\times B\rightarrow B}\rightarrow c^{:\left(A+B\right)\times\left(A+B\right)}\rightarrow\text{???}^{:A+B}\quad. \] Transforming the type expression $\left(A+B\right)\times\left(A+B\right)$ into an equivalent disjunctive type, @@ -2199,12 +2199,12 @@ \subsection{Semigroups\label{subsec:Semigroups-constructions}} \] we can continue to write the function's code in matrix notation, \[ -f^{:A\times A\Rightarrow A}\times g^{:B\times B\Rightarrow B}\Rightarrow\begin{array}{|c||cc|} +f^{:A\times A\rightarrow A}\times g^{:B\times B\rightarrow B}\rightarrow\begin{array}{|c||cc|} & A & B\\ -\hline A\times A & \text{???}^{:A\times A\Rightarrow A} & \text{???}^{:A\times A\Rightarrow B}\\ -A\times B & \text{???}^{:A\times B\Rightarrow A} & \text{???}^{:A\times B\Rightarrow B}\\ -B\times A & \text{???}^{:B\times A\Rightarrow A} & \text{???}^{:B\times A\Rightarrow B}\\ -B\times B & \text{???}^{:B\times B\Rightarrow A} & \text{???}^{:B\times B\Rightarrow B} +\hline A\times A & \text{???}^{:A\times A\rightarrow A} & \text{???}^{:A\times A\rightarrow B}\\ +A\times B & \text{???}^{:A\times B\rightarrow A} & \text{???}^{:A\times B\rightarrow B}\\ +B\times A & \text{???}^{:B\times A\rightarrow A} & \text{???}^{:B\times A\rightarrow B}\\ +B\times B & \text{???}^{:B\times B\rightarrow A} & \text{???}^{:B\times B\rightarrow B} \end{array}\quad. \] The matrix is $4\times2$ because the input type, $A\times A+A\times B+B\times A+B\times B$, @@ -2214,39 +2214,39 @@ \subsection{Semigroups\label{subsec:Semigroups-constructions}} can have a value. To save space, we will omit the types in the matrices. The first and -the last rows of the matrix must contain functions of types $A\times A\Rightarrow A$ -and $B\times B\Rightarrow B$, and so it is natural to fill them with +the last rows of the matrix must contain functions of types $A\times A\rightarrow A$ +and $B\times B\rightarrow B$, and so it is natural to fill them with $f$ and $g$: \[ -f^{:A\times A\Rightarrow A}\times g^{:B\times B\Rightarrow B}\Rightarrow\begin{array}{||cc|} -f^{:A\times A\Rightarrow A} & \bbnum 0\\ -\text{???}^{:A\times B\Rightarrow A} & \text{???}^{:A\times B\Rightarrow B}\\ -\text{???}^{:B\times A\Rightarrow A} & \text{???}^{:B\times A\Rightarrow B}\\ -\bbnum 0 & g^{:B\times B\Rightarrow B} +f^{:A\times A\rightarrow A}\times g^{:B\times B\rightarrow B}\rightarrow\begin{array}{||cc|} +f^{:A\times A\rightarrow A} & \bbnum 0\\ +\text{???}^{:A\times B\rightarrow A} & \text{???}^{:A\times B\rightarrow B}\\ +\text{???}^{:B\times A\rightarrow A} & \text{???}^{:B\times A\rightarrow B}\\ +\bbnum 0 & g^{:B\times B\rightarrow B} \end{array}\quad. \] The remaining two rows can be filled in four different ways: \begin{align*} -f\times g\Rightarrow\begin{array}{||cc|} -f^{:A\times A\Rightarrow A} & \bbnum 0\\ -a^{:A}\times b^{:B}\Rightarrow a & \bbnum 0\\ -b^{:B}\times a^{:A}\Rightarrow a & \bbnum 0\\ -\bbnum 0 & g^{:B\times B\Rightarrow B} -\end{array}~\quad,\quad\quad & ~f\times g\Rightarrow\begin{array}{||cc|} +f\times g\rightarrow\begin{array}{||cc|} +f^{:A\times A\rightarrow A} & \bbnum 0\\ +a^{:A}\times b^{:B}\rightarrow a & \bbnum 0\\ +b^{:B}\times a^{:A}\rightarrow a & \bbnum 0\\ +\bbnum 0 & g^{:B\times B\rightarrow B} +\end{array}~\quad,\quad\quad & ~f\times g\rightarrow\begin{array}{||cc|} f & \bbnum 0\\ -\bbnum 0 & a^{:A}\times b^{:B}\Rightarrow b\\ -\bbnum 0 & b^{:B}\times a^{:A}\Rightarrow b\\ +\bbnum 0 & a^{:A}\times b^{:B}\rightarrow b\\ +\bbnum 0 & b^{:B}\times a^{:A}\rightarrow b\\ \bbnum 0 & g \end{array}\quad,\\ -f\times g\Rightarrow\begin{array}{||cc|} -f^{:A\times A\Rightarrow A} & \bbnum 0\\ -\bbnum 0 & a^{:A}\times b^{:B}\Rightarrow b\\ -b^{:B}\times a^{:A}\Rightarrow a & \bbnum 0\\ -\bbnum 0 & g^{:B\times B\Rightarrow B} -\end{array}\quad,\quad\quad & f\times g\Rightarrow\begin{array}{||cc|} +f\times g\rightarrow\begin{array}{||cc|} +f^{:A\times A\rightarrow A} & \bbnum 0\\ +\bbnum 0 & a^{:A}\times b^{:B}\rightarrow b\\ +b^{:B}\times a^{:A}\rightarrow a & \bbnum 0\\ +\bbnum 0 & g^{:B\times B\rightarrow B} +\end{array}\quad,\quad\quad & f\times g\rightarrow\begin{array}{||cc|} f & \bbnum 0\\ -a^{:A}\times b^{:B}\Rightarrow a & \bbnum 0\\ -\bbnum 0 & b^{:B}\times a^{:A}\Rightarrow b\\ +a^{:A}\times b^{:B}\rightarrow a & \bbnum 0\\ +\bbnum 0 & b^{:B}\times a^{:A}\rightarrow b\\ \bbnum 0 & g \end{array}\quad. \end{align*} @@ -2345,17 +2345,17 @@ \subsection{Semigroups\label{subsec:Semigroups-constructions}} \paragraph{Functions} -If $A$ is a semigroup and $E$ is any fixed type, are the types $A\Rightarrow E$ -and/or $E\Rightarrow A$ semigroups? To create a \lstinline!Semigroup! -instance for $E\Rightarrow A$ means to implement the type signature +If $A$ is a semigroup and $E$ is any fixed type, are the types $A\rightarrow E$ +and/or $E\rightarrow A$ semigroups? To create a \lstinline!Semigroup! +instance for $E\rightarrow A$ means to implement the type signature \[ -\text{Semigroup}^{A}\Rightarrow\text{Semigroup}^{E\Rightarrow A}=\left(A\times A\Rightarrow A\right)\Rightarrow\left(E\Rightarrow A\right)\times\left(E\Rightarrow A\right)\Rightarrow E\Rightarrow A\quad. +\text{Semigroup}^{A}\rightarrow\text{Semigroup}^{E\rightarrow A}=\left(A\times A\rightarrow A\right)\rightarrow\left(E\rightarrow A\right)\times\left(E\rightarrow A\right)\rightarrow E\rightarrow A\quad. \] An implementation that preserves information is \[ -\text{semigroupFunc}\triangleq f^{:A\times A\Rightarrow A}\Rightarrow g_{1}^{:E\Rightarrow A}\times g_{2}^{:E\Rightarrow A}\Rightarrow e^{:E}\Rightarrow f(g_{1}(e),g_{2}(e))\quad. +\text{semigroupFunc}\triangleq f^{:A\times A\rightarrow A}\rightarrow g_{1}^{:E\rightarrow A}\times g_{2}^{:E\rightarrow A}\rightarrow e^{:E}\rightarrow f(g_{1}(e),g_{2}(e))\quad. \] -This defines the new $\oplus$ operation by $g_{1}\oplus g_{2}\triangleq e\Rightarrow g_{1}(e)\oplus_{A}g_{2}(e)$. +This defines the new $\oplus$ operation by $g_{1}\oplus g_{2}\triangleq e\rightarrow g_{1}(e)\oplus_{A}g_{2}(e)$. \begin{lstlisting} def semigroupFunc[E, A: Semigroup] = Semigroup[E => A] { case (g1, g2) => e => g1(e) |+| g2(e) } \end{lstlisting} @@ -2367,10 +2367,10 @@ \subsection{Semigroups\label{subsec:Semigroups-constructions}} {\color{greenunder}\text{right-hand side}:}\quad & e\triangleright\left(f\oplus\left(g\oplus h\right)\right)=f(e)\oplus_{A}\left(e\triangleright(g\oplus h)\right)=f(e)\oplus_{A}g(e)\oplus_{A}h(e)\quad. \end{align*} -The type $A\Rightarrow E$ only allows semigroup operations that discard -the left or the right element: the type signature $f^{:A\times A\Rightarrow A}\Rightarrow h_{1}^{:A\Rightarrow E}\times h_{2}^{:A\Rightarrow E}\Rightarrow\text{???}^{:A\Rightarrow E}$ +The type $A\rightarrow E$ only allows semigroup operations that discard +the left or the right element: the type signature $f^{:A\times A\rightarrow A}\rightarrow h_{1}^{:A\rightarrow E}\times h_{2}^{:A\rightarrow E}\rightarrow\text{???}^{:A\rightarrow E}$ can be implemented only by discarding $f$ and one of $h_{1}$ or -$h_{2}$. Either choice makes $A\Rightarrow E$ into a trivial semigroup. +$h_{2}$. Either choice makes $A\rightarrow E$ into a trivial semigroup. We have seen constructions that create new semigroups via products, co-products, and functions. Thus, any exponential-polynomial type @@ -2386,7 +2386,7 @@ \subsection{Semigroups\label{subsec:Semigroups-constructions}} that a typeclass instance \lstinline!Semigroup[S[A]]! can be created out of \lstinline!Semigroup[A]!. This gives us a function \[ -\text{semigroupS}:\text{Semigroup}^{A}\Rightarrow\text{Semigroup}^{S^{A}}\quad. +\text{semigroupS}:\text{Semigroup}^{A}\rightarrow\text{Semigroup}^{S^{A}}\quad. \] Then a semigroup instance for $T$ is defined recursively as \[ @@ -2412,13 +2412,13 @@ \subsection{Semigroups\label{subsec:Semigroups-constructions}} {\footnotesize{}The }\lstinline!Unit!{\footnotesize{} type, or other fixed type $C$} & {\footnotesize{}$\text{Semigroup}^{C}$} & {\footnotesize{}two trivial semigroups}\tabularnewline \hline -{\footnotesize{}Product of semigroups $A$ and $B$} & {\footnotesize{}$\text{Semigroup}^{A}\times\text{Semigroup}^{B}\Rightarrow\text{Semigroup}^{A\times B}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Product of semigroups $A$ and $B$} & {\footnotesize{}$\text{Semigroup}^{A}\times\text{Semigroup}^{B}\rightarrow\text{Semigroup}^{A\times B}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Co-product of semigroups $A$ and $B$} & {\footnotesize{}$\text{Semigroup}^{A}\times\text{Semigroup}^{B}\Rightarrow\text{Semigroup}^{A+B}$} & {\footnotesize{}four possibilities}\tabularnewline +{\footnotesize{}Co-product of semigroups $A$ and $B$} & {\footnotesize{}$\text{Semigroup}^{A}\times\text{Semigroup}^{B}\rightarrow\text{Semigroup}^{A+B}$} & {\footnotesize{}four possibilities}\tabularnewline \hline -{\footnotesize{}Function from another type $E$} & {\footnotesize{}$\text{Semigroup}^{A}\Rightarrow\text{Semigroup}^{E\Rightarrow A}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Function from another type $E$} & {\footnotesize{}$\text{Semigroup}^{A}\rightarrow\text{Semigroup}^{E\rightarrow A}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Recursive types} & {\footnotesize{}$\text{Semigroup}^{A}\Rightarrow\text{Semigroup}^{S^{A}}$ +{\footnotesize{}Recursive types} & {\footnotesize{}$\text{Semigroup}^{A}\rightarrow\text{Semigroup}^{S^{A}}$ where $T\triangleq S^{T}$} & {\footnotesize{}$\text{Semigroup}^{T}$}\tabularnewline \hline \end{tabular} @@ -2432,9 +2432,9 @@ \subsection{Monoids\label{subsec:Monoids-constructions}} Since a monoid is a semigroup with a default value, a \lstinline!Monoid! instance is a value of type \[ -\text{Monoid}^{A}\triangleq\left(A\times A\Rightarrow A\right)\times A\quad. +\text{Monoid}^{A}\triangleq\left(A\times A\rightarrow A\right)\times A\quad. \] -For the binary operation $A\times A\Rightarrow A$, we can re-use +For the binary operation $A\times A\rightarrow A$, we can re-use the results of structural analysis for semigroups. Additionally, we will need to verify that the default value satisfies monoid's identity laws. The results are shown in Table~\ref{tab:Type-constructions-for-monoid}. @@ -2460,7 +2460,7 @@ \subsection{Monoids\label{subsec:Monoids-constructions}} For two monoids $A$ and $B$, a monoid instance for the product $A\times B$ is computed by \[ -\text{monoidPair}:\forall(A,B).\,\text{Monoid}^{A}\times\text{Monoid}^{B}\Rightarrow\text{Monoid}^{A\times B}\quad. +\text{monoidPair}:\forall(A,B).\,\text{Monoid}^{A}\times\text{Monoid}^{B}\rightarrow\text{Monoid}^{A\times B}\quad. \] The empty value for the monoid $A\times B$ is $e_{A\times B}\triangleq e_{A}\times e_{B}$, the pair of empty values from the monoids $A$ and $B$. The new binary @@ -2525,13 +2525,13 @@ \subsection{Monoids\label{subsec:Monoids-constructions}} \paragraph{Functions} The semigroup construction for function types works for monoids. Exercise~\ref{subsec:tc-Exercise-3} -will show that the function type $R\Rightarrow A$ is a lawful monoid +will show that the function type $R\rightarrow A$ is a lawful monoid for any type $R$ and any monoid $A$. -Additionally, the function type $R\Rightarrow R$ is a monoid for +Additionally, the function type $R\rightarrow R$ is a monoid for any type $R$ (even if $R$ is not a monoid). The operation $\oplus$ -and the empty value are defined as $f^{:R\Rightarrow R}\oplus g^{:R\Rightarrow R}\triangleq f\bef g$ -and $e_{R\Rightarrow R}\triangleq\text{id}^{R}$. The code is +and the empty value are defined as $f^{:R\rightarrow R}\oplus g^{:R\rightarrow R}\triangleq f\bef g$ +and $e_{R\rightarrow R}\triangleq\text{id}^{R}$. The code is \begin{lstlisting} def monoidFunc1[R]: Monoid[R => R] = Monoid( (f, g) => f andThen g, identity ) \end{lstlisting} @@ -2556,7 +2556,7 @@ \subsection{Monoids\label{subsec:Monoids-constructions}} that derives a \lstinline!Monoid! instance for $S^{A}$ from a monoid instance for $A$: \[ -\text{monoidS}:\text{Monoid}^{A}\Rightarrow\text{Monoid}^{S^{A}}\quad. +\text{monoidS}:\text{Monoid}^{A}\rightarrow\text{Monoid}^{S^{A}}\quad. \] A monoid instance for $T$ is then defined recursively by \[ @@ -2564,14 +2564,14 @@ \subsection{Monoids\label{subsec:Monoids-constructions}} \] As we saw before, the code for this definition will terminate only if we implement it as a recursive function. However, the type $\text{Monoid}^{A}$ -is not a function type: it is a pair $\left(A\times A\Rightarrow A\right)\times A$. +is not a function type: it is a pair $\left(A\times A\rightarrow A\right)\times A$. To obtain a working implementation of \lstinline!monoidT!, we need to rewrite that type into an equivalent function type, \[ -\text{Monoid}^{A}=\left(A\times A\Rightarrow A\right)\times A\cong\left(A\times A\Rightarrow A\right)\times\left(\bbnum 1\Rightarrow A\right)\cong\left(\bbnum 1+A\times A\Rightarrow A\right)\quad, +\text{Monoid}^{A}=\left(A\times A\rightarrow A\right)\times A\cong\left(A\times A\rightarrow A\right)\times\left(\bbnum 1\rightarrow A\right)\cong\left(\bbnum 1+A\times A\rightarrow A\right)\quad, \] -where we used the known type equivalences $A\cong\bbnum 1\Rightarrow A$ -and $\left(A\Rightarrow C\right)\times\left(B\Rightarrow C\right)\cong A+B\Rightarrow C$. +where we used the known type equivalences $A\cong\bbnum 1\rightarrow A$ +and $\left(A\rightarrow C\right)\times\left(B\rightarrow C\right)\cong A+B\rightarrow C$. \begin{lstlisting} final case class Monoid[A](methods: Option[(A, A)] => A) \end{lstlisting} @@ -2583,7 +2583,7 @@ \subsection{Monoids\label{subsec:Monoids-constructions}} To illustrate how that works, consider the exponential-polynomial type constructor $S^{\bullet}$ defined as \[ -S^{A}\triangleq\left(\text{Int}+A\right)\times\text{Int}+\text{String}\times\left(A\Rightarrow\left(A\Rightarrow\text{Int}\right)\Rightarrow A\right)\quad. +S^{A}\triangleq\left(\text{Int}+A\right)\times\text{Int}+\text{String}\times\left(A\rightarrow\left(A\rightarrow\text{Int}\right)\rightarrow A\right)\quad. \] \begin{lstlisting} type S[A] = Either[(Either[Int, A], Int), (String, A => (A => Int) => A)] @@ -2724,13 +2724,13 @@ \subsection{Monoids\label{subsec:Monoids-constructions}} types} & {\footnotesize{}$\text{Monoid}^{\bbnum 1}$, $\text{Monoid}^{\text{Int}}$, etc.} & {\footnotesize{}custom code}\tabularnewline \hline -{\footnotesize{}Product of monoids $A$ and $B$} & {\footnotesize{}$\text{Monoid}^{A}\times\text{Monoid}^{B}\Rightarrow\text{Monoid}^{A\times B}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Product of monoids $A$ and $B$} & {\footnotesize{}$\text{Monoid}^{A}\times\text{Monoid}^{B}\rightarrow\text{Monoid}^{A\times B}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Co-product of monoid $A$ and semigroup $B$} & {\footnotesize{}$\text{Monoid}^{A}\times\text{Semigroup}^{B}\Rightarrow\text{Monoid}^{A+B}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Co-product of monoid $A$ and semigroup $B$} & {\footnotesize{}$\text{Monoid}^{A}\times\text{Semigroup}^{B}\rightarrow\text{Monoid}^{A+B}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Function from another type $E$} & {\footnotesize{}$\text{Monoid}^{A}\Rightarrow\text{Monoid}^{E\Rightarrow A}$} & {\footnotesize{}$\text{Monoid}^{E\Rightarrow A}$}\tabularnewline +{\footnotesize{}Function from another type $E$} & {\footnotesize{}$\text{Monoid}^{A}\rightarrow\text{Monoid}^{E\rightarrow A}$} & {\footnotesize{}$\text{Monoid}^{E\rightarrow A}$}\tabularnewline \hline -{\footnotesize{}Recursive types} & {\footnotesize{}$\text{Monoid}^{A}\Rightarrow\text{Monoid}^{S^{A}}$ +{\footnotesize{}Recursive types} & {\footnotesize{}$\text{Monoid}^{A}\rightarrow\text{Monoid}^{S^{A}}$ where $T\triangleq S^{T}$} & {\footnotesize{}$\text{Monoid}^{T}$}\tabularnewline \hline \end{tabular} @@ -2767,7 +2767,7 @@ \subsection{Pointed functors: motivation and laws\label{subsec:Pointed-functors: \end{wrapfigure}% \noindent The code notation for this function is $\text{pu}_{F}$, -and the type signature is written as $\text{pu}_{F}:\forall A.\,A\Rightarrow F^{A}$. +and the type signature is written as $\text{pu}_{F}:\forall A.\,A\rightarrow F^{A}$. Some examples of pointed functors in Scala are \lstinline!Option!, \lstinline!List!, \lstinline!Try!, and \lstinline!Future!. Each @@ -2818,7 +2818,7 @@ \subsection{Pointed functors: motivation and laws\label{subsec:Pointed-functors: \lstinline!.map(x => x + 1)!, we expect to obtain a list containing $124$; any other result would break our intuition about ``wrapping''. We can generalize this situation to an arbitrary value $x^{:A}$ wrapped -using \lstinline!pure! and a function $f^{:A\Rightarrow B}$ applied +using \lstinline!pure! and a function $f^{:A\rightarrow B}$ applied to the wrapped value via \lstinline!map!: \begin{wrapfigure}{l}{0.41\columnwidth}% @@ -2832,7 +2832,7 @@ \subsection{Pointed functors: motivation and laws\label{subsec:Pointed-functors: \noindent We expect that the result should be the same as a wrapped $f(x)$. This expectation can be formulated as a law, called the \textbf{naturality law}\index{naturality law!of pure@of \texttt{pure}} of \lstinline!pure!; -it must hold for any $f^{:A\Rightarrow B}$: +it must hold for any $f^{:A\rightarrow B}$: \begin{wrapfigure}{l}{0.4\columnwidth}% \vspace{-0.8\baselineskip} @@ -2868,29 +2868,29 @@ \subsection{Pointed functors: motivation and laws\label{subsec:Pointed-functors: \noindent This motivates the following definition: A functor $F^{\bullet}$ is \index{pointed functor}\textbf{pointed} if there exists a fully -parametric function $\text{pu}_{T}:\forall A.\,A\Rightarrow F^{A}$ +parametric function $\text{pu}_{T}:\forall A.\,A\rightarrow F^{A}$ satisfying the naturality law~(\ref{eq:naturality-law-of-pure}) -for any function $f^{:A\Rightarrow B}$. +for any function $f^{:A\rightarrow B}$. It turns out that we can avoid checking the naturality law for pointed functors if we use a trick: reduce \lstinline!pure! to a simpler but equivalent form for which the law is satisfied automatically. Both sides of the naturality law~(\ref{eq:naturality-law-of-pure}) -are functions of type $A\Rightarrow F^{B}$. The trick is to set $A=\bbnum 1$ -and $f^{:\bbnum 1\Rightarrow B}\triangleq(\_\Rightarrow b)$, where +are functions of type $A\rightarrow F^{B}$. The trick is to set $A=\bbnum 1$ +and $f^{:\bbnum 1\rightarrow B}\triangleq(\_\rightarrow b)$, where $b^{:B}$ is any fixed value. Both sides of the naturality law can then be applied to the unit value $1$ and must evaluate to the same result, \[ -1\triangleright\text{pu}_{F}\triangleright(\_\Rightarrow b)^{\uparrow F}=1\triangleright f\triangleright\text{pu}_{F}\quad. +1\triangleright\text{pu}_{F}\triangleright(\_\rightarrow b)^{\uparrow F}=1\triangleright f\triangleright\text{pu}_{F}\quad. \] Since $1\triangleright f=f(1)=b$, we find \begin{equation} -\text{pu}_{F}(1)\triangleright(\_\Rightarrow b)^{\uparrow F}=\text{pu}_{F}(b)\quad.\label{eq:pu-via-wu} +\text{pu}_{F}(1)\triangleright(\_\rightarrow b)^{\uparrow F}=\text{pu}_{F}(b)\quad.\label{eq:pu-via-wu} \end{equation} The naturality law~(\ref{eq:naturality-law-of-pure}) applies to -all types $A,B$ and to any function $f^{:A\Rightarrow B}$. Thus, +all types $A,B$ and to any function $f^{:A\rightarrow B}$. Thus, Eq.~(\ref{eq:pu-via-wu}) must apply to an arbitrary value $b^{:B}$ for any type $B$. That formula expresses the function $\text{pu}_{F}$ through one value $\text{pu}_{F}(1)$ of type $F^{\bbnum 1}$. This @@ -2908,7 +2908,7 @@ \subsection{Pointed functors: motivation and laws\label{subsec:Pointed-functors: is sufficient to recover the entire function $\text{pu}_{F}(b)$ by using the code \[ -\text{pu}_{F}(b)\triangleq\text{pu}_{F}(1)\triangleright(\_\Rightarrow b)^{\uparrow F}\quad +\text{pu}_{F}(b)\triangleq\text{pu}_{F}(1)\triangleright(\_\rightarrow b)^{\uparrow F}\quad \] So, given just a ``wrapped unit'' value (denoted $\text{wu}_{F}$) of type $F^{\bbnum 1}$, we can define a new function $\text{pu}_{F}$: @@ -2923,15 +2923,15 @@ \subsection{Pointed functors: motivation and laws\label{subsec:Pointed-functors: \noindent \vspace{-1\baselineskip} \begin{equation} -\text{pu}_{F}^{:A\Rightarrow F^{A}}\triangleq x^{:A}\Rightarrow\text{wu}_{F}\triangleright(\_\Rightarrow x)^{\uparrow F}\quad.\label{eq:pu-via-wu-def} +\text{pu}_{F}^{:A\rightarrow F^{A}}\triangleq x^{:A}\rightarrow\text{wu}_{F}\triangleright(\_\rightarrow x)^{\uparrow F}\quad.\label{eq:pu-via-wu-def} \end{equation} Does this function satisfy the naturality law with respect to an arbitrary -$f^{:A\Rightarrow B}$? It does: +$f^{:A\rightarrow B}$? It does: \begin{align*} {\color{greenunder}\text{expect to equal }x\triangleright f\bef\text{pu}_{F}:}\quad & x\triangleright\text{pu}_{F}\bef f^{\uparrow F}\\ -{\color{greenunder}\text{definition of }\text{pu}_{F}:}\quad & =\text{wu}_{F}\triangleright(\_\Rightarrow x)^{\uparrow F}\bef f^{\uparrow F}\\ -{\color{greenunder}\text{functor composition law of }F:}\quad & =\text{wu}_{F}\triangleright(\left(\_\Rightarrow x\right)\bef f)^{\uparrow F}\\ -{\color{greenunder}\text{compute function composition}:}\quad & =\text{wu}_{F}\triangleright(\_\Rightarrow f(x))^{\uparrow F}\\ +{\color{greenunder}\text{definition of }\text{pu}_{F}:}\quad & =\text{wu}_{F}\triangleright(\_\rightarrow x)^{\uparrow F}\bef f^{\uparrow F}\\ +{\color{greenunder}\text{functor composition law of }F:}\quad & =\text{wu}_{F}\triangleright(\left(\_\rightarrow x\right)\bef f)^{\uparrow F}\\ +{\color{greenunder}\text{compute function composition}:}\quad & =\text{wu}_{F}\triangleright(\_\rightarrow f(x))^{\uparrow F}\\ {\color{greenunder}\text{definition of }\text{pu}_{F}:}\quad & =\text{pu}_{F}(f(x))\\ {\color{greenunder}\triangleright\text{-notation}:}\quad & =x\triangleright f\triangleright\text{pu}_{F}=x\triangleright f\bef\text{pu}_{F}\quad. \end{align*} @@ -2939,8 +2939,8 @@ \subsection{Pointed functors: motivation and laws\label{subsec:Pointed-functors: because \begin{align*} {\color{greenunder}\triangleright\text{-notation}:}\quad & \text{pu}_{F}(1)=1\triangleright\text{pu}_{F}\\ -{\color{greenunder}\text{definition of }\text{pu}_{F}\text{ via }\text{wu}_{F}:}\quad & =\text{wu}_{F}\triangleright(\_\Rightarrow1)^{\uparrow F}\\ -{\color{greenunder}\text{the function }(\_\Rightarrow1)\text{ is the identity function }\text{id}^{:\bbnum 1\Rightarrow\bbnum 1}:}\quad & =\text{wu}_{F}\triangleright\text{id}^{\uparrow F}\\ +{\color{greenunder}\text{definition of }\text{pu}_{F}\text{ via }\text{wu}_{F}:}\quad & =\text{wu}_{F}\triangleright(\_\rightarrow1)^{\uparrow F}\\ +{\color{greenunder}\text{the function }(\_\rightarrow1)\text{ is the identity function }\text{id}^{:\bbnum 1\rightarrow\bbnum 1}:}\quad & =\text{wu}_{F}\triangleright\text{id}^{\uparrow F}\\ {\color{greenunder}\text{functor identity law of }F:}\quad & =\text{wu}_{F}\triangleright\text{id}=\text{wu}_{F}\quad. \end{align*} @@ -3099,7 +3099,7 @@ \subsection{Pointed functors: structural analysis\label{subsec:Pointed-functors: Section~\ref{subsec:Pointed-contrafunctors} below). A pointed contrafunctor has a ``wrapped unit'' value of type $F^{\bbnum 1}$, which can be transformed into $F^{A}$ for any type $A$ by using \lstinline!contramap! -with a constant function $A\Rightarrow\bbnum 1$: +with a constant function $A\rightarrow\bbnum 1$: \begin{lstlisting} def cpure[F[_]: Pointed : Contrafunctor, A]: F[A] = implicitly[Pointed[F]].wu.cmap(_ => ()) \end{lstlisting} @@ -3146,11 +3146,11 @@ \subsection{Pointed functors: structural analysis\label{subsec:Pointed-functors: \paragraph{Functions} If $C$ is any contrafunctor and $F$ is a pointed functor, the exponential -functor $L^{A}\triangleq C^{A}\Rightarrow F^{A}$ will be pointed -if we are able to produce a value $\text{wu}_{L}:C^{\bbnum 1}\Rightarrow F^{\bbnum 1}$. +functor $L^{A}\triangleq C^{A}\rightarrow F^{A}$ will be pointed +if we are able to produce a value $\text{wu}_{L}:C^{\bbnum 1}\rightarrow F^{\bbnum 1}$. We already have a value $\text{wu}_{F}:F^{\bbnum 1}$, and we cannot use a value of type $C^{\bbnum 1}$ with a general contrafunctor $C$. -So, we have to set $\text{wu}_{L}\triangleq(\_\Rightarrow\text{wu}_{F})$. +So, we have to set $\text{wu}_{L}\triangleq(\_\rightarrow\text{wu}_{F})$. This makes $L$ into a pointed functor. \begin{lstlisting} def pointedFuncFG[F[_]: Pointed, C[_]]: Pointed[Lambda[X => C[X] => F[X]]] = @@ -3232,7 +3232,7 @@ \subsection{Pointed functors: structural analysis\label{subsec:Pointed-functors: Can we recognize a pointed functor $F$ by looking at its type expression, e.g. \[ -F^{A,B}\triangleq\left((\bbnum 1+A\Rightarrow\text{Int})\Rightarrow A\times B\right)+\text{String}\times A\times A\quad? +F^{A,B}\triangleq\left((\bbnum 1+A\rightarrow\text{Int})\rightarrow A\times B\right)+\text{String}\times A\times A\quad? \] This type constructor is a functor in both $A$ and $B$, and we ask whether $F$ is pointed with respect to $A$ and/or with respect to @@ -3241,14 +3241,14 @@ \subsection{Pointed functors: structural analysis\label{subsec:Pointed-functors: To answer this question with respect to $A$, we set $A=\bbnum 1$ in $F^{A,B}$ and obtain the type expression \[ -F^{\bbnum 1,B}=\left((\bbnum 1+\bbnum 1\Rightarrow\text{Int})\Rightarrow\bbnum 1\times B\right)+\text{String}\times\bbnum 1\times\bbnum 1\cong\left(\left(\bbnum 2\Rightarrow\text{Int}\right)\Rightarrow B\right)+\text{String}\quad. +F^{\bbnum 1,B}=\left((\bbnum 1+\bbnum 1\rightarrow\text{Int})\rightarrow\bbnum 1\times B\right)+\text{String}\times\bbnum 1\times\bbnum 1\cong\left(\left(\bbnum 2\rightarrow\text{Int}\right)\rightarrow B\right)+\text{String}\quad. \] The functor $F$ will be pointed with respect to $A$ if we can compute a value of this type from scratch. At the outer level, this type expression is a disjunctive type with two parts; it is sufficient to compute -one of the parts. Can we compute a value of type $\left(\bbnum 2\Rightarrow\text{Int}\right)\Rightarrow B$? +one of the parts. Can we compute a value of type $\left(\bbnum 2\rightarrow\text{Int}\right)\rightarrow B$? Since the parameter $B$ is an arbitrary, unknown type, we cannot -construct values of type $B$ using a given value of type $\bbnum 2\Rightarrow\text{Int}$. +construct values of type $B$ using a given value of type $\bbnum 2\rightarrow\text{Int}$. The remaining possibility is to compute the second part of the co-product, which is $\text{String}\times\bbnum 1\times\bbnum 1$. We are able to compute a value of this type because \lstinline!String! is a fixed @@ -3258,13 +3258,13 @@ \subsection{Pointed functors: structural analysis\label{subsec:Pointed-functors: Considering now the type parameter $B$, we set $B=\bbnum 1$ and obtain \[ -F^{A,\bbnum 1}=\left((\bbnum 1+A\Rightarrow\text{Int})\Rightarrow A\times\bbnum 1\right)+\text{String}\times A\times A\quad. +F^{A,\bbnum 1}=\left((\bbnum 1+A\rightarrow\text{Int})\rightarrow A\times\bbnum 1\right)+\text{String}\times A\times A\quad. \] The type $A$ is now an arbitrary and unknown type, so we cannot compute any values of $A$ or $\text{String}\times A\times A$ from scratch. -The function type $(\bbnum 1+A\Rightarrow\text{Int})\Rightarrow A\times\bbnum 1$ +The function type $(\bbnum 1+A\rightarrow\text{Int})\rightarrow A\times\bbnum 1$ cannot be implemented because a value of type $A$ cannot be computed -from a function $\bbnum 1+A\Rightarrow\text{Int}$ that \emph{consumes} +from a function $\bbnum 1+A\rightarrow\text{Int}$ that \emph{consumes} values of type $A$. So, $F^{A,B}$ is not pointed with respect to $B$. @@ -3279,15 +3279,15 @@ \subsection{Pointed functors: structural analysis\label{subsec:Pointed-functors: \hline {\footnotesize{}Identity functor} & {\footnotesize{}$\bbnum 1$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Composition of pointed functors/contrafunctors} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}\times\text{Pointed}^{G^{\bullet}}\Rightarrow\text{Pointed}^{F^{G^{\bullet}}}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Composition of pointed functors/contrafunctors} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}\times\text{Pointed}^{G^{\bullet}}\rightarrow\text{Pointed}^{F^{G^{\bullet}}}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Product of pointed functors $F$ and $G$} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}\times\text{Pointed}^{G^{\bullet}}\Rightarrow\text{Pointed}^{F^{\bullet}\times G^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Product of pointed functors $F$ and $G$} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}\times\text{Pointed}^{G^{\bullet}}\rightarrow\text{Pointed}^{F^{\bullet}\times G^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Co-product of a pointed functor $F$ and any $G$} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}\times\text{Functor}^{G^{\bullet}}\Rightarrow\text{Pointed}^{F^{\bullet}+G^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Co-product of a pointed functor $F$ and any $G$} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}\times\text{Functor}^{G^{\bullet}}\rightarrow\text{Pointed}^{F^{\bullet}+G^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Function from any $C$ to a pointed $F$} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}\times\text{Contrafunctor}^{C^{\bullet}}\Rightarrow\text{Pointed}^{C^{\bullet}\Rightarrow F^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Function from any $C$ to a pointed $F$} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}\times\text{Contrafunctor}^{C^{\bullet}}\rightarrow\text{Pointed}^{C^{\bullet}\rightarrow F^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Recursive types} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}\Rightarrow\text{Pointed}^{S^{\bullet,F^{\bullet}}}$ +{\footnotesize{}Recursive types} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}\rightarrow\text{Pointed}^{S^{\bullet,F^{\bullet}}}$ where $F^{A}\triangleq S^{A,F^{A}}$} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}$}\tabularnewline \hline \end{tabular} @@ -3312,7 +3312,7 @@ \subsection{Co-pointed functors} \noindent \vspace{-0.5\baselineskip} \[ -\text{ex}:\forall A.\,F^{A}\Rightarrow A\quad. +\text{ex}:\forall A.\,F^{A}\rightarrow A\quad. \] Functors having this operation are called \index{co-pointed functor}\textbf{co-pointed}. @@ -3350,13 +3350,13 @@ \subsection{Co-pointed functors} a value of type $A$ and then transformed that value with $f$. Both sides of the law~(\ref{eq:naturality-law-of-extract}) are functions -of type $F^{A}\Rightarrow B$. We saw in the previous section that +of type $F^{A}\rightarrow B$. We saw in the previous section that the \lstinline!pure! method of the \lstinline!Pointed! typeclass is computationally equivalent to a single chosen value of type $F^{\bbnum 1}$ when $F$ is a functor. That provides a simpler form of the \lstinline!Pointed! typeclass. For co-pointed functors, there is no simpler form of the -\lstinline!extract! method. If we set $A=\bbnum 1$ and $f^{:\bbnum 1\Rightarrow B}\triangleq(1\Rightarrow b)$ -in the naturality law, both sides will become functions of type $F^{\bbnum 1}\Rightarrow B$. +\lstinline!extract! method. If we set $A=\bbnum 1$ and $f^{:\bbnum 1\rightarrow B}\triangleq(1\rightarrow b)$ +in the naturality law, both sides will become functions of type $F^{\bbnum 1}\rightarrow B$. But the type $F^{\bbnum 1}$ might be void, or a value of type $F^{\bbnum 1}$ may not be computable via fully parametric code. So, we cannot deduce any further information from the naturality law of co-pointed functors. @@ -3387,14 +3387,14 @@ \subsection{Co-pointed functors} \paragraph{Fixed types} A constant functor $\text{Const}^{Z,A}\triangleq Z$ is \emph{not} -co-pointed because we cannot implement $\forall A.\,Z\Rightarrow A$ +co-pointed because we cannot implement $\forall A.\,Z\rightarrow A$ (a value of an arbitrary type $A$ cannot be computed from a value of a fixed type $Z$). \paragraph{Type parameters} The identity functor $\text{Id}^{A}\triangleq A$ is co-pointed with -$\text{ex}\triangleq\text{id}^{:A\Rightarrow A}$. An identity function +$\text{ex}\triangleq\text{id}^{:A\rightarrow A}$. An identity function will always satisfy any naturality law. \begin{lstlisting} type Id[A] = A @@ -3403,7 +3403,7 @@ \subsection{Co-pointed functors} Composition of two co-pointed functors $F$, $G$ is co-pointed: \[ -\text{ex}_{F\circ G}\triangleq h^{:F^{G^{A}}}\Rightarrow\text{ex}_{G}(\text{ex}_{F}(h))\quad\text{ or equivalently }\quad\text{ex}_{F\circ G}=\text{ex}_{F}\bef\text{ex}_{G}\quad. +\text{ex}_{F\circ G}\triangleq h^{:F^{G^{A}}}\rightarrow\text{ex}_{G}(\text{ex}_{F}(h))\quad\text{ or equivalently }\quad\text{ex}_{F\circ G}=\text{ex}_{F}\bef\text{ex}_{G}\quad. \] \begin{lstlisting} def copointedFoG[F[_]: Copointed, G[_]: Copointed]: Copointed[Lambda[X => F[G[X]]]] = @@ -3423,16 +3423,16 @@ \subsection{Co-pointed functors} \paragraph{Products} If functors $F$ and $G$ are co-pointed, we can implement a function -of type $F^{A}\times G^{A}\Rightarrow A$ in two different ways: by +of type $F^{A}\times G^{A}\rightarrow A$ in two different ways: by discarding $F^{A}$ or by discarding $G^{A}$. With either choice, the functor product $F^{\bullet}\times G^{\bullet}$ is made into a co-pointed functor. For instance, if we choose to discard $G^{A}$ then the functor $G$ will not need to be co-pointed, and the code for the \lstinline!extract! method will be \[ -\text{ex}_{F\times G}\triangleq f^{:F^{A}}\times g^{:G^{A}}\Rightarrow\text{ex}_{F}(f)=\nabla_{1}\bef\text{ex}_{F}\quad, +\text{ex}_{F\times G}\triangleq f^{:F^{A}}\times g^{:G^{A}}\rightarrow\text{ex}_{F}(f)=\nabla_{1}\bef\text{ex}_{F}\quad, \] -where we used the pair projection function $\nabla_{1}\triangleq(a\times b\Rightarrow a)$. +where we used the pair projection function $\nabla_{1}\triangleq(a\times b\rightarrow a)$. \begin{lstlisting} def copointedFxG[F[_]: Copointed, G[_]]: Copointed[Lambda[X => (F[X],G[X])]] = new Copointed[Lambda[X => (F[X], G[X])]] { @@ -3460,7 +3460,7 @@ \subsection{Co-pointed functors} \paragraph{Co-products} For co-pointed functors $F$ and $G$, there is only one possible -implementation of the type signature $\text{ex}_{F+G}:F^{A}+G^{A}\Rightarrow A$, +implementation of the type signature $\text{ex}_{F+G}:F^{A}+G^{A}\rightarrow A$, given that we have functions $\text{ex}_{F}$ and $\text{ex}_{G}$: \begin{wrapfigure}{l}{0.62\columnwidth}% @@ -3515,11 +3515,11 @@ \subsection{Co-pointed functors} \paragraph{Functions} -An exponential functor of the form $L^{A}\triangleq C^{A}\Rightarrow P^{A}$ +An exponential functor of the form $L^{A}\triangleq C^{A}\rightarrow P^{A}$ (where $C$ is a contrafunctor and $P$ is a functor) will be co-pointed -if we can implement a function of type $\forall A.\,(C^{A}\Rightarrow P^{A})\Rightarrow A$, +if we can implement a function of type $\forall A.\,(C^{A}\rightarrow P^{A})\rightarrow A$, \[ -\text{ex}_{L}\triangleq h^{:C^{A}\Rightarrow P^{A}}\Rightarrow\text{???}^{:A}\quad. +\text{ex}_{L}\triangleq h^{:C^{A}\rightarrow P^{A}}\rightarrow\text{???}^{:A}\quad. \] Since the type $A$ is arbitrary, the only way of computing a value of type $A$ is somehow to use the function $h$. The only way of @@ -3531,13 +3531,13 @@ \subsection{Co-pointed functors} Assuming that $C$ is pointed and denoting its \lstinline!cpure! method by $\text{pu}_{C}$, we can thus compute a value of type $P^{A}$ as $h(\text{pu}_{C})$. To extract $A$ from $P^{A}$, we need to -assume additionally that $P$ is co-pointed and use its method $\text{ex}_{P}:P^{A}\Rightarrow A$. +assume additionally that $P$ is co-pointed and use its method $\text{ex}_{P}:P^{A}\rightarrow A$. Finally we have \begin{equation} -\text{ex}_{L}\triangleq h^{:C^{A}\Rightarrow P^{A}}\Rightarrow\text{ex}_{P}(h(\text{pu}_{C}))\quad\quad\text{ or equivalently}\quad\quad h^{:C^{A}\Rightarrow P^{A}}\triangleright\text{ex}_{L}=\text{pu}_{C}\triangleright h\triangleright\text{ex}_{P}\quad.\label{eq:def-of-ex-for-C-mapsto-P} +\text{ex}_{L}\triangleq h^{:C^{A}\rightarrow P^{A}}\rightarrow\text{ex}_{P}(h(\text{pu}_{C}))\quad\quad\text{ or equivalently}\quad\quad h^{:C^{A}\rightarrow P^{A}}\triangleright\text{ex}_{L}=\text{pu}_{C}\triangleright h\triangleright\text{ex}_{P}\quad.\label{eq:def-of-ex-for-C-mapsto-P} \end{equation} To verify the naturality law, we apply both sides to an arbitrary -$h^{:C^{A}\Rightarrow P^{A}}$ and compute +$h^{:C^{A}\rightarrow P^{A}}$ and compute \begin{align*} {\color{greenunder}\text{expect to equal }h\triangleright\text{ex}_{L}\bef f:}\quad & h\triangleright f^{\uparrow L}\bef\text{ex}_{L}=(h\triangleright f^{\uparrow L})\:\gunderline{\triangleright\,\text{ex}_{L}}\\ {\color{greenunder}\text{use Eq.~(\ref{eq:def-of-ex-for-C-mapsto-P})}:}\quad & =\text{pu}_{C}\triangleright(h\triangleright f^{\uparrow L})\triangleright\text{ex}_{P}=\text{pu}_{C}\triangleright\gunderline{(h\triangleright f^{\uparrow L})}\bef\text{ex}_{P}\\ @@ -3567,15 +3567,15 @@ \subsection{Co-pointed functors} Consider a functor $F$ defined by a recursive equation $F^{A}\triangleq S^{A,F^{A}}$ where $S$ is a bifunctor (see Section~\ref{subsec:Bifunctors}). -The functor $F$ is co-pointed if a method $\text{ex}_{F}:(F^{A}\Rightarrow A)\cong(S^{A,F^{A}}\Rightarrow A)$ +The functor $F$ is co-pointed if a method $\text{ex}_{F}:(F^{A}\rightarrow A)\cong(S^{A,F^{A}}\rightarrow A)$ can be defined. Since the recursive definition of $F$ uses $F^{A}$ as a type argument in $S^{A,F^{A}}$, we may assume (by induction) -that an extractor function $F^{A}\Rightarrow A$ is already available +that an extractor function $F^{A}\rightarrow A$ is already available when applied to the recursively used $F^{A}$. Then we can use the -\lstinline!bimap! method of $S$ to map $S^{A,F^{A}}\Rightarrow S^{A,A}$. +\lstinline!bimap! method of $S$ to map $S^{A,F^{A}}\rightarrow S^{A,A}$. It remains to extract a value of type $A$ out of a bifunctor value $S^{A,A}$. We call a bifunctor $S$ \textbf{co-pointed}\index{co-pointed bifunctor} -if a fully parametric function $\text{ex}_{S}:S^{A,A}\Rightarrow A$ +if a fully parametric function $\text{ex}_{S}:S^{A,A}\rightarrow A$ exists satisfying the corresponding naturality law \begin{equation} \text{ex}_{S}\bef f=\text{bimap}_{S}(f)(f)\bef\text{ex}_{S}\quad.\label{eq:copointed-bifunctor-naturality-law} @@ -3583,7 +3583,7 @@ \subsection{Co-pointed functors} Assuming that $S$ is co-pointed, we can finally define $\text{ex}_{F}$ by recursion, \[ -\text{ex}_{F}\triangleq s^{:S^{A,F^{A}}}\Rightarrow s\triangleright\big(\text{bimap}_{S}(\text{id})(\text{ex}_{F})\big)\triangleright\text{ex}_{S}\quad\text{ or equivalently}\quad\text{ex}_{F}\triangleq\text{bimap}_{S}(\text{id})(\text{ex}_{F})\bef\text{ex}_{S}\quad. +\text{ex}_{F}\triangleq s^{:S^{A,F^{A}}}\rightarrow s\triangleright\big(\text{bimap}_{S}(\text{id})(\text{ex}_{F})\big)\triangleright\text{ex}_{S}\quad\text{ or equivalently}\quad\text{ex}_{F}\triangleq\text{bimap}_{S}(\text{id})(\text{ex}_{F})\bef\text{ex}_{S}\quad. \] To verify the naturality law for $\text{ex}_{F}$, we denote recursive uses by an overline and compute: @@ -3604,7 +3604,7 @@ \subsection{Co-pointed functors} F^{A}\triangleq S^{A,F^{A}}=A+F^{A}\times F^{A}\quad. \] The bifunctor $S$ is co-pointed because there exists a suitable function -$\text{ex}_{S}:S^{A,A}\Rightarrow A$. +$\text{ex}_{S}:S^{A,A}\rightarrow A$. \begin{wrapfigure}{l}{0.48\columnwidth}% \vspace{-0.35\baselineskip} @@ -3656,7 +3656,7 @@ \subsection{Co-pointed functors} Can we recognize a co-pointed functor $F$ by looking at its type expression, e.g. \[ -F^{A,B}\triangleq\left(\left(\bbnum 1+A\Rightarrow\text{Int}\right)\Rightarrow A\times B\right)+\text{String}\times A\times A\quad? +F^{A,B}\triangleq\left(\left(\bbnum 1+A\rightarrow\text{Int}\right)\rightarrow A\times B\right)+\text{String}\times A\times A\quad? \] The constructions shown in this section tell us that a co-product of two co-pointed functors is again co-pointed. Let us first check @@ -3667,15 +3667,15 @@ \subsection{Co-pointed functors} It remains to consider $A$ as the type parameter. The type constructor $\text{String}\times A\times A$ is co-pointed, but we still need -to check $\left(\bbnum 1+A\Rightarrow\text{Int}\right)\Rightarrow A\times B$, -which is a function type. The function construction requires $\bbnum 1+A\Rightarrow\text{Int}$ +to check $\left(\bbnum 1+A\rightarrow\text{Int}\right)\rightarrow A\times B$, +which is a function type. The function construction requires $\bbnum 1+A\rightarrow\text{Int}$ to be a pointed contrafunctor and $A\times B$ to be a co-pointed functor (with respect to $A$). It is clear that $A\times B$ is co-pointed -with respect to $A$ since we have $\nabla_{1}:A\times B\Rightarrow A$. -It remains to check that the contrafunctor $C^{A}\triangleq\bbnum 1+A\Rightarrow\text{Int}$ +with respect to $A$ since we have $\nabla_{1}:A\times B\rightarrow A$. +It remains to check that the contrafunctor $C^{A}\triangleq\bbnum 1+A\rightarrow\text{Int}$ is pointed. A contrafunctor $C^{\bullet}$ is pointed if values of type $C^{\bbnum 1}$ can be computed (see Section~\ref{subsec:Pointed-contrafunctors}); -this requires us to compute a value of type $\bbnum 1+\bbnum 1\Rightarrow\text{Int}$. +this requires us to compute a value of type $\bbnum 1+\bbnum 1\rightarrow\text{Int}$. One such value is \lstinline!{ _ => 0 }!, a constant function that always returns the integer $0$. @@ -3689,17 +3689,17 @@ \subsection{Co-pointed functors} \textbf{\footnotesize{}Construction} & \textbf{\footnotesize{}Type signature to implement} & \textbf{\footnotesize{}Results}\tabularnewline \hline \hline -{\footnotesize{}Identity functor} & {\footnotesize{}$\text{id}:A\Rightarrow A$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Identity functor} & {\footnotesize{}$\text{id}:A\rightarrow A$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Composition of co-pointed functors} & {\footnotesize{}$\text{Copointed}^{F^{\bullet}}\times\text{Copointed}^{G^{\bullet}}\Rightarrow\text{Copointed}^{F^{G^{\bullet}}}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Composition of co-pointed functors} & {\footnotesize{}$\text{Copointed}^{F^{\bullet}}\times\text{Copointed}^{G^{\bullet}}\rightarrow\text{Copointed}^{F^{G^{\bullet}}}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Product of co-pointed functor $F$ and any $G$} & {\footnotesize{}$\text{Copointed}^{F^{\bullet}}\times\text{Functor}^{G^{\bullet}}\Rightarrow\text{Copointed}^{F^{\bullet}\times G^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Product of co-pointed functor $F$ and any $G$} & {\footnotesize{}$\text{Copointed}^{F^{\bullet}}\times\text{Functor}^{G^{\bullet}}\rightarrow\text{Copointed}^{F^{\bullet}\times G^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Co-product of co-pointed functors $F$ and $G$} & {\footnotesize{}$\text{Copointed}^{F^{\bullet}}\times\text{Copointed}^{G^{\bullet}}\Rightarrow\text{Copointed}^{F^{\bullet}+G^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Co-product of co-pointed functors $F$ and $G$} & {\footnotesize{}$\text{Copointed}^{F^{\bullet}}\times\text{Copointed}^{G^{\bullet}}\rightarrow\text{Copointed}^{F^{\bullet}+G^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Function from pointed $C$ to co-pointed $F$} & {\footnotesize{}$\text{\ensuremath{\text{Pointed}^{C^{\bullet}}}}\times\text{Copointed}^{F^{\bullet}}\Rightarrow\text{Copointed}^{C^{\bullet}\Rightarrow F^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Function from pointed $C$ to co-pointed $F$} & {\footnotesize{}$\text{\ensuremath{\text{Pointed}^{C^{\bullet}}}}\times\text{Copointed}^{F^{\bullet}}\rightarrow\text{Copointed}^{C^{\bullet}\rightarrow F^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Recursive types} & {\footnotesize{}$\text{Copointed}^{F^{\bullet}}\Rightarrow\text{Copointed}^{S^{\bullet,F^{\bullet}}}$ +{\footnotesize{}Recursive types} & {\footnotesize{}$\text{Copointed}^{F^{\bullet}}\rightarrow\text{Copointed}^{S^{\bullet,F^{\bullet}}}$ where $F^{A}\triangleq S^{A,F^{A}}$} & {\footnotesize{}$\text{Copointed}^{F^{\bullet}}$}\tabularnewline \hline \end{tabular} @@ -3714,9 +3714,9 @@ \subsection{Pointed contrafunctors\label{subsec:Pointed-contrafunctors}} contrafunctor $C^{\bullet}$ to have a method $\text{pu}_{C}$ of type $\forall A.\,C^{A}$; we called such contrafunctors \textbf{pointed}. We also needed to assume that the naturality law holds for all functions -$f^{:A\Rightarrow B}$, +$f^{:A\rightarrow B}$, \begin{equation} -\text{pu}_{C}\triangleright f^{\downarrow C}=\text{pu}_{C}\quad\text{ or equivalently }\quad\text{cmap}_{C}(f^{:A\Rightarrow B})(\text{pu}_{C}^{:C^{B}})=\text{pu}_{C}^{:C^{A}}\quad.\label{eq:naturality-law-for-pure-for-contrafunctors} +\text{pu}_{C}\triangleright f^{\downarrow C}=\text{pu}_{C}\quad\text{ or equivalently }\quad\text{cmap}_{C}(f^{:A\rightarrow B})(\text{pu}_{C}^{:C^{B}})=\text{pu}_{C}^{:C^{A}}\quad.\label{eq:naturality-law-for-pure-for-contrafunctors} \end{equation} \[ \xymatrix{\xyScaleY{2.0pc}\xyScaleX{3.0pc}\text{pu}_{C}:C^{B}\ar[d]\sb(0.5){\text{cmap}_{C}(f)} & B\\ @@ -3728,7 +3728,7 @@ \subsection{Pointed contrafunctors\label{subsec:Pointed-contrafunctors}} and denoting $\text{wu}_{C}\triangleq\text{pu}_{C}^{\bbnum 1}$. The law~(\ref{eq:naturality-law-for-pure-for-contrafunctors}) then gives \begin{equation} -\text{pu}_{C}^{A}=\text{wu}_{C}\triangleright(\_^{:A}\Rightarrow1)^{\downarrow C}\quad.\label{eq:def-pure-via-wu-for-contrafunctor} +\text{pu}_{C}^{A}=\text{wu}_{C}\triangleright(\_^{:A}\rightarrow1)^{\downarrow C}\quad.\label{eq:def-pure-via-wu-for-contrafunctor} \end{equation} In this way, we express the \lstinline!pure! method through a chosen value $\text{wu}_{C}:C^{\bbnum 1}$. For the same reasons as in the @@ -3739,9 +3739,9 @@ \subsection{Pointed contrafunctors\label{subsec:Pointed-contrafunctors}} To verify that, compute \begin{align*} {\color{greenunder}\text{expect to equal }\text{pu}_{C}^{A}:}\quad & \text{pu}_{C}^{B}\triangleright f^{\downarrow C}\\ -{\color{greenunder}\text{use definition~(\ref{eq:def-pure-via-wu-for-contrafunctor})}:}\quad & =\text{wu}_{C}\triangleright\gunderline{(\_^{:B}\Rightarrow1)^{\downarrow C}\triangleright f^{\downarrow C}}\\ -{\color{greenunder}\text{composition law for contrafunctor }C:}\quad & =\text{wu}_{C}\triangleright(\gunderline{f\bef(\_^{:B}\Rightarrow1)})^{\downarrow C}\\ -{\color{greenunder}\text{compute function composition}:}\quad & =\text{wu}_{C}\triangleright(\_^{:A}\Rightarrow1)^{\downarrow C}=\text{pu}_{C}^{A}\quad. +{\color{greenunder}\text{use definition~(\ref{eq:def-pure-via-wu-for-contrafunctor})}:}\quad & =\text{wu}_{C}\triangleright\gunderline{(\_^{:B}\rightarrow1)^{\downarrow C}\triangleright f^{\downarrow C}}\\ +{\color{greenunder}\text{composition law for contrafunctor }C:}\quad & =\text{wu}_{C}\triangleright(\gunderline{f\bef(\_^{:B}\rightarrow1)})^{\downarrow C}\\ +{\color{greenunder}\text{compute function composition}:}\quad & =\text{wu}_{C}\triangleright(\_^{:A}\rightarrow1)^{\downarrow C}=\text{pu}_{C}^{A}\quad. \end{align*} So, a pointed contrafunctor instance for $C^{\bullet}$ is equivalent to a chosen value of type $C^{\bbnum 1}$. @@ -3807,15 +3807,15 @@ \subsection{Pointed contrafunctors\label{subsec:Pointed-contrafunctors}} \paragraph{Functions} -The exponential contrafunctor construction is $L^{A}\triangleq F^{A}\Rightarrow C^{A}$, +The exponential contrafunctor construction is $L^{A}\triangleq F^{A}\rightarrow C^{A}$, where $C^{\bullet}$ is a contrafunctor and $F^{\bullet}$ is a functor. To create a value $\text{wu}_{L}:L^{\bbnum 1}$ means to create a -function of type $F^{\bbnum 1}\Rightarrow C^{\bbnum 1}$. That function +function of type $F^{\bbnum 1}\rightarrow C^{\bbnum 1}$. That function cannot use its argument of type $F^{\bbnum 1}$ for computing a value $C^{\bbnum 1}$ since $F$ is an arbitrary functor. So, $\text{wu}_{L}$ -must be a constant function $(\_^{:F^{\bbnum 1}}\Rightarrow\text{wu}_{C})$, +must be a constant function $(\_^{:F^{\bbnum 1}}\rightarrow\text{wu}_{C})$, where we assumed that a value $\text{wu}_{C}:C^{\bbnum 1}$ is available. -Thus, $F^{A}\Rightarrow C^{A}$ is pointed when $C$ is a pointed +Thus, $F^{A}\rightarrow C^{A}$ is pointed when $C$ is a pointed contrafunctor and $F$ is any functor. \begin{lstlisting} def pointedFuncFC[C[_]: Pointed, F[_]]: Pointed[Lambda[X => F[X] => C[X]]] = @@ -3837,11 +3837,11 @@ \subsection{Pointed contrafunctors\label{subsec:Pointed-contrafunctors}} Can we recognize a pointed contrafunctor $C$ by looking at its type expression, e.g. \[ -C^{A,B}\triangleq\left(\bbnum 1+A\Rightarrow B\right)+(\text{String}\times A\times B\Rightarrow\text{String})\text{ with respect to type parameter }A? +C^{A,B}\triangleq\left(\bbnum 1+A\rightarrow B\right)+(\text{String}\times A\times B\rightarrow\text{String})\text{ with respect to type parameter }A? \] We need to set $A=\bbnum 1$ and try to create a value $\text{wu}:C^{\bbnum 1,B}$. -In this example, $C^{\bbnum 1,B}=\left(\bbnum 1+\bbnum 1\Rightarrow B\right)+(\text{String}\times\bbnum 1\times B\Rightarrow\text{String})$. -A value of this type is $\text{wu}_{C}\triangleq\bbnum 0+(s^{:\text{String}}\times1\times b^{:B}\Rightarrow s)$. +In this example, $C^{\bbnum 1,B}=\left(\bbnum 1+\bbnum 1\rightarrow B\right)+(\text{String}\times\bbnum 1\times B\rightarrow\text{String})$. +A value of this type is $\text{wu}_{C}\triangleq\bbnum 0+(s^{:\text{String}}\times1\times b^{:B}\rightarrow s)$. So, the contrafunctor $C^{A,B}$ is pointed with respect to $A$. \begin{table} @@ -3853,15 +3853,15 @@ \subsection{Pointed contrafunctors\label{subsec:Pointed-contrafunctors}} \hline {\footnotesize{}Constant functor returning a fixed type $Z$} & {\footnotesize{}value of type $Z$} & {\footnotesize{}$Z$ has a default}\tabularnewline \hline -{\footnotesize{}Composition of pointed functors/contrafunctors} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}\times\text{Pointed}^{G^{\bullet}}\Rightarrow\text{Pointed}^{F^{G^{\bullet}}}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Composition of pointed functors/contrafunctors} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}\times\text{Pointed}^{G^{\bullet}}\rightarrow\text{Pointed}^{F^{G^{\bullet}}}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Product of pointed contrafunctors $F$ and $G$} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}\times\text{Pointed}^{G^{\bullet}}\Rightarrow\text{Pointed}^{F^{\bullet}\times G^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Product of pointed contrafunctors $F$ and $G$} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}\times\text{Pointed}^{G^{\bullet}}\rightarrow\text{Pointed}^{F^{\bullet}\times G^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Co-product of a pointed $F$ and any $G$} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}\times\text{Contrafunctor}^{G^{\bullet}}\Rightarrow\text{Pointed}^{F^{\bullet}+G^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Co-product of a pointed $F$ and any $G$} & {\footnotesize{}$\text{Pointed}^{F^{\bullet}}\times\text{Contrafunctor}^{G^{\bullet}}\rightarrow\text{Pointed}^{F^{\bullet}+G^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Function from a functor $F$ to a pointed $C$} & {\footnotesize{}$\text{Pointed}^{C^{\bullet}}\times\text{Functor}^{F^{\bullet}}\Rightarrow\text{Pointed}^{F^{\bullet}\Rightarrow C^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline +{\footnotesize{}Function from a functor $F$ to a pointed $C$} & {\footnotesize{}$\text{Pointed}^{C^{\bullet}}\times\text{Functor}^{F^{\bullet}}\rightarrow\text{Pointed}^{F^{\bullet}\rightarrow C^{\bullet}}$} & {\footnotesize{}one possibility}\tabularnewline \hline -{\footnotesize{}Recursive types} & {\footnotesize{}$\text{Pointed}^{C^{\bullet}}\Rightarrow\text{Pointed}^{S^{\bullet,C^{\bullet}}}$ +{\footnotesize{}Recursive types} & {\footnotesize{}$\text{Pointed}^{C^{\bullet}}\rightarrow\text{Pointed}^{S^{\bullet,C^{\bullet}}}$ where $C^{A}\triangleq S^{A,C^{A}}$} & {\footnotesize{}$\text{Pointed}^{C^{\bullet}}$}\tabularnewline \hline \end{tabular} @@ -3995,22 +3995,22 @@ \subsubsection{Example \label{subsec:tc-Example-1}\ref{subsec:tc-Example-1}} \subsubsection{Example \label{subsec:tc-Example-2}\ref{subsec:tc-Example-2}} -Define a \lstinline!Monoid! instance for the type $\bbnum 1+(\text{String}\Rightarrow\text{String})$. +Define a \lstinline!Monoid! instance for the type $\bbnum 1+(\text{String}\rightarrow\text{String})$. \subparagraph{Solution} We look for suitable monoid constructions (Section~\ref{subsec:Monoids-constructions}) that build up the given type expression from simpler parts. Since -the type expression $\bbnum 1+(\text{String}\Rightarrow\text{String})$ +the type expression $\bbnum 1+(\text{String}\rightarrow\text{String})$ is a co-product at the outer level, we must start with the co-product construction, which requires us to choose one of the parts of the -disjunction, say $\text{String}\Rightarrow\text{String}$, as the +disjunction, say $\text{String}\rightarrow\text{String}$, as the ``preferred'' monoid. Next, we need to produce \lstinline!Monoid! -instances for $\bbnum 1$ and for $\text{String}\Rightarrow\text{String}$. +instances for $\bbnum 1$ and for $\text{String}\rightarrow\text{String}$. While the \lstinline!Unit! type has a unique \lstinline!Monoid! -instance, there are several for $\text{String}\Rightarrow\text{String}$. +instance, there are several for $\text{String}\rightarrow\text{String}$. The function-type construction gives two possible monoid instances: -the monoid $R\Rightarrow A$ with $R=A=\text{String}$, and the function +the monoid $R\rightarrow A$ with $R=A=\text{String}$, and the function composition monoid. Let us choose the latter. The code using the monoid constructions from Section~\ref{subsec:Monoids-constructions} can then be written as @@ -4144,7 +4144,7 @@ \subsubsection{Example \label{subsec:tc-Example-4}\ref{subsec:tc-Example-4} (the For more convenient reasoning, we replace the types \lstinline!Path! and \lstinline!Response! by type parameters $P$ and $R$. We note that these types are used fully parametrically by the code of our -functions. So, we will write the type \lstinline!Route! as $\text{Route}\triangleq P\Rightarrow\bbnum 1+R$. +functions. So, we will write the type \lstinline!Route! as $\text{Route}\triangleq P\rightarrow\bbnum 1+R$. Since \lstinline!Route! is a function type at the outer level, we start with the function-type construction, which requires $\bbnum 1+R$ to be a monoid. This suggests using the co-product construction; however, @@ -4242,20 +4242,20 @@ \subsubsection{Example \label{subsec:tc-Example-6}\ref{subsec:tc-Example-6}} def contramap[A, B](c: C[A])(f: B => A): C[B] \end{lstlisting} Implement a \lstinline!Contrafunctor! instance for the type constructor -$C^{A}\triangleq A\Rightarrow\text{Int}$. +$C^{A}\triangleq A\rightarrow\text{Int}$. \subparagraph{Solution} Since the typeclass method has type parameters, the instance value will have type \[ -\text{contramap}:\forall(A,B).\,C^{A}\Rightarrow(B\Rightarrow A)\Rightarrow C^{B}\quad. +\text{contramap}:\forall(A,B).\,C^{A}\rightarrow(B\rightarrow A)\rightarrow C^{B}\quad. \] So, the typeclass needs to be implemented as a \lstinline!trait!: \begin{lstlisting} trait Contrafunctor[C[_]] { def contramap[A, B](c: C[A])(f: B => A): C[B] } \end{lstlisting} -A typeclass instance for the type constructor $C^{A}\triangleq A\Rightarrow\text{Int}$ +A typeclass instance for the type constructor $C^{A}\triangleq A\rightarrow\text{Int}$ is created by \begin{lstlisting} type C[A] = A => Int @@ -4270,7 +4270,7 @@ \subsubsection{Example \label{subsec:tc-Example-6}\ref{subsec:tc-Example-6}} \subsubsection{Example \label{subsec:tc-Example-7}\ref{subsec:tc-Example-7}} Define a \lstinline!Functor! instance for recursive type constructor -$Q^{A}\triangleq\left(\text{Int}\Rightarrow A\right)+\text{Int}+Q^{A}$. +$Q^{A}\triangleq\left(\text{Int}\rightarrow A\right)+\text{Int}+Q^{A}$. \subparagraph{Solution} @@ -4336,30 +4336,30 @@ \subsubsection{Example \label{subsec:tc-Example-8}\ref{subsec:tc-Example-8}} \subsubsection{Example \label{subsec:tc-Example-10}\ref{subsec:tc-Example-10}{*}} -\textbf{(a)} Implement a function with type signature $C^{A}+C^{B}\Rightarrow C^{A\times B}$ +\textbf{(a)} Implement a function with type signature $C^{A}+C^{B}\rightarrow C^{A\times B}$ parameterized by a type constructor $C$ (required to be a contrafunctor) and by arbitrary types $A$, $B$. Show that the inverse type signature -$C^{A\times B}\Rightarrow C^{A}+C^{B}$ is not implementable for some +$C^{A\times B}\rightarrow C^{A}+C^{B}$ is not implementable for some contrafunctors $C$. -\textbf{(b)} Implement a function with type signature $F^{A\times B}\Rightarrow F^{A}\times F^{B}$ +\textbf{(b)} Implement a function with type signature $F^{A\times B}\rightarrow F^{A}\times F^{B}$ parameterized by a type constructor $F$ (required to be a functor) and by arbitrary types $A$, $B$. Show that the inverse type signature -$F^{A}\times F^{B}\Rightarrow F^{A\times B}$ is not implementable +$F^{A}\times F^{B}\rightarrow F^{A\times B}$ is not implementable for some functors $F$. \subparagraph{Solution} \textbf{(a)} We need to implement a function with type signature \[ -\forall(A,B).\,C^{A}+C^{B}\Rightarrow C^{A\times B}\quad. +\forall(A,B).\,C^{A}+C^{B}\rightarrow C^{A\times B}\quad. \] Begin by looking at the types involved. We need to relate values $C^{A\times B}$, $C^{A}$, and $C^{B}$; can we relate $A\times B$, $A$, and $B$? There exist unique fully parametric functions $\nabla_{1}$ and $\nabla_{2}$ -of types $A\times B\Rightarrow A$ and $A\times B\Rightarrow B$. +of types $A\times B\rightarrow A$ and $A\times B\rightarrow B$. If we lift these functions to the contrafunctor $C$, we will get -$\nabla_{1}^{\downarrow C}:C^{A}\Rightarrow C^{A\times B}$ and $\nabla_{2}^{\downarrow C}:C^{B}\Rightarrow C^{A\times B}$. +$\nabla_{1}^{\downarrow C}:C^{A}\rightarrow C^{A\times B}$ and $\nabla_{2}^{\downarrow C}:C^{B}\rightarrow C^{A\times B}$. The required type signature is then implemented via a \lstinline!match! expression like this, @@ -4378,7 +4378,7 @@ \subsubsection{Example \label{subsec:tc-Example-10}\ref{subsec:tc-Example-10}{*} \noindent The code notation for this function is\vspace{-0.25\baselineskip} \[ -f^{:C^{A}+C^{B}\Rightarrow C^{A\times B}}\triangleq\begin{array}{|c||c|} +f^{:C^{A}+C^{B}\rightarrow C^{A\times B}}\triangleq\begin{array}{|c||c|} & C^{A\times B}\\ \hline C^{A} & \nabla_{1}^{\downarrow C}\\ C^{B} & \nabla_{2}^{\downarrow C} @@ -4389,92 +4389,92 @@ \subsubsection{Example \label{subsec:tc-Example-10}\ref{subsec:tc-Example-10}{*} To show that it is not possible to implement a function $g$ with the inverse type signature, \[ -g:\forall(A,B).\,C^{A\times B}\Rightarrow C^{A}+C^{B}\quad, +g:\forall(A,B).\,C^{A\times B}\rightarrow C^{A}+C^{B}\quad, \] -we choose the contrafunctor $C^{A}\triangleq A\Rightarrow R$, where +we choose the contrafunctor $C^{A}\triangleq A\rightarrow R$, where $R$ is a fixed type. The type signature becomes \[ -g:\forall(A,B).\,(A\times B\Rightarrow R)\Rightarrow(A\Rightarrow R)+(B\Rightarrow R)\quad. +g:\forall(A,B).\,(A\times B\rightarrow R)\rightarrow(A\rightarrow R)+(B\rightarrow R)\quad. \] To implement this function, we need to decide whether to return values -of type $A\Rightarrow R$ or $B\Rightarrow R$. Can we compute a value -of type $A\Rightarrow R$ given a value of type $A\times B\Rightarrow R$? +of type $A\rightarrow R$ or $B\rightarrow R$. Can we compute a value +of type $A\rightarrow R$ given a value of type $A\times B\rightarrow R$? \[ -g^{:(A\times B\Rightarrow R)\Rightarrow A\Rightarrow R}\triangleq q^{:A\times B\Rightarrow R}\Rightarrow a^{:A}\Rightarrow\text{???}^{:R} +g^{:(A\times B\rightarrow R)\rightarrow A\rightarrow R}\triangleq q^{:A\times B\rightarrow R}\rightarrow a^{:A}\rightarrow\text{???}^{:R} \] We cannot compute a value of type $R$ because that requires us to apply the function $q$ to a pair $A\times B$, while we only have a value of type $A$. So, the typed hole $\text{???}^{:R}$ cannot be filled. -Similarly, we are not able to compute a value of type $B\Rightarrow R$ -from a value of type $A\times B\Rightarrow R$. Whatever choice we -make, $A\Rightarrow R$ or $B\Rightarrow R$, we cannot implement +Similarly, we are not able to compute a value of type $B\rightarrow R$ +from a value of type $A\times B\rightarrow R$. Whatever choice we +make, $A\rightarrow R$ or $B\rightarrow R$, we cannot implement the required type signature. \textbf{(b)} We need to implement a function with type signature \[ -\forall(A,B).\,F^{A\times B}\Rightarrow F^{A}\times F^{B}\quad. +\forall(A,B).\,F^{A\times B}\rightarrow F^{A}\times F^{B}\quad. \] The types $A\times B$, $A$, and $B$ are related by the functions -$\nabla_{1}:A\times B\Rightarrow A$ and $\nabla_{2}:A\times B\Rightarrow B$. -Lifting these functions to the functor $F$, we obtain $\nabla_{1}^{\uparrow F}:F^{A\times B}\Rightarrow F^{A}$ -and $\nabla_{2}^{\uparrow F}:F^{A\times B}\Rightarrow F^{B}$. It +$\nabla_{1}:A\times B\rightarrow A$ and $\nabla_{2}:A\times B\rightarrow B$. +Lifting these functions to the functor $F$, we obtain $\nabla_{1}^{\uparrow F}:F^{A\times B}\rightarrow F^{A}$ +and $\nabla_{2}^{\uparrow F}:F^{A\times B}\rightarrow F^{B}$. It remains to take the product of the resulting values: \[ -f^{:F^{A\times B}\Rightarrow F^{A}\times F^{B}}\triangleq p^{:F^{A\times B}}\Rightarrow(p\triangleright\nabla_{1}^{\uparrow F})\times(p\triangleright\nabla_{2}^{\uparrow F})\quad. +f^{:F^{A\times B}\rightarrow F^{A}\times F^{B}}\triangleq p^{:F^{A\times B}}\rightarrow(p\triangleright\nabla_{1}^{\uparrow F})\times(p\triangleright\nabla_{2}^{\uparrow F})\quad. \] \begin{lstlisting} def f[F[_]: Functor, A, B](p: F[(A, B)]): (F[A], F[B]) = (p.map { case (a, b) => a }, p.map { case (a, b) => b }) // Or (p.map(_._1), p.map(_._2)) \end{lstlisting} -A shorter code for $f$ via the ``diagonal'' function $\Delta\triangleq(q^{:Q}\Rightarrow q\times q)$ +A shorter code for $f$ via the ``diagonal'' function $\Delta\triangleq(q^{:Q}\rightarrow q\times q)$ and the function product $\boxtimes$ is \[ -f^{:F^{A\times B}\Rightarrow F^{A}\times F^{B}}\triangleq\Delta\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\quad. +f^{:F^{A\times B}\rightarrow F^{A}\times F^{B}}\triangleq\Delta\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\quad. \] This notation is sometimes easier to reason about when deriving properties of functions. If we try implementing a function $g$ with the inverse type signature, \begin{equation} -g:\forall(A,B).\,F^{A}\times F^{B}\Rightarrow F^{A\times B}\quad,\label{eq:type-signature-of-g-zip} +g:\forall(A,B).\,F^{A}\times F^{B}\rightarrow F^{A\times B}\quad,\label{eq:type-signature-of-g-zip} \end{equation} we will find that $g$ \emph{can} be implemented for functors such as $F^{A}\triangleq A\times A$, $F^{A}\triangleq\bbnum 1+A$, and -$F^{A}\triangleq P\Rightarrow A$. It is not obvious how to find a +$F^{A}\triangleq P\rightarrow A$. It is not obvious how to find a functor $F$ for which the function $g$ has no implementation. By looking through the known functor constructions (Table~\ref{tab:f-Functor-constructions}) and trying various combinations, we eventually find a suitable functor: -$F^{A}\triangleq(P\Rightarrow A)+(Q\Rightarrow A)$. The type signature +$F^{A}\triangleq(P\rightarrow A)+(Q\rightarrow A)$. The type signature of $g$ becomes \[ -g:\forall(A,B).\,\left((P\Rightarrow A)+(Q\Rightarrow A)\right)\times\left((P\Rightarrow B)+(Q\Rightarrow B)\right)\Rightarrow(P\Rightarrow A\times B)+(Q\Rightarrow A\times B)\quad. +g:\forall(A,B).\,\left((P\rightarrow A)+(Q\rightarrow A)\right)\times\left((P\rightarrow B)+(Q\rightarrow B)\right)\rightarrow(P\rightarrow A\times B)+(Q\rightarrow A\times B)\quad. \] The argument of this function is of type \[ -\left((P\Rightarrow A)+(Q\Rightarrow A)\right)\times\left((P\Rightarrow B)+(Q\Rightarrow B)\right)\quad, +\left((P\rightarrow A)+(Q\rightarrow A)\right)\times\left((P\rightarrow B)+(Q\rightarrow B)\right)\quad, \] which can be transformed equivalently into a disjunction of four cases, \[ -(P\Rightarrow A)\times(P\Rightarrow B)+(P\Rightarrow A)\times(Q\Rightarrow B)+(Q\Rightarrow A)\times(P\Rightarrow B)+(Q\Rightarrow A)\times(Q\Rightarrow B)\quad. +(P\rightarrow A)\times(P\rightarrow B)+(P\rightarrow A)\times(Q\rightarrow B)+(Q\rightarrow A)\times(P\rightarrow B)+(Q\rightarrow A)\times(Q\rightarrow B)\quad. \] Implementing the function $g$ requires, in particular, to handle -the case when we are given values of types $P\Rightarrow A$ and $Q\Rightarrow B$, -and we are required to produce a value of type $(P\Rightarrow A\times B)+(Q\Rightarrow A\times B)$. +the case when we are given values of types $P\rightarrow A$ and $Q\rightarrow B$, +and we are required to produce a value of type $(P\rightarrow A\times B)+(Q\rightarrow A\times B)$. The resulting type signature \[ -(P\Rightarrow A)\times(Q\Rightarrow B)\Rightarrow(P\Rightarrow A\times B)+(Q\Rightarrow A\times B) +(P\rightarrow A)\times(Q\rightarrow B)\rightarrow(P\rightarrow A\times B)+(Q\rightarrow A\times B) \] -cannot be implemented: If we choose to return a value of type $P\Rightarrow A\times B$, +cannot be implemented: If we choose to return a value of type $P\rightarrow A\times B$, we would need to produce a pair of type $A\times B$ from a value of type $P$. However, producing a pair $A\times B$ requires, in this case, to have values of \emph{both} types $P$ and $Q$, since -the given arguments have types $P\Rightarrow A$ and $Q\Rightarrow B$. -Similarly, we cannot return a value of type $Q\Rightarrow A\times B$. +the given arguments have types $P\rightarrow A$ and $Q\rightarrow B$. +Similarly, we cannot return a value of type $Q\rightarrow A\times B$. We find that the function $g$ cannot be implemented for the functor -$F^{A}\triangleq(P\Rightarrow A)+(Q\Rightarrow A)$. Functors $F$ +$F^{A}\triangleq(P\rightarrow A)+(Q\rightarrow A)$. Functors $F$ for which the type signature~(\ref{eq:type-signature-of-g-zip}) \emph{can} be implemented are called ``applicative\index{applicative functor}'' (see Chapter~\ref{chap:8-Applicative-functors,-contrafunc} for precise @@ -4495,10 +4495,10 @@ \subsubsection{Example \label{subsec:tc-Example-pointed-alternative}\ref{subsec: \vspace{-1.6\baselineskip} \end{wrapfigure}% -\noindent $p^{A,B}:A+F^{B}\Rightarrow F^{A+B}$, additionally satisfying +\noindent $p^{A,B}:A+F^{B}\rightarrow F^{A+B}$, additionally satisfying the special laws of identity and associativity, \[ -p^{\bbnum 0,B}=(b^{:B}\Rightarrow\bbnum 0+b)^{\uparrow F}\quad,\quad\quad p^{A+B,C}=\begin{array}{|c||cc|} +p^{\bbnum 0,B}=(b^{:B}\rightarrow\bbnum 0+b)^{\uparrow F}\quad,\quad\quad p^{A+B,C}=\begin{array}{|c||cc|} & A & F^{B+C}\\ \hline A & \text{id} & \bbnum 0\\ B+F^{C} & \bbnum 0 & p^{B,C} @@ -4516,7 +4516,7 @@ \subsubsection{Example \label{subsec:tc-Example-pointed-alternative}\ref{subsec: So, we set the type parameters $A=\bbnum 1$ and $B=\bbnum 0$ and apply $p$ to the value $1+\bbnum 0^{:F^{\bbnum 0}}$, \[ -\text{wu}_{F}\triangleq(1+\bbnum 0^{:F^{\bbnum 0}})\triangleright p^{\bbnum 1,\bbnum 0}\triangleright(1+\bbnum 0\Rightarrow1)^{\uparrow F}\quad. +\text{wu}_{F}\triangleq(1+\bbnum 0^{:F^{\bbnum 0}})\triangleright p^{\bbnum 1,\bbnum 0}\triangleright(1+\bbnum 0\rightarrow1)^{\uparrow F}\quad. \] \begin{lstlisting} val wu[F[_]: Functor]: F[Unit] = p[Unit, Nothing](Left(())).map { case Left(_) => () } @@ -4542,19 +4542,19 @@ \subsubsection{Example \label{subsec:tc-Example-pointed-alternative}\ref{subsec: \[ p^{A,B}\triangleq\begin{array}{|c||c|} & F^{A+B}\\ -\hline A & (a^{:A}\Rightarrow a+\bbnum 0^{:B})\bef\text{pu}_{F}\\ -F^{B} & (b^{:B}\Rightarrow\bbnum 0^{:A}+b)^{\uparrow F} +\hline A & (a^{:A}\rightarrow a+\bbnum 0^{:B})\bef\text{pu}_{F}\\ +F^{B} & (b^{:B}\rightarrow\bbnum 0^{:A}+b)^{\uparrow F} \end{array}\quad. \] It remains to show that $p$ satisfies the required laws. The identity law holds because \begin{align*} -{\color{greenunder}\text{expect to equal }(b^{:B}\Rightarrow\bbnum 0+b)^{\uparrow F}:}\quad & p^{\bbnum 0,B}=\begin{array}{|c||c|} +{\color{greenunder}\text{expect to equal }(b^{:B}\rightarrow\bbnum 0+b)^{\uparrow F}:}\quad & p^{\bbnum 0,B}=\begin{array}{|c||c|} & F^{\bbnum 0+B}\\ \hline \bbnum 0 & \text{(we can delete this line)}\\ -F^{B} & (b^{:B}\Rightarrow\bbnum 0+b)^{\uparrow F} -\end{array}=(b^{:B}\Rightarrow\bbnum 0+b)^{\uparrow F}\quad. +F^{B} & (b^{:B}\rightarrow\bbnum 0+b)^{\uparrow F} +\end{array}=(b^{:B}\rightarrow\bbnum 0+b)^{\uparrow F}\quad. \end{align*} To verify the associativity law, we begin with its right-hand side since it is more complicated: @@ -4569,18 +4569,18 @@ \subsubsection{Example \label{subsec:tc-Example-pointed-alternative}\ref{subsec: B+F^{C} & \bbnum 0 & p^{B,C} \end{array}\,\bef\,\begin{array}{|c||c|} & F^{A+B+C}\\ -\hline A & (a^{:A}\Rightarrow a+\bbnum 0^{:B+C})\bef\text{pu}_{F}\\ -F^{B+C} & (x^{:B+C}\Rightarrow\bbnum 0^{:A}+x)^{\uparrow F} +\hline A & (a^{:A}\rightarrow a+\bbnum 0^{:B+C})\bef\text{pu}_{F}\\ +F^{B+C} & (x^{:B+C}\rightarrow\bbnum 0^{:A}+x)^{\uparrow F} \end{array}\\ & =\begin{array}{|c||c|} & F^{A+B+C}\\ -\hline A & (a^{:A}\Rightarrow a+\bbnum 0^{:B+C})\bef\text{pu}_{F}\\ -B+F^{C} & p^{B,C}\bef(x^{:B+C}\Rightarrow\bbnum 0^{:A}+x)^{\uparrow F} +\hline A & (a^{:A}\rightarrow a+\bbnum 0^{:B+C})\bef\text{pu}_{F}\\ +B+F^{C} & p^{B,C}\bef(x^{:B+C}\rightarrow\bbnum 0^{:A}+x)^{\uparrow F} \end{array}=\begin{array}{|c||c|} & F^{A+B+C}\\ -\hline A & (a^{:A}\Rightarrow a+\bbnum 0^{:B+C})\bef\text{pu}_{F}\\ -B & (b^{:B}\Rightarrow b+\bbnum 0^{:C})\bef\text{pu}_{F}\bef(x^{:B+C}\Rightarrow\bbnum 0^{:A}+x)^{\uparrow F}\\ -F^{C} & (c^{:C}\Rightarrow\bbnum 0^{:A+B}+c)^{\uparrow F} +\hline A & (a^{:A}\rightarrow a+\bbnum 0^{:B+C})\bef\text{pu}_{F}\\ +B & (b^{:B}\rightarrow b+\bbnum 0^{:C})\bef\text{pu}_{F}\bef(x^{:B+C}\rightarrow\bbnum 0^{:A}+x)^{\uparrow F}\\ +F^{C} & (c^{:C}\rightarrow\bbnum 0^{:A+B}+c)^{\uparrow F} \end{array}\quad. \end{align*} In the last line, we have expanded the type matrix to three rows corresponding @@ -4590,22 +4590,22 @@ \subsubsection{Example \label{subsec:tc-Example-pointed-alternative}\ref{subsec: \[ p^{A+B,C}=\begin{array}{|c||c|} & F^{A+B+C}\\ -\hline A & (a^{:A}\Rightarrow a+\bbnum 0^{:B}+\bbnum 0^{:C})\bef\text{pu}_{F}\\ -B & (b^{:B}\Rightarrow\bbnum 0^{:A}+b+\bbnum 0^{:C})\bef\text{pu}_{F}\\ -F^{C} & (c^{:C}\Rightarrow\bbnum 0^{:A}+\bbnum 0^{:B}+c)^{\uparrow F} +\hline A & (a^{:A}\rightarrow a+\bbnum 0^{:B}+\bbnum 0^{:C})\bef\text{pu}_{F}\\ +B & (b^{:B}\rightarrow\bbnum 0^{:A}+b+\bbnum 0^{:C})\bef\text{pu}_{F}\\ +F^{C} & (c^{:C}\rightarrow\bbnum 0^{:A}+\bbnum 0^{:B}+c)^{\uparrow F} \end{array}=\begin{array}{|c||c|} & F^{A+B+C}\\ -\hline A & (a^{:A}\Rightarrow a+\bbnum 0^{:B+C})\bef\text{pu}_{F}\\ -B & (b^{:B}\Rightarrow\bbnum 0^{:A}+b+\bbnum 0^{:C})\bef\text{pu}_{F}\\ -F^{C} & (c^{:C}\Rightarrow\bbnum 0^{:A+B}+c)^{\uparrow F} +\hline A & (a^{:A}\rightarrow a+\bbnum 0^{:B+C})\bef\text{pu}_{F}\\ +B & (b^{:B}\rightarrow\bbnum 0^{:A}+b+\bbnum 0^{:C})\bef\text{pu}_{F}\\ +F^{C} & (c^{:C}\rightarrow\bbnum 0^{:A+B}+c)^{\uparrow F} \end{array}\quad. \] The only remaining difference is in the second lines of the matrices. We write those lines separately: \begin{align*} -{\color{greenunder}\text{expect to equal }(b^{:B}\Rightarrow\bbnum 0^{:A}+b+\bbnum 0^{:C})\bef\text{pu}_{F}:}\quad & (b^{:B}\Rightarrow b+\bbnum 0^{:C})\bef\gunderline{\text{pu}_{F}\bef(x^{:B+C}\Rightarrow\bbnum 0^{:A}+x)^{\uparrow F}}\\ -{\color{greenunder}\text{use the naturality law of }\text{pu}_{F}:}\quad & =\gunderline{(b^{:B}\Rightarrow b+\bbnum 0^{:C})\bef(x^{:B+C}\Rightarrow\bbnum 0^{:A}+x)}\bef\text{pu}_{F}\\ -{\color{greenunder}\text{compute function composition}:}\quad & =(b^{:B}\Rightarrow\bbnum 0^{:A}+b+\bbnum 0^{:C})\bef\text{pu}_{F}\quad. +{\color{greenunder}\text{expect to equal }(b^{:B}\rightarrow\bbnum 0^{:A}+b+\bbnum 0^{:C})\bef\text{pu}_{F}:}\quad & (b^{:B}\rightarrow b+\bbnum 0^{:C})\bef\gunderline{\text{pu}_{F}\bef(x^{:B+C}\rightarrow\bbnum 0^{:A}+x)^{\uparrow F}}\\ +{\color{greenunder}\text{use the naturality law of }\text{pu}_{F}:}\quad & =\gunderline{(b^{:B}\rightarrow b+\bbnum 0^{:C})\bef(x^{:B+C}\rightarrow\bbnum 0^{:A}+x)}\bef\text{pu}_{F}\\ +{\color{greenunder}\text{compute function composition}:}\quad & =(b^{:B}\rightarrow\bbnum 0^{:A}+b+\bbnum 0^{:C})\bef\text{pu}_{F}\quad. \end{align*} This completes the proof of the required laws. @@ -4625,14 +4625,14 @@ \subsubsection{Exercise \label{subsec:tc-Exercise-2}\ref{subsec:tc-Exercise-2}} \subsubsection{Exercise \label{subsec:tc-Exercise-3}\ref{subsec:tc-Exercise-3}} \textbf{(a)} If $A$ is a monoid and $R$ any type, implement a \lstinline!Monoid! -instance for $R\Rightarrow A$: +instance for $R\rightarrow A$: \begin{lstlisting} def monoidFunc[A: Monoid, R]: Monoid[R => A] = ??? \end{lstlisting} Prove that the monoid laws hold for that instance. \textbf{(b)} With the choice \lstinline!R = Boolean!, use the type -equivalence $(R\Rightarrow A)=(\bbnum 2\Rightarrow A)\cong A\times A$ +equivalence $(R\rightarrow A)=(\bbnum 2\rightarrow A)\cong A\times A$ and verify that the monoid instance \lstinline!monoidFunc[A, Boolean]! is the same as the monoid instance for $A\times A$ computed by \lstinline!monoidPair[A, A]! in Section~\ref{subsec:Monoids-constructions}.% @@ -4646,7 +4646,7 @@ \subsubsection{Exercise \label{subsec:tc-Exercise-3}\ref{subsec:tc-Exercise-3}} In the code notation: \[ -f^{:R\Rightarrow A}\oplus g^{:R\Rightarrow A}\triangleq a\Rightarrow f(a)\oplus_{A}g(a)\quad,\quad\quad e\triangleq(\_\Rightarrow e_{A})\quad. +f^{:R\rightarrow A}\oplus g^{:R\rightarrow A}\triangleq a\rightarrow f(a)\oplus_{A}g(a)\quad,\quad\quad e\triangleq(\_\rightarrow e_{A})\quad. \] Proof of monoid laws: \begin{align*} @@ -4671,7 +4671,7 @@ \subsubsection{Exercise \label{subsec:tc-Exercise-5}\ref{subsec:tc-Exercise-5}} \subsubsection{Exercise \label{subsec:tc-Exercise-6}\ref{subsec:tc-Exercise-6}} Using the \texttt{cats} library, implement a \lstinline!Bifunctor! -instance for $B^{X,Y}\triangleq\left(\text{Int}\Rightarrow X\right)+Y\times Y$. +instance for $B^{X,Y}\triangleq\left(\text{Int}\rightarrow X\right)+Y\times Y$. \subsubsection{Exercise \label{subsec:tc-Exercise-7}\ref{subsec:tc-Exercise-7}} @@ -4680,7 +4680,7 @@ \subsubsection{Exercise \label{subsec:tc-Exercise-7}\ref{subsec:tc-Exercise-7}} \begin{lstlisting} def xmap[A, B](f: A => B, g: B => A): F[A] => F[B] \end{lstlisting} -Implement a \lstinline!Profunctor! instance for $P^{A}\triangleq A\Rightarrow\left(\text{Int}\times A\right)$. +Implement a \lstinline!Profunctor! instance for $P^{A}\triangleq A\rightarrow\left(\text{Int}\times A\right)$. \subsubsection{Exercise \label{subsec:tc-Exercise-8}\ref{subsec:tc-Exercise-8}} @@ -4700,7 +4700,7 @@ \subsubsection{Exercise \label{subsec:tc-Exercise-9}\ref{subsec:tc-Exercise-9}} \subsubsection{Exercise \label{subsec:tc-Exercise-10}\ref{subsec:tc-Exercise-10}} -Implement a \lstinline!Functor! instance for $F^{A}\Rightarrow G^{A}$ +Implement a \lstinline!Functor! instance for $F^{A}\rightarrow G^{A}$ as a function parameterized by type constructors $F$ and $G$, where $F^{A}$ is required to be a contrafunctor and $G^{A}$ is required to be a functor. For the contrafunctor $F$, use either the \lstinline!Contrafunctor! @@ -4709,36 +4709,36 @@ \subsubsection{Exercise \label{subsec:tc-Exercise-10}\ref{subsec:tc-Exercise-10} \subsubsection{Exercise \label{subsec:tc-Exercise-9-1}\ref{subsec:tc-Exercise-9-1}{*}} -\textbf{(a)} Implement a function with type signature $F^{A}+F^{B}\Rightarrow F^{A+B}$ +\textbf{(a)} Implement a function with type signature $F^{A}+F^{B}\rightarrow F^{A+B}$ parameterized by a type constructor $F$ (required to be a functor) and by arbitrary types $A$, $B$. Show that the inverse type signature -$F^{A+B}\Rightarrow F^{A}+F^{B}$ is not implementable for some functors +$F^{A+B}\rightarrow F^{A}+F^{B}$ is not implementable for some functors $F$. % \begin{comment} -A functor $F$ for which this is not implementable is $F^{A}\triangleq R\Rightarrow A$ +A functor $F$ for which this is not implementable is $F^{A}\triangleq R\rightarrow A$ where $R$ is a fixed type. \end{comment} -\textbf{(b)} Implement a function with type signature $C^{A+B}\Rightarrow C^{A}\times C^{B}$ +\textbf{(b)} Implement a function with type signature $C^{A+B}\rightarrow C^{A}\times C^{B}$ parameterized by a type constructor $C$ (required to be a contrafunctor) and by arbitrary types $A$, $B$. Show that the inverse type signature -$C^{A}\times C^{B}\Rightarrow C^{A+B}$ is not implementable for some +$C^{A}\times C^{B}\rightarrow C^{A+B}$ is not implementable for some contrafunctors $C$. \begin{comment} -The function $C^{A}\times C^{B}\Rightarrow C^{A+B}$ cannot be implemented -for $C^{A}\triangleq\left(A\Rightarrow P\right)+\left(A\Rightarrow Q\right)$. +The function $C^{A}\times C^{B}\rightarrow C^{A+B}$ cannot be implemented +for $C^{A}\triangleq\left(A\rightarrow P\right)+\left(A\rightarrow Q\right)$. This more complicated contrafunctor $C$ is necessary because the -simpler contrafunctor $C^{A}\triangleq A\Rightarrow P$ does not provide +simpler contrafunctor $C^{A}\triangleq A\rightarrow P$ does not provide a counterexample. \end{comment} \subsubsection{Exercise \label{subsec:tc-Exercise-9-1-1}\ref{subsec:tc-Exercise-9-1-1}{*}} -Implement a function with type signature $F^{A\Rightarrow B}\Rightarrow A\Rightarrow F^{B}$ +Implement a function with type signature $F^{A\rightarrow B}\rightarrow A\rightarrow F^{B}$ parameterized by a functor $F$ and arbitrary types $A$, $B$. Show -that the inverse type signature, $(A\Rightarrow F^{B})\Rightarrow F^{A\Rightarrow B}$, +that the inverse type signature, $(A\rightarrow F^{B})\rightarrow F^{A\rightarrow B}$, cannot be implemented for some functors $F$. (Functors admitting a function with that type signature are called ``rigid''; see Section~\ref{subsec:Rigid-functors}.) @@ -4755,10 +4755,10 @@ \subsubsection{Exercise \label{subsec:tc-Exercise-9-1-1-1}\ref{subsec:tc-Exercis \vspace{-1.6\baselineskip} \end{wrapfigure}% -\noindent $q^{A,B}:F^{A\times B}\Rightarrow A\times F^{B}$, additionally +\noindent $q^{A,B}:F^{A\times B}\rightarrow A\times F^{B}$, additionally satisfying the special laws of identity and associativity, \[ -q^{\bbnum 1,B}=f^{:F^{\bbnum 1\times B}}\Rightarrow1\times(f\triangleright(1\times b^{:B}\Rightarrow b)^{\uparrow F})\quad,\quad\quad q^{A,B\times C}\bef(\text{id}^{A}\boxtimes q^{B,C})=q^{A\times B,C}\quad. +q^{\bbnum 1,B}=f^{:F^{\bbnum 1\times B}}\rightarrow1\times(f\triangleright(1\times b^{:B}\rightarrow b)^{\uparrow F})\quad,\quad\quad q^{A,B\times C}\bef(\text{id}^{A}\boxtimes q^{B,C})=q^{A\times B,C}\quad. \] This Scala code illustrates the required laws in full detail: \begin{lstlisting} @@ -4773,7 +4773,7 @@ \subsubsection{Exercise \label{subsec:tc-Exercise-9-1-1-1}\ref{subsec:tc-Exercis \end{lstlisting} The following naturality law should also hold for $q$, \[ -(f^{:A\Rightarrow C}\boxtimes g^{:B\Rightarrow D})^{\uparrow F}\bef q^{C,D}=q^{A,B}\bef f\boxtimes(g^{\uparrow F})\quad. +(f^{:A\rightarrow C}\boxtimes g^{:B\rightarrow D})^{\uparrow F}\bef q^{C,D}=q^{A,B}\bef f\boxtimes(g^{\uparrow F})\quad. \] \begin{lstlisting} // For any value k: F[(A, B)] and any functions f: A => C, g: B => D, first compute @@ -4789,18 +4789,18 @@ \subsubsection{Exercise \label{subsec:tc-Exercise-9-1-1-1}\ref{subsec:tc-Exercis Define the method $\text{ex}_{F}$ as \[ -\text{ex}_{F}\triangleq x^{:F^{A}}\Rightarrow x\triangleright(a^{:A}\Rightarrow a\times1)^{\uparrow F}\triangleright q^{A,\bbnum 1}\triangleright\nabla_{1}\quad\text{ or alternatively }\quad\text{ex}_{F}\triangleq(a^{:A}\Rightarrow a\times1)^{\uparrow F}\bef q^{A,\bbnum 1}\bef\nabla_{1}\quad. +\text{ex}_{F}\triangleq x^{:F^{A}}\rightarrow x\triangleright(a^{:A}\rightarrow a\times1)^{\uparrow F}\triangleright q^{A,\bbnum 1}\triangleright\nabla_{1}\quad\text{ or alternatively }\quad\text{ex}_{F}\triangleq(a^{:A}\rightarrow a\times1)^{\uparrow F}\bef q^{A,\bbnum 1}\bef\nabla_{1}\quad. \] Show that the naturality law holds for $\text{ex}_{F}$. Use the identity $(f\boxtimes g)\bef\nabla_{1}=\nabla_{1}\bef f$. \begin{align*} -{\color{greenunder}\text{expect to equal }\text{ex}_{F}\bef f:}\quad & f^{\uparrow F}\bef\text{ex}_{F}=\gunderline{f^{\uparrow F}\bef(a^{:A}\Rightarrow a\times1)^{\uparrow F}}\bef q^{A,\bbnum 1}\bef\nabla_{1}=(a^{:A}\Rightarrow a\times1)^{\uparrow F}\bef\gunderline{(f\boxtimes\text{id})^{\uparrow F}\bef q^{A,\bbnum 1}}\bef\nabla_{1}\\ - & =(a^{:A}\Rightarrow a\times1)^{\uparrow F}\bef q^{A,\bbnum 1}\bef\gunderline{(f\boxtimes\text{id}^{\uparrow F})\bef\nabla_{1}}=\gunderline{(a^{:A}\Rightarrow a\times1)^{\uparrow F}\bef q^{A,\bbnum 1}\bef\nabla_{1}}\bef f=\text{ex}_{F}\bef f\quad. +{\color{greenunder}\text{expect to equal }\text{ex}_{F}\bef f:}\quad & f^{\uparrow F}\bef\text{ex}_{F}=\gunderline{f^{\uparrow F}\bef(a^{:A}\rightarrow a\times1)^{\uparrow F}}\bef q^{A,\bbnum 1}\bef\nabla_{1}=(a^{:A}\rightarrow a\times1)^{\uparrow F}\bef\gunderline{(f\boxtimes\text{id})^{\uparrow F}\bef q^{A,\bbnum 1}}\bef\nabla_{1}\\ + & =(a^{:A}\rightarrow a\times1)^{\uparrow F}\bef q^{A,\bbnum 1}\bef\gunderline{(f\boxtimes\text{id}^{\uparrow F})\bef\nabla_{1}}=\gunderline{(a^{:A}\rightarrow a\times1)^{\uparrow F}\bef q^{A,\bbnum 1}\bef\nabla_{1}}\bef f=\text{ex}_{F}\bef f\quad. \end{align*} Given a method $\text{ex}_{F}$, define $q$ as \[ -q^{A,B}\triangleq f^{:F^{A\times B}}\Rightarrow(f\triangleright\nabla_{1}^{\uparrow F}\triangleright\text{ex}_{F}^{A})\times(f\triangleright\nabla_{2}^{\uparrow F})\quad\text{ or alternatively }\quad q^{A,B}\triangleq\Delta\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\bef(\text{ex}_{F}^{A}\boxtimes\text{id})\quad. +q^{A,B}\triangleq f^{:F^{A\times B}}\rightarrow(f\triangleright\nabla_{1}^{\uparrow F}\triangleright\text{ex}_{F}^{A})\times(f\triangleright\nabla_{2}^{\uparrow F})\quad\text{ or alternatively }\quad q^{A,B}\triangleq\Delta\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\bef(\text{ex}_{F}^{A}\boxtimes\text{id})\quad. \] Show that the required laws hold for $q$. Identity law: \[ @@ -4811,20 +4811,20 @@ \subsubsection{Exercise \label{subsec:tc-Exercise-9-1-1-1}\ref{subsec:tc-Exercis Naturality law: \begin{align*} -(f^{:A\Rightarrow C}\boxtimes g^{:B\Rightarrow D})^{\uparrow F}\bef\Delta\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\bef(\text{ex}_{F}^{A}\boxtimes\text{id}) & =\Delta\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\bef(\text{ex}_{F}^{A}\boxtimes\text{id})\bef f\boxtimes(g^{\uparrow F})\\ +(f^{:A\rightarrow C}\boxtimes g^{:B\rightarrow D})^{\uparrow F}\bef\Delta\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\bef(\text{ex}_{F}^{A}\boxtimes\text{id}) & =\Delta\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\bef(\text{ex}_{F}^{A}\boxtimes\text{id})\bef f\boxtimes(g^{\uparrow F})\\ \Delta\bef((f\boxtimes g)^{\uparrow F}\boxtimes(f\boxtimes g)^{\uparrow F})\bef(\nabla_{1}^{\uparrow F}\boxtimes\nabla_{2}^{\uparrow F})\bef(\text{ex}_{F}^{A}\boxtimes\text{id}) & =\Delta\bef(\nabla_{1}^{\uparrow F}\bef\text{ex}_{F}\bef f)\boxtimes(\nabla_{2}^{\uparrow F}\bef g^{\uparrow F})\\ \Delta\bef(\nabla_{1}^{\uparrow F}\bef\gunderline{f^{\uparrow F}\bef\text{ex}_{F}})\boxtimes(\nabla_{2}^{\uparrow F}\bef g^{\uparrow F}) & =\Delta\bef(\nabla_{1}^{\uparrow F}\bef\gunderline{\text{ex}_{F}\bef f})\boxtimes(\nabla_{2}^{\uparrow F}\bef g^{\uparrow F}) \end{align*} Associativity law: the left-hand side is \begin{align*} - & f^{:F^{A\times B\times C}}\triangleright q^{A,B\times C}\bef(\text{id}^{A}\boxtimes q^{B,C})=(f\triangleright\nabla_{1}^{\uparrow F}\triangleright\text{ex}_{F}^{A})\times(f\triangleright(a\times b\times c\Rightarrow b\times c)^{\uparrow F}\triangleright q^{B,C})\\ - & =(f\triangleright\nabla_{1}^{\uparrow F}\triangleright\text{ex}_{F}^{A})\times(f\triangleright(a\times b\times c\Rightarrow b\times c)^{\uparrow F}\triangleright\nabla_{1}^{\uparrow F}\triangleright\text{ex}_{F}^{B})\times(f\triangleright(a\times b\times c\Rightarrow b\times c)^{\uparrow F}\triangleright\nabla_{2}^{\uparrow F})\\ - & =\left(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\Rightarrow a)\right)\times\left(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\Rightarrow b)\right)\times\left(f\triangleright(a\times b\times c\Rightarrow c)^{\uparrow F}\right)\quad. + & f^{:F^{A\times B\times C}}\triangleright q^{A,B\times C}\bef(\text{id}^{A}\boxtimes q^{B,C})=(f\triangleright\nabla_{1}^{\uparrow F}\triangleright\text{ex}_{F}^{A})\times(f\triangleright(a\times b\times c\rightarrow b\times c)^{\uparrow F}\triangleright q^{B,C})\\ + & =(f\triangleright\nabla_{1}^{\uparrow F}\triangleright\text{ex}_{F}^{A})\times(f\triangleright(a\times b\times c\rightarrow b\times c)^{\uparrow F}\triangleright\nabla_{1}^{\uparrow F}\triangleright\text{ex}_{F}^{B})\times(f\triangleright(a\times b\times c\rightarrow b\times c)^{\uparrow F}\triangleright\nabla_{2}^{\uparrow F})\\ + & =\left(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\rightarrow a)\right)\times\left(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\rightarrow b)\right)\times\left(f\triangleright(a\times b\times c\rightarrow c)^{\uparrow F}\right)\quad. \end{align*} The right-hand side is \begin{align*} - & f^{:F^{A\times B\times C}}\triangleright q^{A\times B,C}=(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\Rightarrow a\times b))\times(f\triangleright(a\times b\times c\Rightarrow c)^{\uparrow F})\\ - & =\left(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\Rightarrow a)\right)\times\left(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\Rightarrow b)\right)\times\left(f\triangleright(a\times b\times c\Rightarrow c)^{\uparrow F}\right)\quad. + & f^{:F^{A\times B\times C}}\triangleright q^{A\times B,C}=(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\rightarrow a\times b))\times(f\triangleright(a\times b\times c\rightarrow c)^{\uparrow F})\\ + & =\left(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\rightarrow a)\right)\times\left(f\triangleright\text{ex}_{F}\triangleright(a\times b\times c\rightarrow b)\right)\times\left(f\triangleright(a\times b\times c\rightarrow c)^{\uparrow F}\right)\quad. \end{align*} \end{comment} @@ -4841,7 +4841,7 @@ \subsection{Recursive types and the existence of their values\label{subsec:Recur In all examples seen so far, the recursive type equation had the form $T\triangleq S^{T}$ where the type constructor $S$ is a \emph{functor}. Type equations with non-functor $S^{\bullet}$ (e.g.~the equation -$T\triangleq T\Rightarrow\text{Int}$) do not seem to be often useful +$T\triangleq T\rightarrow\text{Int}$) do not seem to be often useful in practice, and we will not consider them here. In a rigorous approach, showing that $T$ is a ``solution'' (called @@ -4851,7 +4851,7 @@ \subsection{Recursive types and the existence of their values\label{subsec:Recur as two functions, named e.g.~\lstinline!fix! and \lstinline!unfix!, satisfying the conditions \[ -\text{fix}:S^{T}\Rightarrow T\quad,\quad\quad\text{unfix}:T\Rightarrow S^{T}\quad,\quad\quad\text{fix}\bef\text{unfix}=\text{id}\quad,\quad\quad\text{unfix}\bef\text{fix}=\text{id}\quad. +\text{fix}:S^{T}\rightarrow T\quad,\quad\quad\text{unfix}:T\rightarrow S^{T}\quad,\quad\quad\text{fix}\bef\text{unfix}=\text{id}\quad,\quad\quad\text{unfix}\bef\text{fix}=\text{id}\quad. \] Given a type constructor $S$, we can define the recursive type $T$ @@ -4977,12 +4977,12 @@ \subsection{Recursive types and the existence of their values\label{subsec:Recur It remains to consider exponential functors $S$ that cannot be reduced to the polynomial form~(\ref{eq:functor-polynomial-normal-form}). -As an example, take $S^{A}\triangleq\text{String}\times(\text{Int}\Rightarrow A)$. +As an example, take $S^{A}\triangleq\text{String}\times(\text{Int}\rightarrow A)$. For this functor $S$, the condition $S^{\bbnum 0}\not\cong\bbnum 0$ does not hold: \begin{align*} - & S^{\bbnum 0}\cong\text{String}\times(\gunderline{\text{Int}\Rightarrow\bbnum 0})\\ -{\color{greenunder}\text{use the type equivalence }\left(\text{Int}\Rightarrow\bbnum 0\right)\cong\bbnum 0:}\quad & \quad\cong\text{String}\times\bbnum 0\cong\bbnum 0\quad. + & S^{\bbnum 0}\cong\text{String}\times(\gunderline{\text{Int}\rightarrow\bbnum 0})\\ +{\color{greenunder}\text{use the type equivalence }\left(\text{Int}\rightarrow\bbnum 0\right)\cong\bbnum 0:}\quad & \quad\cong\text{String}\times\bbnum 0\cong\bbnum 0\quad. \end{align*} Nevertheless, we can write Scala code implementing values of the type $T$ defined by $T\triangleq S^{T}$: @@ -5012,11 +5012,11 @@ \subsection{Recursive types and the existence of their values\label{subsec:Recur the next element of the stream. A symbolic (and non-rigorous) representation of that type is \[ -T=\text{String}\times(\text{Int}\Rightarrow\text{String}\times(\text{Int}\Rightarrow\text{String}\times(\text{Int}\Rightarrow\text{String}\times...)))\quad. +T=\text{String}\times(\text{Int}\rightarrow\text{String}\times(\text{Int}\rightarrow\text{String}\times(\text{Int}\rightarrow\text{String}\times...)))\quad. \] -As another example, consider $S^{A}\triangleq\bbnum 1\Rightarrow\text{Int}\times A+\text{String}$. -Using the type equivalence $P\cong(\bbnum 1\Rightarrow P)$, we \emph{could} +As another example, consider $S^{A}\triangleq\bbnum 1\rightarrow\text{Int}\times A+\text{String}$. +Using the type equivalence $P\cong(\bbnum 1\rightarrow P)$, we \emph{could} transform $S^{A}$ into an equivalent functor $\tilde{S}^{A}$ in the polynomial form~(\ref{eq:functor-polynomial-normal-form}), \[ @@ -5044,33 +5044,33 @@ \subsection{Recursive types and the existence of their values\label{subsec:Recur We can recognize that $\text{Fix}^{S}$ has non-recursive values by checking that the type $S^{\bbnum 0}$ is not void: \[ -S^{\bbnum 0}=\bbnum 1\Rightarrow\text{Int}\times\bbnum 0+\text{String}\cong\bbnum 1\Rightarrow\text{String}\cong\text{String}\not\cong\bbnum 0\quad. +S^{\bbnum 0}=\bbnum 1\rightarrow\text{Int}\times\bbnum 0+\text{String}\cong\bbnum 1\rightarrow\text{String}\cong\text{String}\not\cong\bbnum 0\quad. \] How can we recognize functors $S$ that admit valid recursive values of type $\text{Fix}^{S}$? The exponential functor construction (Statement~\ref{subsec:functor-Statement-functor-exponential}) -shows that $C^{A}\Rightarrow P^{A}$ is a functor when $C$ is a contrafunctor +shows that $C^{A}\rightarrow P^{A}$ is a functor when $C$ is a contrafunctor and $P$ is a functor. If the type expression for $S^{A}$ contains -a sub-expression of the form $C^{A}\Rightarrow P^{A}$, we can use +a sub-expression of the form $C^{A}\rightarrow P^{A}$, we can use recursion to implement any values of $A$ wrapped by $P^{A}$. It remains to create any other values that are required by $P^{A}$; effectively, we need $P^{A}$ to be a pointed functor, so that we can create a value $P^{A}$ given a value of $A$. The contrafunctor -$C^{A}$ is an argument of the function of type $C^{A}\Rightarrow P^{A}$, +$C^{A}$ is an argument of the function of type $C^{A}\rightarrow P^{A}$, so we are not required to produce values of type $C^{A}$\textemdash{} we \emph{consume} those values. It follows that we can implement a -value of type $C^{T}\Rightarrow P^{T}$ (with $T=\text{Fix}^{S}$) +value of type $C^{T}\rightarrow P^{T}$ (with $T=\text{Fix}^{S}$) as long as $P^{\bullet}$ is a pointed functor. As we saw in Section~\ref{subsec:Pointed-functors:-motivation}, a functor $P^{\bullet}$ is pointed if we can compute a value of type $P^{\bbnum 1}$. -In the example $S^{A}\triangleq\text{String}\times(\text{Int}\Rightarrow A)$, +In the example $S^{A}\triangleq\text{String}\times(\text{Int}\rightarrow A)$, the functor $S^{A}$ is pointed since \[ -S^{\bbnum 1}\cong\text{String}\times(\text{Int}\Rightarrow\bbnum 1)\cong\text{String}\not\cong\bbnum 0\quad. +S^{\bbnum 1}\cong\text{String}\times(\text{Int}\rightarrow\bbnum 1)\cong\text{String}\not\cong\bbnum 0\quad. \] -This consideration applies to any sub-expression of the form $C^{A}\Rightarrow P^{A}$ +This consideration applies to any sub-expression of the form $C^{A}\rightarrow P^{A}$ within the type constructor $S^{A}$. The condition for values of $\text{Fix}^{S}$ to exist is that every functor $P^{A}$ involved in such sub-expressions should be pointed. To check that, we can set @@ -5087,7 +5087,7 @@ \subsection{Recursive types and the existence of their values\label{subsec:Recur is a polynomial functor, this condition is also a necessary condition, as we have seen.) For exponential-polynomial functors $S$, recursive values of type $\text{Fix}^{S}$ can be implemented if every function-type -sub-expression $C^{A}\Rightarrow P^{A}$ in $S^{A}$ involves a pointed +sub-expression $C^{A}\rightarrow P^{A}$ in $S^{A}$ involves a pointed functor $P$. \subsection{Proofs of associativity of \texttt{concat} for lists and arrays\label{subsec:Proofs-for-associativity-law-lists-and-arrays}} @@ -5118,7 +5118,7 @@ \subsection{Proofs of associativity of \texttt{concat} for lists and arrays\labe scala> x(3) // `x.apply()` is a partial function of type `Int => String`. java.lang.ArrayIndexOutOfBoundsException: 3 \end{lstlisting} -We can denote the type of this function by $\text{Int}_{[0,n-1]}\Rightarrow A$ +We can denote the type of this function by $\text{Int}_{[0,n-1]}\rightarrow A$ to indicate the bounds of the index. The \lstinline!List! type constructor is a recursive disjunctive @@ -5135,10 +5135,10 @@ \subsection{Proofs of associativity of \texttt{concat} for lists and arrays\labe \subsubsection{Statement \label{subsec:Statement-concat-array-associativity}\ref{subsec:Statement-concat-array-associativity}} The \lstinline!concat! function (denoted $\negmedspace+\!+$) for -arrays, $\text{Array}_{n}^{A}\triangleq\text{Int}_{[0,n-1]}\Rightarrow A$, +arrays, $\text{Array}_{n}^{A}\triangleq\text{Int}_{[0,n-1]}\rightarrow A$, is defined by \[ -a_{1}^{:\text{Array}_{n_{1}}^{A}}\negmedspace+\negthickspace+a_{2}^{:\text{Array}_{n_{2}}^{A}}\triangleq i^{:\text{Int}_{[0,n_{1}+n_{2}-1]}}\Rightarrow\begin{cases} +a_{1}^{:\text{Array}_{n_{1}}^{A}}\negmedspace+\negthickspace+a_{2}^{:\text{Array}_{n_{2}}^{A}}\triangleq i^{:\text{Int}_{[0,n_{1}+n_{2}-1]}}\rightarrow\begin{cases} 0\leq i A, g: P[B] => B): P[(A, B)] => (A, B) = @@ -5528,18 +5528,18 @@ \subsection{Inductive typeclasses and their properties} typeclass \emph{laws} will also hold for the product types.) It is interesting to note that the co-product construction cannot -be derived in general for arbitrary inductive typeclasses: given $P^{A}\Rightarrow A$ -and $P^{B}\Rightarrow B$, it is not guaranteed that we can compute -$P^{A+B}\Rightarrow A+B$. Not all inductive typeclasses support the +be derived in general for arbitrary inductive typeclasses: given $P^{A}\rightarrow A$ +and $P^{B}\rightarrow B$, it is not guaranteed that we can compute +$P^{A+B}\rightarrow A+B$. Not all inductive typeclasses support the co-product construction. -The function-type construction promises a typeclass instance for $E\Rightarrow A$ +The function-type construction promises a typeclass instance for $E\rightarrow A$ if the type $A$ has a typeclass instance. This construction works -for any inductive typeclass because a value of type $P^{E\Rightarrow A}\Rightarrow E\Rightarrow A$ -can be computed from a value of type $P^{A}\Rightarrow A$ when $P$ +for any inductive typeclass because a value of type $P^{E\rightarrow A}\rightarrow E\rightarrow A$ +can be computed from a value of type $P^{A}\rightarrow A$ when $P$ is a functor: \[ -q:(P^{A}\Rightarrow A)\Rightarrow P^{E\Rightarrow A}\Rightarrow E\Rightarrow A\quad,\quad\quad q\triangleq h^{:P^{A}\Rightarrow A}\Rightarrow p^{:P^{E\Rightarrow A}}\Rightarrow e^{:E}\Rightarrow p\triangleright(x^{:E\Rightarrow A}\Rightarrow e\triangleright x)^{\uparrow P}\triangleright h\quad. +q:(P^{A}\rightarrow A)\rightarrow P^{E\rightarrow A}\rightarrow E\rightarrow A\quad,\quad\quad q\triangleq h^{:P^{A}\rightarrow A}\rightarrow p^{:P^{E\rightarrow A}}\rightarrow e^{:E}\rightarrow p\triangleright(x^{:E\rightarrow A}\rightarrow e\triangleright x)^{\uparrow P}\triangleright h\quad. \] As in the case of the product construction, the laws still need to be checked for the new instances. @@ -5549,12 +5549,12 @@ \subsection{Inductive typeclasses and their properties} type equation $T\triangleq S^{T}$, where the functor $S^{\bullet}$ preserves typeclass instances (i.e.~if $A$ has an instance then $S^{A}$ also does, as we saw in all our examples in this chapter). -It means that we have a function $\text{tcS}:(P^{A}\Rightarrow A)\Rightarrow P^{S^{A}}\Rightarrow S^{A}$ -that creates typeclass instances of type $P^{S^{A}}\Rightarrow S^{A}$ -out of instances of type $P^{A}\Rightarrow A$. Then we define an +It means that we have a function $\text{tcS}:(P^{A}\rightarrow A)\rightarrow P^{S^{A}}\rightarrow S^{A}$ +that creates typeclass instances of type $P^{S^{A}}\rightarrow S^{A}$ +out of instances of type $P^{A}\rightarrow A$. Then we define an instance \lstinline!tcT! for $T$ as \[ -\text{tcT}^{:P^{T}\Rightarrow T}\triangleq p^{:P^{T}}\Rightarrow\text{tcS}\,(\text{tcT})(p)\quad. +\text{tcT}^{:P^{T}\rightarrow T}\triangleq p^{:P^{T}}\rightarrow\text{tcS}\,(\text{tcT})(p)\quad. \] This recursive function terminates because it is implemented as an ``expanded function''. The types match since we can convert between @@ -5579,8 +5579,8 @@ \subsection{Inductive typeclasses and their properties} type function denoted by $S^{A,F}$ and parameterized by a type constructor $F^{\bullet}$ as well as by a type parameter $A$. (The type $S$ has kind $*\times(*\rightarrow*)\rightarrow*$.) The methods of these -typeclasses are expressed as $S^{\bullet,F}\Rightarrow F^{\bullet}$, -which is analogous to $P^{A}\Rightarrow A$ except for additional +typeclasses are expressed as $S^{\bullet,F}\rightarrow F^{\bullet}$, +which is analogous to $P^{A}\rightarrow A$ except for additional type parameters. Similar arguments can be made for these typeclasses, although it is more difficult to reason about type constructors (and the laws will not hold without additional assumptions). As we have @@ -5596,26 +5596,26 @@ \subsection{Inductive typeclasses and their properties} the ``free'' type construction. We have also seen examples of typeclasses that are not inductive. -The \lstinline!Extractor! typeclass has instances of type $A\Rightarrow Z$, -which is not of the form $P^{A}\Rightarrow A$ for any functor $P$. -Another such typeclass is \lstinline!Copointed!, whose method $F^{A}\Rightarrow A$ -is not of the form $S^{\bullet,F}\Rightarrow F^{\bullet}$. However, +The \lstinline!Extractor! typeclass has instances of type $A\rightarrow Z$, +which is not of the form $P^{A}\rightarrow A$ for any functor $P$. +Another such typeclass is \lstinline!Copointed!, whose method $F^{A}\rightarrow A$ +is not of the form $S^{\bullet,F}\rightarrow F^{\bullet}$. However, the methods of these typeclasses can be written in the inverted form -$A\Rightarrow P^{A}$ with some functor $P$. We call them \index{typeclass!co-inductive}\textbf{co-inductive} +$A\rightarrow P^{A}$ with some functor $P$. We call them \index{typeclass!co-inductive}\textbf{co-inductive} \textbf{typeclasses}\index{co-inductive typeclass}. A motivation for this name is that the \emph{co-product} construction (rather than the product construction) works with co-inductive typeclasses: given -values of types $A\Rightarrow P^{A}$ and $B\Rightarrow P^{B}$, we -can produce a value of type $A+B\Rightarrow P^{A+B}$, i.e.~a co-product -instance, but not necessarily a value of type $A\times B\Rightarrow P^{A\times B}$, +values of types $A\rightarrow P^{A}$ and $B\rightarrow P^{B}$, we +can produce a value of type $A+B\rightarrow P^{A+B}$, i.e.~a co-product +instance, but not necessarily a value of type $A\times B\rightarrow P^{A\times B}$, which would be a product-type instance. The function-type construction is not guaranteed to work with co-inductive typeclasses, but the recursive-type construction and the ``free'' type construction can be implemented after appropriate modifications. The \lstinline!Eq! typeclass is ``un-inductive'' (neither inductive -nor co-inductive) because its instance type, $A\times A\Rightarrow\bbnum 2$, -is neither of the form $P^{A}\Rightarrow A$ nor $A\Rightarrow P^{A}$. +nor co-inductive) because its instance type, $A\times A\rightarrow\bbnum 2$, +is neither of the form $P^{A}\rightarrow A$ nor $A\rightarrow P^{A}$. The traversable functor (Chapter~\ref{chap:9-Traversable-functors-and}) is another example of an ``un-inductive'' typeclass. Un-inductive typeclasses usually support fewer type constructions. For example, diff --git a/sofp-src/sofp.lyx b/sofp-src/sofp.lyx index 40b8fdd4e..16f4349b5 100644 --- a/sofp-src/sofp.lyx +++ b/sofp-src/sofp.lyx @@ -109,9 +109,6 @@ % Increase the default vertical space inside table cells. \renewcommand\arraystretch{1.4} -% Do not use \Rightarrow. -\def\Rightarrow{\rightarrow} - % Make underline green. \definecolor{greenunder}{rgb}{0.1,0.6,0.2} %\newcommand{\munderline}[1]{{\color{greenunder}\underline{{\color{black}#1}}\color{black}}} diff --git a/sofp-src/sofp.pdf b/sofp-src/sofp.pdf index c940ae2827fc0532a3c3d04af5f316c069b53375..397967e7d54075c71efa8ac7800ddb07b0c29402 100644 GIT binary patch delta 483835 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

NW6xsmo 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%0ABy*Eh>z6L0Rm)vT#|JU^4)Fj$%m0#eOC3 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%0DV#wn^kY}Ilm`n)2GxbrMNFXoactSi~UIN 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≶e(GD3=Dj%&v(B4T@g`7z>X+DwN2iUQ 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 A3;+NC delta 481946 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