Mercurial > dylan
view categorical/morphisms.html @ 11:1f112b4f9e8f tip
Fixed what was baroque.
author | Dylan Holmes <ocsenave@gmail.com> |
---|---|
date | Tue, 01 Nov 2011 02:30:49 -0500 |
parents | b4de894a1e2e |
children |
line wrap: on
line source
1 <?xml version="1.0" encoding="iso-8859-1"?>2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">4 <html xmlns="http://www.w3.org/1999/xhtml"5 lang="en" xml:lang="en">6 <head>7 <title>Categorical Programs</title>8 <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>9 <meta name="generator" content="Org-mode"/>10 <meta name="generated" content="2011-07-01 12:28:39 CDT"/>11 <meta name="author" content="Dylan Holmes"/>12 <meta name="description" content=""/>13 <meta name="keywords" content=""/>14 <style type="text/css">15 <!--/*--><![CDATA[/*><!--*/16 html { font-family: Times, serif; font-size: 12pt; }17 .title { text-align: center; }18 .todo { color: red; }19 .done { color: green; }20 .tag { background-color: #add8e6; font-weight:normal }21 .target { }22 .timestamp { color: #bebebe; }23 .timestamp-kwd { color: #5f9ea0; }24 .right {margin-left:auto; margin-right:0px; text-align:right;}25 .left {margin-left:0px; margin-right:auto; text-align:left;}26 .center {margin-left:auto; margin-right:auto; text-align:center;}27 p.verse { margin-left: 3% }28 pre {29 border: 1pt solid #AEBDCC;30 background-color: #F3F5F7;31 padding: 5pt;32 font-family: courier, monospace;33 font-size: 90%;34 overflow:auto;35 }36 table { border-collapse: collapse; }37 td, th { vertical-align: top; }38 th.right { text-align:center; }39 th.left { text-align:center; }40 th.center { text-align:center; }41 td.right { text-align:right; }42 td.left { text-align:left; }43 td.center { text-align:center; }44 dt { font-weight: bold; }45 div.figure { padding: 0.5em; }46 div.figure p { text-align: center; }47 textarea { overflow-x: auto; }48 .linenr { font-size:smaller }49 .code-highlighted {background-color:#ffff00;}50 .org-info-js_info-navigation { border-style:none; }51 #org-info-js_console-label { font-size:10px; font-weight:bold;52 white-space:nowrap; }53 .org-info-js_search-highlight {background-color:#ffff00; color:#000000;54 font-weight:bold; }55 /*]]>*/-->56 </style>57 <link rel="stylesheet" type="text/css" href="../css/aurellem.css" />58 <script type="text/javascript">59 <!--/*--><![CDATA[/*><!--*/60 function CodeHighlightOn(elem, id)61 {62 var target = document.getElementById(id);63 if(null != target) {64 elem.cacheClassElem = elem.className;65 elem.cacheClassTarget = target.className;66 target.className = "code-highlighted";67 elem.className = "code-highlighted";68 }69 }70 function CodeHighlightOff(elem, id)71 {72 var target = document.getElementById(id);73 if(elem.cacheClassElem)74 elem.className = elem.cacheClassElem;75 if(elem.cacheClassTarget)76 target.className = elem.cacheClassTarget;77 }78 /*]]>*///-->79 </script>80 <script type="text/javascript" src="http://orgmode.org/mathjax/MathJax.js">81 <!--/*--><![CDATA[/*><!--*/82 MathJax.Hub.Config({83 // Only one of the two following lines, depending on user settings84 // First allows browser-native MathML display, second forces HTML/CSS85 // config: ["MMLorHTML.js"], jax: ["input/TeX"],86 jax: ["input/TeX", "output/HTML-CSS"],87 extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js",88 "TeX/noUndefined.js"],89 tex2jax: {90 inlineMath: [ ["\\(","\\)"] ],91 displayMath: [ ['$$','$$'], ["\\[","\\]"], ["\\begin{displaymath}","\\end{displaymath}"] ],92 skipTags: ["script","noscript","style","textarea","pre","code"],93 ignoreClass: "tex2jax_ignore",94 processEscapes: false,95 processEnvironments: true,96 preview: "TeX"97 },98 showProcessingMessages: true,99 displayAlign: "center",100 displayIndent: "2em",102 "HTML-CSS": {103 scale: 100,104 availableFonts: ["STIX","TeX"],105 preferredFont: "TeX",106 webFont: "TeX",107 imageFont: "TeX",108 showMathMenu: true,109 },110 MMLorHTML: {111 prefer: {112 MSIE: "MML",113 Firefox: "MML",114 Opera: "HTML",115 other: "HTML"116 }117 }118 });119 /*]]>*///-->120 </script>121 </head>122 <body>123 <div id="content">129 <h1>Categorical Programs</h1>132 <div id="table-of-contents">133 <h2>Table of Contents</h2>134 <div id="text-table-of-contents">135 <ul>136 <li><a href="#sec-1">1 The Category of Types </a>137 <ul>138 <li><a href="#sec-1-1">1.1 Building new data types out of existing ones </a></li>139 </ul>140 </li>141 </ul>142 </div>143 </div>145 <div id="outline-container-1" class="outline-2">146 <h2 id="sec-1"><span class="section-number-2">1</span> The Category of Types </h2>147 <div class="outline-text-2" id="text-1">149 <p>Every computer language with data types (such as Integers,150 Floats, or151 Strings) corresponds with a certain category; the objects of the category are the data types152 of the language, and there is one arrow between data types \(A\) and \(B\)153 for every function in the language whose argument has type \(A\) and whose return value154 has type \(B\).155 </p>159 <pre class="src src-clojure">(<span style="color: #f0dfaf; font-weight: bold;">ns</span> categorical.morphisms)161 </pre>167 </div>169 <div id="outline-container-1-1" class="outline-3">170 <h3 id="sec-1-1"><span class="section-number-3">1.1</span> Building new data types out of existing ones </h3>171 <div class="outline-text-3" id="text-1-1">174 <p>175 We will now discuss two processes which combine existing176 data types to yield composite data types. These higher-order processes will be177 <i>functorial</i>, which means that they will recombine not only the objects of178 our category (the data types), but the arrows as well (functions with179 typed input and output).180 </p>181 <p>182 The <code>product</code> functor combines two data types, \(A\) and \(B\), producing183 a new type, denoted \(A\times B\). Conceptually, values with the data type \(A\times184 B\) have two components, the first of which is a value of type \(A\), the185 second of which is a value of type \(B\). Concretely, the data type \(A\times B\)186 can be implemented as pairs of values, the first of which is187 of type \(A\) and the second of which is of type \(B\). With this188 implementation in mind, you can see that the type \(A\) and type \(B\)189 constituents of type \(A\times B\) value can be recovered; the so-called190 projection functors <code>first</code> and <code>second</code> recover them. A third191 functor, the <code>diagonal</code> functor, completes our toolkit; given192 value \(a\) of type \(A\), it produces the value \((a,a)\) of type \(A\times A\).193 </p>197 <pre class="src src-clojure">(<span style="color: #f0dfaf; font-weight: bold;">defn</span> <span style="color: #f0dfaf;">product</span>[a b] (<span style="color: #8cd0d3;">list</span> a b))198 (<span style="color: #f0dfaf; font-weight: bold;">def</span> <span style="color: #f0dfaf;">projections</span> (<span style="color: #8cd0d3;">list</span> first second))199 (<span style="color: #f0dfaf; font-weight: bold;">defn</span> <span style="color: #f0dfaf;">diagonal</span>[a] (product a a))201 </pre>206 <p>207 The <code>coproduct</code> functor combines two data types, \(A\) and \(B\),208 producing a new type, denoted \(A+B\). Conceptually, you construct the209 \(A+B\) datatype by creating labelled versions of the data types \(A\) and210 \(B\) — we'll call them black-\(A\) and white-\(B\) — and211 then creating a data type \(A+B\) which contains all the black-\(A\)212 values and all the white-\(B\) values. Concretely, you can implement the213 \(A+B\) data type using label-value pairs: the first value in the pair214 is either the label `black' or the label `white'; the second215 value must have type \(A\) if the label is black, or type \(B\) if the216 label is white.217 </p>218 <p>219 Now, the <code>product</code> functor came with projection functors <code>first</code>220 and <code>second</code> that take \(A\times B\) values and return (respectively) \(A\) values and221 \(B\) values. The <code>coproduct</code> functor, conversely, comes with two222 injection functors <code>make-black</code> and <code>make-white</code> that perform the223 opposite function: they take (respectively) \(A\) values and \(B\) values,224 promoting them to the \(A+B\) datatype by making the \(A\)'s into225 black-\(A\)'s and the \(B\)'s into white-\(B\)'s.226 </p>229 </div>230 </div>231 </div>232 <div id="postamble">233 <p class="date">Date: 2011-07-01 12:28:39 CDT</p>234 <p class="author">Author: Dylan Holmes</p>235 <p class="creator">Org version 7.5 with Emacs version 23</p>236 <a href="http://validator.w3.org/check?uri=referer">Validate XHTML 1.0</a>237 </div>238 </div>239 </body>240 </html>