5 <meta name="generator" content="pandoc">
6 <meta name="author" content="Ilya Kostyuchenko">
8 <meta name="apple-mobile-web-app-capable" content="yes">
9 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
10 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
11 <link rel="stylesheet" href="reveal.js/css/reset.css">
12 <link rel="stylesheet" href="reveal.js/css/reveal.css">
14 code{white-space: pre-wrap;}
15 span.smallcaps{font-variant: small-caps;}
16 span.underline{text-decoration: underline;}
17 div.column{display: inline-block; vertical-align: top; width: 50%;}
18 div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
19 ul.task-list{list-style: none;}
20 pre > code.sourceCode { white-space: pre; position: relative; }
21 pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
22 pre > code.sourceCode > span:empty { height: 1.2em; }
23 code.sourceCode > span { color: inherit; text-decoration: inherit; }
24 div.sourceCode { margin: 1em 0; }
25 pre.sourceCode { margin: 0; }
27 div.sourceCode { overflow: auto; }
30 pre > code.sourceCode { white-space: pre-wrap; }
31 pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
34 { counter-reset: source-line 0; }
35 pre.numberSource code > span
36 { position: relative; left: -4em; counter-increment: source-line; }
37 pre.numberSource code > span > a:first-child::before
38 { content: counter(source-line);
39 position: relative; left: -1em; text-align: right; vertical-align: baseline;
40 border: none; display: inline-block;
41 -webkit-touch-callout: none; -webkit-user-select: none;
42 -khtml-user-select: none; -moz-user-select: none;
43 -ms-user-select: none; user-select: none;
44 padding: 0 4px; width: 4em;
45 background-color: #232629;
48 pre.numberSource { margin-left: 3em; border-left: 1px solid #7a7c7d; padding-left: 4px; }
50 { color: #ffffff; background-color: #000000; }
52 pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
54 code span. { color: #ffffff; } /* Normal */
55 code span.al { color: #95da4c; background-color: #4d1f24; font-weight: bold; } /* Alert */
56 code span.an { color: #86d5a4; } /* Annotation */
57 code span.at { color: #94cbf0; } /* Attribute */
58 code span.bn { color: #ffb06a; } /* BaseN */
59 code span.bu { color: #bdd1d3; } /* BuiltIn */
60 code span.cf { color: #ffd998; font-weight: bold; } /* ControlFlow */
61 code span.ch { color: #a4e0ff; } /* Char */
62 code span.cn { color: #73d9d9; font-weight: bold; } /* Constant */
63 code span.co { color: #a1a6a8; } /* Comment */
64 code span.cv { color: #b6c8c9; } /* CommentVar */
65 code span.do { color: #a43340; } /* Documentation */
66 code span.dt { color: #7cc0ec; } /* DataType */
67 code span.dv { color: #f6b77f; } /* DecVal */
68 code span.er { color: #e9848e; text-decoration: underline; } /* Error */
69 code span.ex { color: #96d5ff; font-weight: bold; } /* Extension */
70 code span.fl { color: #fdae67; } /* Float */
71 code span.fu { color: #d487f4; } /* Function */
72 code span.im { color: #76e8a6; } /* Import */
73 code span.in { color: #f6b176; } /* Information */
74 code span.kw { color: #ebebc9; font-weight: bold; } /* Keyword */
75 code span.op { color: #ececde; } /* Operator */
76 code span.ot { color: #86e9b0; } /* Other */
77 code span.pp { color: #62e298; } /* Preprocessor */
78 code span.re { color: #83c7f4; background-color: #153042; } /* RegionMarker */
79 code span.sc { color: #80ccf4; } /* SpecialChar */
80 code span.ss { color: #ff909b; } /* SpecialString */
81 code span.st { color: #ff9f9f; } /* String */
82 code span.va { color: #56d4d4; } /* Variable */
83 code span.vs { color: #eca2a9; } /* VerbatimString */
84 code span.wa { color: #eca2a9; } /* Warning */
86 <link rel="stylesheet" href="reveal.js/css/theme/superblack.css" id="theme">
87 <!-- Printing and PDF exports -->
89 var link = document.createElement( 'link' );
90 link.rel = 'stylesheet';
91 link.type = 'text/css';
92 link.href = window.location.search.match( /print-pdf/gi ) ? 'reveal.js/css/print/pdf.css' : 'reveal.js/css/print/paper.css';
93 document.getElementsByTagName( 'head' )[0].appendChild( link );
96 <script src="reveal.js/lib/js/html5shiv.js"></script>
100 background-color: transparent;
115<section id="функциональное-программирование" class="slide level1">
116<h1>Функциональное программирование</h1>
118<p>Функциональное программирование это не про использование map filter reduce. Функциональное программирование это вообще ортогонально к ооп. ИМХО проблема с ООП – наследование (которое тоже ортогонально к ООП) – нет разграничения между абстракцией и реализацией. и вообще обзывание это функциональным программированием – не совсем правильно. то, что мы сейчас будем пытаться сделать – сделать код более переиспользуемым. сделать наши данные максимально тупыми => переиспользуемыми. пытаться комбинировать слишком умные куски – не получится – слишком сложно. мы хотим сделать простые куски, которые просто комбинировать и еще чтобы компилятор проверял эти наши комбинации на валидность.</p>
121<section class="slide level1">
123<section data-background="images/synthwave.jpeg">
125Программировать можно без боли
129<section class="slide level1">
131<p>Функциональное программирование – метапрограммирование над эффектами.</p>
133<section class="slide level1">
135<h2 id="эффекты">Эффекты?</h2>
136<div class="sourceCode" id="cb1"><pre class="sourceCode java fragment"><code class="sourceCode java"><span id="cb1-1"><a href="#cb1-1"></a><span class="kw">class</span> Cafe {</span>
137<span id="cb1-2"><a href="#cb1-2"></a> Coffee <span class="fu">buyCoffee</span>(CreditCard cc, Payments p) {</span>
138<span id="cb1-3"><a href="#cb1-3"></a> Coffee cup = <span class="kw">new</span> <span class="fu">Coffee</span>();</span>
139<span id="cb1-4"><a href="#cb1-4"></a> p.<span class="fu">charge</span>(cc, cup.<span class="fu">price</span>);</span>
140<span id="cb1-5"><a href="#cb1-5"></a> <span class="kw">return</span> cup;</span>
141<span id="cb1-6"><a href="#cb1-6"></a> }</span>
142<span id="cb1-7"><a href="#cb1-7"></a>}</span></code></pre></div>
144<section class="slide level1">
146<p><img data-src="images/coffee-with-effects.png" width="450" /></p>
148<section class="slide level1">
150<div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb2-1"><a href="#cb2-1"></a><span class="kw">class</span> Cafe {</span>
151<span id="cb2-2"><a href="#cb2-2"></a> Pair<Coffee, Charge> <span class="fu">buyCoffee</span>(CreditCard cc) {</span>
152<span id="cb2-3"><a href="#cb2-3"></a> Coffee cup = <span class="kw">new</span> <span class="fu">Coffee</span>();</span>
153<span id="cb2-4"><a href="#cb2-4"></a> <span class="kw">return</span> <span class="kw">new</span> <span class="fu">Pair</span>(cup, cup.<span class="fu">price</span>);</span>
154<span id="cb2-5"><a href="#cb2-5"></a> }</span>
155<span id="cb2-6"><a href="#cb2-6"></a>}</span></code></pre></div>
157<section class="slide level1">
162<img data-src="images/coffee-without-effects.png" width="450" />
165<img data-src="images/coffee-without-effects-list.png" class="fragment" width="450" />
170<section class="slide level1">
172<p>Функциональное программирование:</p>
174<p>функции – это тоже данные.</p>
176<p><code>Int -> Bool</code> (функция) – ровно такие же данные как и <code>Int</code>. Их также можно складывать в структуры, передавать как аргументы и т. п.</p>
178<section id="нотация" class="slide level1">
181<section class="slide level1">
186<div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb3-1"><a href="#cb3-1"></a> <span class="dt">int</span> x;</span></code></pre></div>
189<div class="sourceCode" id="cb4"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb4-1"><a href="#cb4-1"></a><span class="ot"> x ::</span> <span class="dt">Int</span></span></code></pre></div>
194<div class="sourceCode" id="cb5"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb5-1"><a href="#cb5-1"></a> <span class="dt">int</span> <span class="fu">f</span>(<span class="dt">int</span> x)</span></code></pre></div>
197<div class="sourceCode" id="cb6"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb6-1"><a href="#cb6-1"></a><span class="ot"> f ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span></span></code></pre></div>
202<div class="sourceCode" id="cb7"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb7-1"><a href="#cb7-1"></a> <span class="dt">static</span> <T> T <span class="fu">f</span>(T x)</span></code></pre></div>
205<div class="sourceCode" id="cb8"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb8-1"><a href="#cb8-1"></a><span class="ot"> f ::</span> a <span class="ot">-></span> a</span></code></pre></div>
210<section class="slide level1">
215<div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb9-1"><a href="#cb9-1"></a> <span class="dt">static</span> <T> T <span class="fu">f</span>(T x)</span></code></pre></div>
218<div class="sourceCode" id="cb10"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb10-1"><a href="#cb10-1"></a><span class="ot"> f ::</span> a <span class="ot">-></span> a</span></code></pre></div>
223<div class="sourceCode" id="cb11"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb11-1"><a href="#cb11-1"></a> <span class="fu">f</span>(x);</span></code></pre></div>
226<div class="sourceCode" id="cb12"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb12-1"><a href="#cb12-1"></a> f x</span></code></pre></div>
231<div class="sourceCode" id="cb13"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb13-1"><a href="#cb13-1"></a> <span class="fu">f</span>(x, y);</span></code></pre></div>
234<div class="sourceCode" id="cb14"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb14-1"><a href="#cb14-1"></a> f x y</span></code></pre></div>
235<div class="sourceCode" id="cb15"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb15-1"><a href="#cb15-1"></a> f x y <span class="ot">=</span> (f x) y</span></code></pre></div>
241<p>Left-associative Currying</p>
244<section class="slide level1">
249<div class="sourceCode" id="cb16"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb16-1"><a href="#cb16-1"></a> <span class="dt">static</span> <T> T <span class="fu">f</span>(T x)</span>
250<span id="cb16-2"><a href="#cb16-2"></a> <span class="dt">static</span> <T> T <span class="fu">g</span>(T x)</span></code></pre></div>
253<div class="sourceCode" id="cb17"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb17-1"><a href="#cb17-1"></a><span class="ot"> f ::</span> a <span class="ot">-></span> a</span>
254<span id="cb17-2"><a href="#cb17-2"></a><span class="ot"> g ::</span> a <span class="ot">-></span> a</span></code></pre></div>
259<div class="sourceCode" id="cb18"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb18-1"><a href="#cb18-1"></a> <span class="fu">f</span>(<span class="fu">g</span>(x));</span>
260<span id="cb18-2"><a href="#cb18-2"></a> <span class="fu">g</span>(<span class="fu">f</span>(x));</span></code></pre></div>
263<div class="sourceCode" id="cb19"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb19-1"><a href="#cb19-1"></a> f (g x)</span>
264<span id="cb19-2"><a href="#cb19-2"></a> g (f x)</span></code></pre></div>
269<section id="композиция" class="slide level1">
272<section class="slide level1">
274<div class="sourceCode" id="cb20"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb20-1"><a href="#cb20-1"></a><span class="ot">f ::</span> a <span class="ot">-></span> a</span>
275<span id="cb20-2"><a href="#cb20-2"></a><span class="ot">g ::</span> a <span class="ot">-></span> a</span></code></pre></div>
276<div class="sourceCode" id="cb21"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb21-1"><a href="#cb21-1"></a>f (g x)</span></code></pre></div>
277<div class="sourceCode" id="cb22"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb22-1"><a href="#cb22-1"></a>(f <span class="op">.</span> g) x <span class="op">==</span> f (g x)</span></code></pre></div>
278<div class="sourceCode" id="cb23"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb23-1"><a href="#cb23-1"></a>h <span class="ot">=</span> f <span class="op">.</span> g</span>
279<span id="cb23-2"><a href="#cb23-2"></a>h x <span class="op">==</span> f (g x)</span></code></pre></div>
281<section class="slide level1">
283<div class="sourceCode" id="cb24"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb24-1"><a href="#cb24-1"></a><span class="ot">f ::</span> a <span class="ot">-></span> a</span>
284<span id="cb24-2"><a href="#cb24-2"></a><span class="ot">g ::</span> a <span class="ot">-></span> a</span></code></pre></div>
285<div class="sourceCode" id="cb25"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb25-1"><a href="#cb25-1"></a><span class="ot">h ::</span> a <span class="ot">-></span> a</span>
286<span id="cb25-2"><a href="#cb25-2"></a>h <span class="ot">=</span> f <span class="op">.</span> g</span></code></pre></div>
287<div class="sourceCode" id="cb26"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb26-1"><a href="#cb26-1"></a>f x <span class="ot">=</span> x <span class="op">*</span> <span class="dv">2</span></span>
288<span id="cb26-2"><a href="#cb26-2"></a>g x <span class="ot">=</span> x <span class="op">-</span> <span class="dv">3</span></span>
289<span id="cb26-3"><a href="#cb26-3"></a></span>
290<span id="cb26-4"><a href="#cb26-4"></a>(f <span class="op">.</span> g) <span class="dv">5</span></span>
291<span id="cb26-5"><a href="#cb26-5"></a><span class="co">-- 4</span></span></code></pre></div>
292<!-- ### моноид {#моноид .fragment} -->
294<p>моноид – у тебя есть две штуки одного типа и ты можешь получить еще одну штуку такого же типа. Это очень простой способ рождения сложности из простоты причем тип h выводится из определения. Нам его указывать не надо. если у нас изначальные маленькие кусочки хорошо описаны, то порожденные большие кусочки будут автоматически хорошо описанными.</p>
300[Бинарная асоциативная операция]{.fragment}
302```{.fragment .haskell}
303(.) :: (a -> a) -> (a -> a) -> (a -> a)
306[Нейтральный элемент]{.fragment}
308```{.fragment .haskell}
313<section id="haskell" class="slide level1">
316<section class="slide level1">
318<h3 id="чисто-функциональный">Чисто функциональный</h3>
319<p>Все что функция может сделать – посмотреть на свои аргументы это вернуть значение.</p>
321<p>Нельзя просто произвольно распечатать строку в консоль, нельзя просто произвольно отправить запрос на бд, нельзя просто произвольно изменить глобальную переменную.</p>
324<section class="slide level1">
326<h3 id="referential-transparency">Referential transparency</h3>
327<h5 id="любую-константу-можно-заменить-на-само-значение">(Любую константу можно заменить на само значение)</h5>
328<div class="sourceCode" id="cb27"><pre class="sourceCode java fragment"><code class="sourceCode java"><span id="cb27-1"><a href="#cb27-1"></a><span class="dt">int</span> x = <span class="dv">8</span>;</span>
329<span id="cb27-2"><a href="#cb27-2"></a><span class="dt">int</span> y = x++;</span>
330<span id="cb27-3"><a href="#cb27-3"></a><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(y + <span class="st">" might be the same as "</span> + y);</span></code></pre></div>
331<div class="sourceCode" id="cb28"><pre class="sourceCode java fragment"><code class="sourceCode java"><span id="cb28-1"><a href="#cb28-1"></a><span class="dt">int</span> x = <span class="dv">8</span>;</span>
332<span id="cb28-2"><a href="#cb28-2"></a><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(x++ + <span class="st">" might be the same as "</span> + x++);</span></code></pre></div>
334<p>Сильно упрощает рефакторинг и понимание кода.</p>
337<section id="immuatble" class="slide level1">
339<h2 id="совсем-immutable">Совсем immutable</h2>
340<p>Можно не думать о порядке выражений.</p>
342<section class="slide level1">
344<h3 id="нет-переменных-циклов-и-условных-переходов">Нет переменных, циклов и условных переходов</h3>
345<p><span class="fragment">Зато есть константы и нормальная рекурсия (А переходов вообще нет)</span></p>
347<section class="slide level1">
349<h3 id="очень-ленивый">Очень ленивый</h3>
350<div class="sourceCode" id="cb29"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb29-1"><a href="#cb29-1"></a>xs <span class="ot">=</span> [<span class="dv">4</span>, <span class="dv">1</span>, <span class="dv">3</span>, <span class="dv">2</span>]</span>
351<span id="cb29-2"><a href="#cb29-2"></a>xs' <span class="ot">=</span> <span class="fu">sort</span> xs</span>
352<span id="cb29-3"><a href="#cb29-3"></a><span class="fu">print</span> xs</span></code></pre></div>
353<div class="fragment">
354<p><code>xs'</code> не нужен чтобы распечатать <code>xs</code>, поэтому сортироваться ничто не будет. (Зачем делать то, что можно не делать)</p>
357<section class="slide level1">
359<p>Если хотите быстро и просто потыкаться, тут есть интерктивная штука:</p>
360<p><a href="https://www.haskell.org">haskell.org</a></p>
362<section id="синтаксис" class="slide level1">
365<section id="функции" class="slide level1">
368<section class="slide level1">
370<div class="sourceCode" id="cb30"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb30-1"><a href="#cb30-1"></a><span class="ot">add2 ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span></span>
371<span id="cb30-2"><a href="#cb30-2"></a>add2 x <span class="ot">=</span> x <span class="op">+</span> <span class="dv">2</span></span></code></pre></div>
372<p>Все функции и константы всегда обозначаются словами с маленькой буквы без пробелов.</p>
373<p>(Константы это просто функции с нулем аргументов.)</p>
375<p>Мы буквально говорим что функция на таком-то аргументе равна чему-то.</p>
378<section class="slide level1">
380<h2 id="pattern-matching">Pattern matching</h2>
381<div class="sourceCode" id="cb31"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb31-1"><a href="#cb31-1"></a><span class="ot">fixBuz ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">String</span></span>
382<span id="cb31-2"><a href="#cb31-2"></a>fixBuz <span class="dv">3</span> <span class="ot">=</span> <span class="st">"Fiz"</span></span>
383<span id="cb31-3"><a href="#cb31-3"></a>fixBuz <span class="dv">5</span> <span class="ot">=</span> <span class="st">"Buz"</span></span>
384<span id="cb31-4"><a href="#cb31-4"></a>fixBuz <span class="dv">15</span> <span class="ot">=</span> <span class="st">"FizBuz"</span></span>
385<span id="cb31-5"><a href="#cb31-5"></a>fixBuz _ <span class="ot">=</span> <span class="st">"Some other number"</span></span></code></pre></div>
386<p>Так матчить можно произвольные структуры произвольного уровня вложенности.</p>
387<p><code>_</code> – специальное название константы, которое говорит что вам все равно что в ней лежит.</p>
389<p>функции объявляются в несколькро строк. Первая – обьявленик типа функции, а последующие – реализация. В общем случае тип можно не указывать, но указывать тип у высказыванй на самом верхнем уровне (не вложенные) считается хорошим тоном и улучшает выведение типов и ошибки компиляции. У функции может быть несколько реализаций: какая из них вызовется зависит от значений передаваемых аргументов. матчинг произхводится сверху вниз. если в аргемантах написано слово с маленькой буквы, то значение аргумента биндится на эту константу.</p>
392<section class="slide level1">
394<h2 id="структуры">Структуры</h2>
396<section class="slide level1">
398<h2 id="произведение-типов">Произведение типов</h2>
399<h5 id="обычные-поля-структур">(обычные поля структур)</h5>
401<p>После констрктора можно укзать существующие типы, которые в нем храняться.</p>
403<div class="sourceCode" id="cb32"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb32-1"><a href="#cb32-1"></a><span class="kw">data</span> <span class="dt">PersonType</span> <span class="ot">=</span> <span class="dt">Person</span> <span class="dt">String</span> <span class="dt">Int</span></span></code></pre></div>
404<div class="sourceCode" id="cb33"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb33-1"><a href="#cb33-1"></a><span class="ot">vasya ::</span> <span class="dt">PersonType</span></span>
405<span id="cb33-2"><a href="#cb33-2"></a>vasya <span class="ot">=</span> <span class="dt">Person</span> <span class="st">"Vasya"</span> <span class="dv">8</span></span>
406<span id="cb33-3"><a href="#cb33-3"></a><span class="co">-- тип можно не укзывать</span></span>
407<span id="cb33-4"><a href="#cb33-4"></a>petya <span class="ot">=</span> <span class="dt">Person</span> <span class="st">"Petya"</span> <span class="dv">5</span></span></code></pre></div>
408<div class="sourceCode" id="cb34"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb34-1"><a href="#cb34-1"></a><span class="ot">getName ::</span> <span class="dt">PersonType</span> <span class="ot">-></span> <span class="dt">String</span></span>
409<span id="cb34-2"><a href="#cb34-2"></a>getName (<span class="dt">Person</span> name _) <span class="ot">=</span> name</span></code></pre></div>
410<div class="sourceCode" id="cb35"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb35-1"><a href="#cb35-1"></a><span class="ot">greetPerson ::</span> <span class="dt">PersonType</span> <span class="ot">-></span> <span class="dt">String</span></span>
411<span id="cb35-2"><a href="#cb35-2"></a>greetPerson p <span class="ot">=</span> <span class="st">"Hello, "</span> <span class="op">++</span> getName p</span></code></pre></div>
412<div class="sourceCode" id="cb36"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb36-1"><a href="#cb36-1"></a>greetPerson petya</span>
413<span id="cb36-2"><a href="#cb36-2"></a><span class="co">-- "Hello, Petya"</span></span></code></pre></div>
415<section class="slide level1">
417<div class="sourceCode" id="cb37"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb37-1"><a href="#cb37-1"></a>vasya <span class="ot">=</span> <span class="dt">Person</span> <span class="st">"Vasya"</span> <span class="dv">8</span></span>
418<span id="cb37-2"><a href="#cb37-2"></a>petya <span class="ot">=</span> <span class="dt">Person</span> <span class="st">"Petya"</span> <span class="dv">5</span></span></code></pre></div>
419<div class="sourceCode" id="cb38"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb38-1"><a href="#cb38-1"></a><span class="ot">matchVasya ::</span> <span class="dt">PersonType</span> <span class="ot">-></span> <span class="dt">Bool</span></span>
420<span id="cb38-2"><a href="#cb38-2"></a>matchVasya (<span class="dt">Person</span> <span class="st">"Vasya"</span> _) <span class="ot">=</span> <span class="dt">True</span></span>
421<span id="cb38-3"><a href="#cb38-3"></a>matchVasya _ <span class="ot">=</span> <span class="dt">False</span></span></code></pre></div>
422<div class="sourceCode" id="cb39"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb39-1"><a href="#cb39-1"></a>matchVasya vasya</span>
423<span id="cb39-2"><a href="#cb39-2"></a><span class="co">-- True</span></span>
424<span id="cb39-3"><a href="#cb39-3"></a></span>
425<span id="cb39-4"><a href="#cb39-4"></a>matchVasya petya</span>
426<span id="cb39-5"><a href="#cb39-5"></a><span class="co">-- False</span></span></code></pre></div>
428<section class="slide level1">
430<div class="sourceCode" id="cb40"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb40-1"><a href="#cb40-1"></a><span class="kw">data</span> <span class="dt">Foo</span> <span class="ot">=</span> <span class="dt">Bar</span></span>
431<span id="cb40-2"><a href="#cb40-2"></a></span>
432<span id="cb40-3"><a href="#cb40-3"></a><span class="ot">qux ::</span> <span class="dt">Foo</span></span>
433<span id="cb40-4"><a href="#cb40-4"></a>qux <span class="ot">=</span> <span class="dt">Bar</span></span></code></pre></div>
434<p><code>Foo</code> – тип структуры. <code>Bar</code> – конструктор структуры.</p>
435<p>Тут у <code>Foo</code> всего одно значение <code>Bar</code>.</p>
437<section class="slide level1">
439<h2 id="еще-немного-функций">Еще немного функций</h2>
440<div class="sourceCode" id="cb41"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb41-1"><a href="#cb41-1"></a><span class="ot">greetPerson ::</span> <span class="dt">PersonType</span> <span class="ot">-></span> <span class="dt">String</span></span>
441<span id="cb41-2"><a href="#cb41-2"></a>greetPerson p <span class="ot">=</span> <span class="st">"Hello, "</span> <span class="op">++</span> getName p</span></code></pre></div>
442<div class="sourceCode" id="cb42"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb42-1"><a href="#cb42-1"></a><span class="ot">greetPerson ::</span> <span class="dt">PersonType</span> <span class="ot">-></span> <span class="dt">String</span></span>
443<span id="cb42-2"><a href="#cb42-2"></a>greetPerson p <span class="ot">=</span> <span class="st">"Hello, "</span> <span class="op">++</span> name</span>
444<span id="cb42-3"><a href="#cb42-3"></a> <span class="kw">where</span></span>
445<span id="cb42-4"><a href="#cb42-4"></a> name <span class="ot">=</span> getName p</span></code></pre></div>
446<div class="sourceCode" id="cb43"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb43-1"><a href="#cb43-1"></a><span class="ot">greetPerson ::</span> <span class="dt">PersonType</span> <span class="ot">-></span> <span class="dt">String</span></span>
447<span id="cb43-2"><a href="#cb43-2"></a>greetPerson p <span class="ot">=</span> <span class="st">"Hello, "</span> <span class="op">++</span> name</span>
448<span id="cb43-3"><a href="#cb43-3"></a> <span class="kw">where</span></span>
449<span id="cb43-4"><a href="#cb43-4"></a> getName' (<span class="dt">Person</span> name _) <span class="ot">=</span> name</span>
450<span id="cb43-5"><a href="#cb43-5"></a> name <span class="ot">=</span> getName' p</span></code></pre></div>
452<section class="slide level1">
454<div class="sourceCode" id="cb44"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb44-1"><a href="#cb44-1"></a><span class="kw">data</span> <span class="dt">PersonType</span> <span class="ot">=</span> <span class="dt">Person</span> <span class="dt">String</span> <span class="dt">Int</span></span>
455<span id="cb44-2"><a href="#cb44-2"></a></span>
456<span id="cb44-3"><a href="#cb44-3"></a><span class="ot">getName ::</span> <span class="dt">PersonType</span> <span class="ot">-></span> <span class="dt">String</span></span>
457<span id="cb44-4"><a href="#cb44-4"></a>getName (<span class="dt">Person</span> name _) <span class="ot">=</span> name</span></code></pre></div>
458<div class="sourceCode" id="cb45"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb45-1"><a href="#cb45-1"></a><span class="ot">greetName ::</span> <span class="dt">String</span> <span class="ot">-></span> <span class="dt">String</span></span>
459<span id="cb45-2"><a href="#cb45-2"></a>greetName name <span class="ot">=</span> <span class="st">"Hello, "</span> <span class="op">++</span> name</span></code></pre></div>
460<div class="sourceCode" id="cb46"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb46-1"><a href="#cb46-1"></a><span class="ot">greetPerson ::</span> <span class="dt">PersonType</span> <span class="ot">-></span> <span class="dt">String</span></span>
461<span id="cb46-2"><a href="#cb46-2"></a>greetPerson p <span class="ot">=</span> greetName (getName p)</span></code></pre></div>
462<div class="sourceCode" id="cb47"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb47-1"><a href="#cb47-1"></a><span class="ot">greetPerson ::</span> <span class="dt">PersonType</span> <span class="ot">-></span> <span class="dt">String</span></span>
463<span id="cb47-2"><a href="#cb47-2"></a>greetPerson <span class="ot">=</span> greetName <span class="op">.</span> getName</span></code></pre></div>
464<div class="sourceCode" id="cb48"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb48-1"><a href="#cb48-1"></a>greetPerson petya</span>
465<span id="cb48-2"><a href="#cb48-2"></a><span class="co">-- "Hello, Petya"</span></span></code></pre></div>
466<div class="sourceCode" id="cb49"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb49-1"><a href="#cb49-1"></a>(greetName <span class="op">.</span> getName) petya</span>
467<span id="cb49-2"><a href="#cb49-2"></a><span class="co">-- "Hello, Petya"</span></span></code></pre></div>
469<section class="slide level1">
471<h2 id="суммы-типов">Суммы типов</h2>
473<p>Функции нескольких аргументов – странный синтаксис – потом расскажу. А пока используем тюпли!</p>
474<p>В большинстве других языков этого нет и используются всякие странные кодирования типо нулевые указатели, и никто не просит тебя их проверять, что очень плохо.</p>
476<div class="sourceCode" id="cb50"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb50-1"><a href="#cb50-1"></a><span class="kw">data</span> <span class="dt">Bool</span> <span class="ot">=</span> <span class="dt">False</span> <span class="op">|</span> <span class="dt">True</span></span></code></pre></div>
477<div class="sourceCode" id="cb51"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb51-1"><a href="#cb51-1"></a><span class="ot">x ::</span> <span class="dt">Bool</span></span>
478<span id="cb51-2"><a href="#cb51-2"></a>x <span class="ot">=</span> <span class="dt">True</span></span>
479<span id="cb51-3"><a href="#cb51-3"></a>y <span class="ot">=</span> <span class="dt">False</span></span></code></pre></div>
480<div class="sourceCode" id="cb52"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb52-1"><a href="#cb52-1"></a><span class="ot">ifThenElse ::</span> (<span class="dt">Bool</span>, a, a) <span class="ot">-></span> a</span></code></pre></div>
481<div class="sourceCode" id="cb53"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb53-1"><a href="#cb53-1"></a>ifThenElse (<span class="dt">True</span>, a, _) <span class="ot">=</span> a</span>
482<span id="cb53-2"><a href="#cb53-2"></a>ifThenElse (<span class="dt">False</span>, _, b) <span class="ot">=</span> b</span></code></pre></div>
483<div class="sourceCode" id="cb54"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb54-1"><a href="#cb54-1"></a>ifThenElse (<span class="dt">True</span>, <span class="st">"Hello"</span>, <span class="st">"World"</span>)</span>
484<span id="cb54-2"><a href="#cb54-2"></a><span class="co">-- "Hello"</span></span></code></pre></div>
485<div class="sourceCode" id="cb55"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb55-1"><a href="#cb55-1"></a>ifThenElse (<span class="dt">False</span>, <span class="st">"Hello"</span>, <span class="st">"World"</span>)</span>
486<span id="cb55-2"><a href="#cb55-2"></a><span class="co">-- "World"</span></span></code></pre></div>
488<section class="slide level1">
490<div class="sourceCode" id="cb56"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb56-1"><a href="#cb56-1"></a><span class="kw">data</span> <span class="dt">CircleType</span> <span class="ot">=</span> <span class="dt">Circle</span> <span class="dt">Double</span> <span class="dt">Double</span> <span class="dt">Double</span></span>
491<span id="cb56-2"><a href="#cb56-2"></a><span class="kw">data</span> <span class="dt">RectangleType</span> <span class="ot">=</span> <span class="dt">Rectangle</span> <span class="dt">Double</span> <span class="dt">Double</span> <span class="dt">Double</span> <span class="dt">Double</span></span></code></pre></div>
492<div class="sourceCode" id="cb57"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb57-1"><a href="#cb57-1"></a><span class="kw">data</span> <span class="dt">Shape</span> <span class="ot">=</span></span>
493<span id="cb57-2"><a href="#cb57-2"></a> <span class="dt">CircleShape</span> <span class="dt">CircleType</span> <span class="op">|</span> <span class="dt">RectangleShape</span> <span class="dt">RectangleType</span></span></code></pre></div>
494<div class="sourceCode" id="cb58"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb58-1"><a href="#cb58-1"></a><span class="ot">surface ::</span> <span class="dt">Shape</span> <span class="ot">-></span> <span class="dt">Double</span></span></code></pre></div>
495<div class="sourceCode" id="cb59"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb59-1"><a href="#cb59-1"></a>surface (<span class="dt">CircleShape</span> (<span class="dt">Circle</span> _ _ r)) <span class="ot">=</span></span>
496<span id="cb59-2"><a href="#cb59-2"></a> <span class="fu">pi</span> <span class="op">*</span> r <span class="op">^</span> <span class="dv">2</span></span></code></pre></div>
497<div class="sourceCode" id="cb60"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb60-1"><a href="#cb60-1"></a>surface (<span class="dt">RectangleShape</span> (<span class="dt">Rectangle</span> x1 y1 x2 y2)) <span class="ot">=</span></span>
498<span id="cb60-2"><a href="#cb60-2"></a> (<span class="fu">abs</span> (x2 <span class="op">-</span> x1)) <span class="op">*</span> (<span class="fu">abs</span> (y2 <span class="op">-</span> y1))</span></code></pre></div>
499<div class="sourceCode" id="cb61"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb61-1"><a href="#cb61-1"></a>shape <span class="ot">=</span> <span class="dt">CircleShape</span> (<span class="dt">Circle</span> <span class="dv">0</span> <span class="dv">0</span> <span class="dv">2</span>)</span>
500<span id="cb61-2"><a href="#cb61-2"></a>surface shape</span>
501<span id="cb61-3"><a href="#cb61-3"></a><span class="co">-- 12.566370614359172</span></span></code></pre></div>
502<div class="sourceCode" id="cb62"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb62-1"><a href="#cb62-1"></a>otherShape <span class="ot">=</span> <span class="dt">RectangleShape</span> (<span class="dt">Rectangle</span> <span class="dv">1</span> <span class="dv">2</span> <span class="dv">3</span> <span class="dv">4</span>)</span>
503<span id="cb62-2"><a href="#cb62-2"></a>surface otherShape</span>
504<span id="cb62-3"><a href="#cb62-3"></a><span class="co">-- 4.0</span></span></code></pre></div>
506<section id="и-еще-немного-функций" class="slide level1">
507<h1>И еще немного функций</h1>
509<section class="slide level1">
511<h2 id="лямбда-выражения">Лямбда-выражения</h2>
512<div class="sourceCode" id="cb63"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb63-1"><a href="#cb63-1"></a><span class="ot">add8 ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span></span></code></pre></div>
513<div class="sourceCode" id="cb64"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb64-1"><a href="#cb64-1"></a>add8 x <span class="ot">=</span> x <span class="op">+</span> <span class="dv">8</span></span></code></pre></div>
514<div class="sourceCode" id="cb65"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb65-1"><a href="#cb65-1"></a>add8 <span class="ot">=</span> \x <span class="ot">-></span> x <span class="op">+</span> <span class="dv">8</span></span></code></pre></div>
515<p><span class="fragment">λ – <code>\</code> (λ печатать тяжело)</span></p>
516<div class="sourceCode" id="cb66"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb66-1"><a href="#cb66-1"></a><span class="ot">foo ::</span> (<span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span>) <span class="ot">-></span> <span class="dt">Int</span></span></code></pre></div>
517<div class="sourceCode" id="cb67"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb67-1"><a href="#cb67-1"></a>foo add8</span></code></pre></div>
518<div class="sourceCode" id="cb68"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb68-1"><a href="#cb68-1"></a>foo (\x <span class="ot">-></span> x <span class="op">+</span> <span class="dv">8</span>)</span></code></pre></div>
520<section class="slide level1">
522<h3 id="давайте-придумаем-синтаксис-для-функции-нескольких-аргументов">Давайте придумаем синтаксис для функции нескольких аргументов!</h3>
524<section class="slide level1">
526<div class="sourceCode" id="cb69"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb69-1"><a href="#cb69-1"></a>x,<span class="ot"> y ::</span> <span class="dt">Int</span></span>
527<span id="cb69-2"><a href="#cb69-2"></a>x <span class="ot">=</span> <span class="dv">42</span></span>
528<span id="cb69-3"><a href="#cb69-3"></a>y <span class="ot">=</span> <span class="dv">69</span></span></code></pre></div>
529<div class="sourceCode" id="cb70"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb70-1"><a href="#cb70-1"></a><span class="ot">xPlusY ::</span> <span class="dt">Int</span></span>
530<span id="cb70-2"><a href="#cb70-2"></a>xPlusY <span class="ot">=</span> add x y</span></code></pre></div>
531<p><span class="fragment">Применение функции – лево-ассоциативно</span></p>
532<div class="sourceCode" id="cb71"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb71-1"><a href="#cb71-1"></a>xPlusY <span class="ot">=</span> (add x) y</span></code></pre></div>
533<div class="sourceCode" id="cb72"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb72-1"><a href="#cb72-1"></a>xPlusY <span class="ot">=</span> f y</span>
534<span id="cb72-2"><a href="#cb72-2"></a>f <span class="ot">=</span> add x</span></code></pre></div>
535<div class="sourceCode" id="cb73"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb73-1"><a href="#cb73-1"></a><span class="ot">f ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span></span></code></pre></div>
536<div class="sourceCode" id="cb74"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb74-1"><a href="#cb74-1"></a><span class="ot">add ::</span> <span class="dt">Int</span> <span class="ot">-></span> (<span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span>)</span></code></pre></div>
538<section class="slide level1">
540<div class="sourceCode" id="cb75"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb75-1"><a href="#cb75-1"></a><span class="ot">add ::</span> <span class="dt">Int</span> <span class="ot">-></span> (<span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span>)</span></code></pre></div>
541<p><span class="fragment">Тип <code>-></code> – право-ассоциативный</span></p>
542<div class="sourceCode" id="cb76"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb76-1"><a href="#cb76-1"></a><span class="ot">add ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span></span></code></pre></div>
543<div class="sourceCode" id="cb77"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb77-1"><a href="#cb77-1"></a>add a b <span class="ot">=</span> a <span class="op">+</span> b</span></code></pre></div>
544<div class="sourceCode" id="cb78"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb78-1"><a href="#cb78-1"></a>add <span class="ot">=</span> \a b <span class="ot">-></span> a <span class="op">+</span> b</span></code></pre></div>
546<section class="slide level1">
548<p>Любая функция берет строго один аргумент.</p>
549<p>Функция нескольких аргументов все равно берет строго одтн аргумент и возвращает функцию, которая берет следующий.</p>
550<p><em>(И из-за того, что применение функции лево-ассоциативно, вызов таких не трубует особого синтаксиса.)</em></p>
552<section class="slide level1">
554<h3 id="currying">Currying</h3>
555<div class="sourceCode" id="cb79"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb79-1"><a href="#cb79-1"></a><span class="ot">add ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span></span>
556<span id="cb79-2"><a href="#cb79-2"></a>add a b <span class="ot">=</span> a <span class="op">+</span> b</span></code></pre></div>
557<div class="sourceCode" id="cb80"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb80-1"><a href="#cb80-1"></a><span class="ot">add8 ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span></span></code></pre></div>
558<div class="sourceCode" id="cb81"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb81-1"><a href="#cb81-1"></a><span class="ot">add ::</span> <span class="dt">Int</span> <span class="ot">-></span> (<span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span>)</span></code></pre></div>
559<div class="sourceCode" id="cb82"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb82-1"><a href="#cb82-1"></a>add8 <span class="ot">=</span> add <span class="dv">8</span></span></code></pre></div>
560<div class="sourceCode" id="cb83"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb83-1"><a href="#cb83-1"></a>add8 <span class="dv">3</span></span>
561<span id="cb83-2"><a href="#cb83-2"></a><span class="co">-- 11</span></span></code></pre></div>
563<section class="slide level1">
565<h3 id="funny-fact">Funny fact</h3>
566<p><span class="fragment">Оператор (например <code>+</code>) – функция, название которой не содержит буквы и цифры.</span></p>
567<div class="sourceCode" id="cb84"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb84-1"><a href="#cb84-1"></a>x <span class="op">+&+</span> y <span class="ot">=</span> x <span class="op">+</span> y</span></code></pre></div>
568<div class="sourceCode" id="cb85"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb85-1"><a href="#cb85-1"></a><span class="dv">8</span> <span class="op">+&+</span> <span class="dv">9</span></span>
569<span id="cb85-2"><a href="#cb85-2"></a><span class="co">-- 17</span></span></code></pre></div>
571<section class="slide level1">
573<h3 id="funny-fact-2">Funny fact 2</h3>
574<p><span class="fragment">Оператор можно превратить в функцию, окружив его скобками.</span></p>
575<div class="sourceCode" id="cb86"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb86-1"><a href="#cb86-1"></a><span class="dv">8</span> <span class="op">+&+</span> <span class="dv">9</span></span>
576<span id="cb86-2"><a href="#cb86-2"></a><span class="co">-- 17</span></span></code></pre></div>
577<div class="sourceCode" id="cb87"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb87-1"><a href="#cb87-1"></a>(<span class="op">+&+</span>) <span class="dv">8</span> <span class="dv">9</span></span>
578<span id="cb87-2"><a href="#cb87-2"></a><span class="co">-- 17</span></span></code></pre></div>
579<div class="sourceCode" id="cb88"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb88-1"><a href="#cb88-1"></a><span class="ot">add ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span></span>
580<span id="cb88-2"><a href="#cb88-2"></a>add x y <span class="ot">=</span> x <span class="op">+</span> y</span></code></pre></div>
581<div class="sourceCode" id="cb89"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb89-1"><a href="#cb89-1"></a>add <span class="ot">=</span> (<span class="op">+&+</span>)</span></code></pre></div>
582<div class="sourceCode" id="cb90"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb90-1"><a href="#cb90-1"></a>add <span class="ot">=</span> (<span class="op">+</span>)</span></code></pre></div>
584<section class="slide level1">
586<h3 id="funny-fact-3">Funny fact 3</h3>
587<p><span class="fragment">Функцию можно превратить в оператор, окружив ее обратными кавычками.</span></p>
588<div class="sourceCode" id="cb91"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb91-1"><a href="#cb91-1"></a><span class="ot">add ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">Int</span></span>
589<span id="cb91-2"><a href="#cb91-2"></a>add x y <span class="ot">=</span> x <span class="op">+</span> y</span></code></pre></div>
590<div class="sourceCode" id="cb92"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb92-1"><a href="#cb92-1"></a>add <span class="dv">8</span> <span class="dv">9</span></span>
591<span id="cb92-2"><a href="#cb92-2"></a><span class="co">-- 17</span></span></code></pre></div>
592<div class="sourceCode" id="cb93"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb93-1"><a href="#cb93-1"></a><span class="dv">8</span> <span class="ot">`add`</span> <span class="dv">9</span></span>
593<span id="cb93-2"><a href="#cb93-2"></a><span class="co">-- 17</span></span></code></pre></div>
595<section id="список" class="slide level1">
598<section class="slide level1">
600<h3 id="односвязный-список">Односвязный список</h3>
601<div class="sourceCode" id="cb94"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb94-1"><a href="#cb94-1"></a><span class="kw">data</span> <span class="dt">IntList</span> <span class="ot">=</span> <span class="dt">Nil</span> <span class="op">|</span> <span class="dt">Cons</span> <span class="dt">Int</span> <span class="dt">IntList</span></span></code></pre></div>
602<div class="sourceCode" id="cb95"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb95-1"><a href="#cb95-1"></a><span class="dt">Cons</span><span class="ot"> ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">IntList</span> <span class="ot">-></span> <span class="dt">IntList</span></span>
603<span id="cb95-2"><a href="#cb95-2"></a><span class="dt">Nil</span><span class="ot"> ::</span> <span class="dt">IntList</span></span></code></pre></div>
604<div class="sourceCode" id="cb96"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb96-1"><a href="#cb96-1"></a><span class="ot">nums ::</span> <span class="dt">IntList</span></span>
605<span id="cb96-2"><a href="#cb96-2"></a>nums <span class="ot">=</span> <span class="dv">1</span> <span class="ot">`Cons`</span> (<span class="dv">2</span> <span class="ot">`Cons`</span> (<span class="dv">3</span> <span class="ot">`Cons`</span> <span class="dt">Nil</span>))</span></code></pre></div>
606<div class="sourceCode" id="cb97"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb97-1"><a href="#cb97-1"></a><span class="fu">sum</span><span class="ot"> ::</span> <span class="dt">IntList</span> <span class="ot">-></span> <span class="dt">Int</span></span></code></pre></div>
607<div class="sourceCode" id="cb98"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb98-1"><a href="#cb98-1"></a><span class="fu">sum</span> (<span class="dt">Cons</span> x xs) <span class="ot">=</span> x <span class="op">+</span> <span class="fu">sum</span> xs</span></code></pre></div>
608<div class="sourceCode" id="cb99"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb99-1"><a href="#cb99-1"></a><span class="fu">sum</span> <span class="dt">Nil</span> <span class="ot">=</span> <span class="dv">0</span></span>
609<span id="cb99-2"><a href="#cb99-2"></a><span class="fu">sum</span> (<span class="dt">Cons</span> x xs) <span class="ot">=</span> x <span class="op">+</span> <span class="fu">sum</span> xs</span></code></pre></div>
610<div class="sourceCode" id="cb100"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb100-1"><a href="#cb100-1"></a><span class="fu">sum</span> nums</span>
611<span id="cb100-2"><a href="#cb100-2"></a><span class="co">-- 6</span></span></code></pre></div>
613<section class="slide level1">
615<div class="sourceCode" id="cb101"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb101-1"><a href="#cb101-1"></a><span class="fu">take</span><span class="ot"> ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">IntList</span> <span class="ot">-></span> <span class="dt">IntList</span></span></code></pre></div>
616<div class="sourceCode" id="cb102"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb102-1"><a href="#cb102-1"></a><span class="fu">take</span> _ <span class="dt">Nil</span> <span class="ot">=</span> <span class="dt">Nil</span></span>
617<span id="cb102-2"><a href="#cb102-2"></a><span class="fu">take</span> <span class="dv">0</span> _ <span class="ot">=</span> <span class="dt">Nil</span></span>
618<span id="cb102-3"><a href="#cb102-3"></a><span class="fu">take</span> n (<span class="dt">Cons</span> x xs) <span class="ot">=</span> <span class="dt">Cons</span> x (<span class="fu">take</span> (n <span class="op">-</span> <span class="dv">1</span>) xs)</span></code></pre></div>
619<div class="sourceCode" id="cb103"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb103-1"><a href="#cb103-1"></a><span class="ot">nums ::</span> <span class="dt">IntList</span></span>
620<span id="cb103-2"><a href="#cb103-2"></a>nums <span class="ot">=</span> <span class="dv">1</span> <span class="ot">`Cons`</span> (<span class="dv">2</span> <span class="ot">`Cons`</span> (<span class="dv">3</span> <span class="ot">`Cons`</span> <span class="dt">Nil</span>))</span></code></pre></div>
621<div class="sourceCode" id="cb104"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb104-1"><a href="#cb104-1"></a><span class="fu">take</span> <span class="dv">2</span> nums</span>
622<span id="cb104-2"><a href="#cb104-2"></a><span class="co">-- Cons 1 (Cons 2 Nil)</span></span>
623<span id="cb104-3"><a href="#cb104-3"></a><span class="fu">take</span> <span class="dv">1029</span> nums</span>
624<span id="cb104-4"><a href="#cb104-4"></a><span class="co">-- Cons 1 (Cons 2 (Cons 3 Nil))</span></span>
625<span id="cb104-5"><a href="#cb104-5"></a><span class="fu">take</span> <span class="dv">0</span> nums</span>
626<span id="cb104-6"><a href="#cb104-6"></a><span class="co">-- Nil</span></span></code></pre></div>
628<section class="slide level1">
630<div class="sourceCode" id="cb105"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb105-1"><a href="#cb105-1"></a><span class="fu">repeat</span><span class="ot"> ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">IntList</span></span></code></pre></div>
631<div class="sourceCode" id="cb106"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb106-1"><a href="#cb106-1"></a><span class="fu">repeat</span> n <span class="ot">=</span> <span class="dt">Cons</span> n (<span class="fu">repeat</span> n)</span></code></pre></div>
632<div class="sourceCode" id="cb107"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb107-1"><a href="#cb107-1"></a><span class="fu">repeat</span> <span class="dv">8</span></span>
633<span id="cb107-2"><a href="#cb107-2"></a><span class="co">-- Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (...</span></span></code></pre></div>
634<div class="sourceCode" id="cb108"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb108-1"><a href="#cb108-1"></a>(<span class="fu">take</span> <span class="dv">3</span> <span class="op">.</span> <span class="fu">repeat</span>) <span class="dv">8</span></span>
635<span id="cb108-2"><a href="#cb108-2"></a><span class="co">-- Cons 8 (Cons 8 (Cons 8 Nil))</span></span></code></pre></div>
636<div class="sourceCode" id="cb109"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb109-1"><a href="#cb109-1"></a>(<span class="fu">sum</span> <span class="op">.</span> <span class="fu">take</span> <span class="dv">3</span> <span class="op">.</span> <span class="fu">repeat</span>) <span class="dv">8</span></span>
637<span id="cb109-2"><a href="#cb109-2"></a><span class="co">-- 24</span></span></code></pre></div>
639<section class="slide level1">
647В стандартной библиотеке
652<div class="sourceCode" id="cb110"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb110-1"><a href="#cb110-1"></a> <span class="dt">IntList</span></span></code></pre></div>
655<div class="sourceCode" id="cb111"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb111-1"><a href="#cb111-1"></a> [<span class="dt">Int</span>]</span></code></pre></div>
659<div class="sourceCode" id="cb112"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb112-1"><a href="#cb112-1"></a> <span class="dt">Nil</span></span></code></pre></div>
662<div class="sourceCode" id="cb113"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb113-1"><a href="#cb113-1"></a> []</span></code></pre></div>
667<div class="sourceCode" id="cb114"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb114-1"><a href="#cb114-1"></a> <span class="dt">Cons</span></span></code></pre></div>
670<div class="sourceCode" id="cb115"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb115-1"><a href="#cb115-1"></a> <span class="op">:</span></span></code></pre></div>
675<div class="sourceCode" id="cb116"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb116-1"><a href="#cb116-1"></a> <span class="dt">Cons</span> <span class="dv">3</span> (<span class="dt">Cons</span> <span class="dv">4</span> <span class="dt">Nil</span>)</span></code></pre></div>
678<div class="sourceCode" id="cb117"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb117-1"><a href="#cb117-1"></a> <span class="dv">3</span> <span class="op">:</span> <span class="dv">4</span> <span class="op">:</span> []</span></code></pre></div>
679<div class="sourceCode" id="cb118"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb118-1"><a href="#cb118-1"></a> [<span class="dv">3</span>, <span class="dv">4</span>]</span></code></pre></div>
684<section class="slide level1">
686<div class="sourceCode" id="cb119"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb119-1"><a href="#cb119-1"></a><span class="kw">data</span> <span class="dt">IntList</span> <span class="ot">=</span> <span class="dt">Nil</span> <span class="op">|</span> <span class="dt">Cons</span> <span class="dt">Int</span> <span class="dt">IntList</span></span></code></pre></div>
687<div class="sourceCode" id="cb120"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb120-1"><a href="#cb120-1"></a><span class="kw">data</span> [<span class="dt">Int</span>] <span class="ot">=</span> [] <span class="op">|</span> <span class="dt">Int</span> <span class="op">:</span> [<span class="dt">Int</span>]</span></code></pre></div>
689<section class="slide level1">
691<p><code>repeat</code>, <code>sum</code> и <code>take</code> тоже есть в стандартной библиотеке.</p>
693<section class="slide level1">
695<div class="sourceCode" id="cb121"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb121-1"><a href="#cb121-1"></a><span class="fu">repeat</span> <span class="dv">8</span></span>
696<span id="cb121-2"><a href="#cb121-2"></a><span class="co">-- [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, ...</span></span></code></pre></div>
697<div class="sourceCode" id="cb122"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb122-1"><a href="#cb122-1"></a>[<span class="dv">8</span> <span class="op">..</span>]</span>
698<span id="cb122-2"><a href="#cb122-2"></a><span class="co">-- [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...</span></span></code></pre></div>
699<div class="sourceCode" id="cb123"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb123-1"><a href="#cb123-1"></a>[<span class="dv">8</span> <span class="op">..</span> <span class="dv">11</span>]</span>
700<span id="cb123-2"><a href="#cb123-2"></a><span class="co">-- [8, 9, 10, 11]</span></span></code></pre></div>
701<div class="sourceCode" id="cb124"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb124-1"><a href="#cb124-1"></a>[<span class="dv">8</span> <span class="op">..</span> <span class="dv">8</span>]</span>
702<span id="cb124-2"><a href="#cb124-2"></a><span class="co">-- [8]</span></span></code></pre></div>
703<div class="sourceCode" id="cb125"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb125-1"><a href="#cb125-1"></a>[<span class="dv">8</span> <span class="op">..</span> <span class="dv">5</span>]</span>
704<span id="cb125-2"><a href="#cb125-2"></a><span class="co">-- []</span></span></code></pre></div>
706<section id="quicksort" class="slide level1">
709<section class="slide level1">
711<div class="sourceCode" id="cb126"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb126-1"><a href="#cb126-1"></a><span class="ot">quicksort ::</span> [<span class="dt">Int</span>] <span class="ot">-></span> [<span class="dt">Int</span>]</span></code></pre></div>
712<div class="sourceCode" id="cb127"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb127-1"><a href="#cb127-1"></a>quicksort (x<span class="op">:</span>xs) <span class="ot">=</span></span>
713<span id="cb127-2"><a href="#cb127-2"></a> quicksort smaller <span class="op">++</span> [x] <span class="op">++</span> quicksort larger</span>
714<span id="cb127-3"><a href="#cb127-3"></a> <span class="kw">where</span></span>
715<span id="cb127-4"><a href="#cb127-4"></a> smaller <span class="ot">=</span> <span class="fu">filter</span> (<span class="op"><</span> x) xs</span>
716<span id="cb127-5"><a href="#cb127-5"></a> larger <span class="ot">=</span> <span class="fu">filter</span> (<span class="op">>=</span> x) xs</span></code></pre></div>
718<section class="slide level1">
720<div class="sourceCode" id="cb128"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb128-1"><a href="#cb128-1"></a><span class="fu">filter</span><span class="ot"> ::</span> (<span class="dt">Bool</span> <span class="ot">-></span> <span class="dt">Int</span>) <span class="ot">-></span> [<span class="dt">Int</span>] <span class="ot">-></span> [<span class="dt">Int</span>]</span></code></pre></div>
721<div class="sourceCode" id="cb129"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb129-1"><a href="#cb129-1"></a><span class="fu">filter</span> f (x<span class="op">:</span>xs) <span class="ot">=</span></span>
722<span id="cb129-2"><a href="#cb129-2"></a> <span class="kw">if</span> f x</span>
723<span id="cb129-3"><a href="#cb129-3"></a> <span class="kw">then</span> x<span class="op">:</span>(<span class="fu">filter</span> f xs)</span>
724<span id="cb129-4"><a href="#cb129-4"></a> <span class="kw">else</span> <span class="fu">filter</span> f xs</span></code></pre></div>
725<div class="sourceCode" id="cb130"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb130-1"><a href="#cb130-1"></a><span class="fu">filter</span> _ [] <span class="ot">=</span> []</span>
726<span id="cb130-2"><a href="#cb130-2"></a><span class="fu">filter</span> f (x<span class="op">:</span>xs) <span class="ot">=</span></span>
727<span id="cb130-3"><a href="#cb130-3"></a> <span class="kw">if</span> f x</span>
728<span id="cb130-4"><a href="#cb130-4"></a> <span class="kw">then</span> <span class="fu">filter</span> f xs</span>
729<span id="cb130-5"><a href="#cb130-5"></a> <span class="kw">else</span> x<span class="op">:</span>(<span class="fu">filter</span> f xs)</span></code></pre></div>
731<section class="slide level1">
733<div class="sourceCode" id="cb131"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb131-1"><a href="#cb131-1"></a><span class="ot">quicksort ::</span> [<span class="dt">Int</span>] <span class="ot">-></span> [<span class="dt">Int</span>]</span>
734<span id="cb131-2"><a href="#cb131-2"></a>quicksort (x<span class="op">:</span>xs) <span class="ot">=</span></span>
735<span id="cb131-3"><a href="#cb131-3"></a> quicksort smaller <span class="op">++</span> [x] <span class="op">++</span> quicksort larger</span>
736<span id="cb131-4"><a href="#cb131-4"></a> <span class="kw">where</span></span>
737<span id="cb131-5"><a href="#cb131-5"></a> smaller <span class="ot">=</span> <span class="fu">filter</span> (<span class="op"><</span> x) xs</span>
738<span id="cb131-6"><a href="#cb131-6"></a> larger <span class="ot">=</span> <span class="fu">filter</span> (<span class="op">>=</span> x) xs</span>
739<span id="cb131-7"><a href="#cb131-7"></a> <span class="fu">filter</span> _ [] <span class="ot">=</span> []</span>
740<span id="cb131-8"><a href="#cb131-8"></a> <span class="fu">filter</span> f (x<span class="op">:</span>xs) <span class="ot">=</span></span>
741<span id="cb131-9"><a href="#cb131-9"></a> <span class="kw">if</span> f x</span>
742<span id="cb131-10"><a href="#cb131-10"></a> <span class="kw">then</span> <span class="fu">filter</span> f xs</span>
743<span id="cb131-11"><a href="#cb131-11"></a> <span class="kw">else</span> x<span class="op">:</span>(<span class="fu">filter</span> f xs)</span></code></pre></div>
745<section class="slide level1">
747<div class="sourceCode" id="cb132"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb132-1"><a href="#cb132-1"></a><span class="ot">quicksort ::</span> [<span class="dt">Int</span>] <span class="ot">-></span> [<span class="dt">Int</span>]</span>
748<span id="cb132-2"><a href="#cb132-2"></a>quicksort [] <span class="ot">=</span> []</span>
749<span id="cb132-3"><a href="#cb132-3"></a>quicksort (x<span class="op">:</span>xs) <span class="ot">=</span></span>
750<span id="cb132-4"><a href="#cb132-4"></a> quicksort smaller <span class="op">++</span> [x] <span class="op">++</span> quicksort larger</span>
751<span id="cb132-5"><a href="#cb132-5"></a> <span class="kw">where</span></span>
752<span id="cb132-6"><a href="#cb132-6"></a> smaller <span class="ot">=</span> <span class="fu">filter</span> (<span class="op"><</span> x) xs</span>
753<span id="cb132-7"><a href="#cb132-7"></a> larger <span class="ot">=</span> <span class="fu">filter</span> (<span class="op">>=</span> x) xs</span>
754<span id="cb132-8"><a href="#cb132-8"></a> <span class="fu">filter</span> _ [] <span class="ot">=</span> []</span>
755<span id="cb132-9"><a href="#cb132-9"></a> <span class="fu">filter</span> f (x<span class="op">:</span>xs) <span class="ot">=</span></span>
756<span id="cb132-10"><a href="#cb132-10"></a> <span class="kw">if</span> f x</span>
757<span id="cb132-11"><a href="#cb132-11"></a> <span class="kw">then</span> <span class="fu">filter</span> f xs</span>
758<span id="cb132-12"><a href="#cb132-12"></a> <span class="kw">else</span> x<span class="op">:</span>(<span class="fu">filter</span> f xs)</span></code></pre></div>
759<div class="sourceCode" id="cb133"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb133-1"><a href="#cb133-1"></a>quicksort [<span class="dv">2</span>, <span class="dv">1</span>, <span class="dv">3</span>, <span class="dv">4</span>]</span>
760<span id="cb133-2"><a href="#cb133-2"></a><span class="co">-- [1, 2, 3, 4]</span></span></code></pre></div>
762<section class="slide level1">
764<p><code>filter</code> тоже есть в стандартной библиотеке.</p>
766<section id="еще-немного-структур" class="slide level1">
767<h1>Еще немного структур</h1>
769<section class="slide level1">
771<h2 id="параметрический-полиморфизм">Параметрический полиморфизм</h2>
772<h3 id="дженерики">(Дженерики)</h3>
773<div class="sourceCode" id="cb134"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb134-1"><a href="#cb134-1"></a><span class="kw">data</span> <span class="dt">IntList</span> <span class="ot">=</span> <span class="dt">Cons</span> <span class="dt">Int</span> <span class="dt">IntList</span> <span class="op">|</span> <span class="dt">Nil</span></span></code></pre></div>
775<p>Мы научиоись делать список интов. А что если мы хотим сделать просто список. Чего-нибудь.</p>
777<div class="sourceCode" id="cb135"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb135-1"><a href="#cb135-1"></a><span class="kw">data</span> <span class="dt">List</span> a <span class="ot">=</span> <span class="dt">Cons</span> a (<span class="dt">List</span> a) <span class="op">|</span> <span class="dt">Nil</span></span></code></pre></div>
778<div class="sourceCode" id="cb136"><pre class="sourceCode java fragment"><code class="sourceCode java"><span id="cb136-1"><a href="#cb136-1"></a><span class="kw">class</span> <span class="bu">List</span><T> { ...</span></code></pre></div>
779<div class="sourceCode" id="cb137"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb137-1"><a href="#cb137-1"></a><span class="ot">ints ::</span> <span class="dt">List</span> <span class="dt">Int</span></span>
780<span id="cb137-2"><a href="#cb137-2"></a>ints <span class="ot">=</span> <span class="dt">Cons</span> <span class="dv">1</span> (<span class="dt">Cons</span> <span class="dv">2</span> (<span class="dt">Cons</span> <span class="dv">3</span> <span class="dt">Nil</span>))</span></code></pre></div>
781<div class="sourceCode" id="cb138"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb138-1"><a href="#cb138-1"></a><span class="co">-- Типы как всегда можно не писать</span></span>
782<span id="cb138-2"><a href="#cb138-2"></a><span class="ot">strings ::</span> <span class="dt">List</span> <span class="dt">String</span></span>
783<span id="cb138-3"><a href="#cb138-3"></a>strings <span class="ot">=</span> <span class="dt">Cons</span> <span class="st">"one"</span> (<span class="dt">Cons</span> <span class="st">"two"</span> (<span class="dt">Cons</span> <span class="st">"three"</span> <span class="dt">Nil</span>))</span></code></pre></div>
785<section class="slide level1">
787<div class="sourceCode" id="cb139"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb139-1"><a href="#cb139-1"></a>things <span class="ot">=</span> <span class="dt">Cons</span> <span class="st">"one"</span> (<span class="dt">Cons</span> <span class="dv">2</span> <span class="dt">Nil</span>)</span></code></pre></div>
788<pre class="fragment"><code> • Couldn't match type ‘Int’ with ‘String’
789 Expected type: List String
790 Actual type: List Int
79210 | things = Cons "one" (Cons 2 Nil)
793 | ^^^^^^^^^^^^</code></pre>
794<div class="sourceCode" id="cb141"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb141-1"><a href="#cb141-1"></a><span class="kw">data</span> <span class="dt">List</span> a <span class="ot">=</span> <span class="dt">Cons</span> a (<span class="dt">List</span> a) <span class="op">|</span> <span class="dt">Nil</span></span></code></pre></div>
795<p><span class="fragment"><code>a</code> должен всегда быть <code>a</code>.</span></p>
797<section class="slide level1">
799<div class="sourceCode" id="cb142"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb142-1"><a href="#cb142-1"></a><span class="fu">take</span><span class="ot"> ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">IntList</span> <span class="ot">-></span> <span class="dt">IntList</span></span>
800<span id="cb142-2"><a href="#cb142-2"></a><span class="fu">take</span> _ <span class="dt">Nil</span> <span class="ot">=</span> <span class="dt">Nil</span></span>
801<span id="cb142-3"><a href="#cb142-3"></a><span class="fu">take</span> <span class="dv">0</span> _ <span class="ot">=</span> <span class="dt">Nil</span></span>
802<span id="cb142-4"><a href="#cb142-4"></a><span class="fu">take</span> n (<span class="dt">Cons</span> x xs) <span class="ot">=</span> <span class="dt">Cons</span> x (<span class="fu">take</span> (n <span class="op">-</span> <span class="dv">1</span>) xs)</span></code></pre></div>
803<div class="sourceCode" id="cb143"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb143-1"><a href="#cb143-1"></a><span class="fu">take</span><span class="ot"> ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">List</span> a <span class="ot">-></span> <span class="dt">List</span> a</span>
804<span id="cb143-2"><a href="#cb143-2"></a><span class="fu">take</span> _ <span class="dt">Nil</span> <span class="ot">=</span> <span class="dt">Nil</span></span>
805<span id="cb143-3"><a href="#cb143-3"></a><span class="fu">take</span> <span class="dv">0</span> _ <span class="ot">=</span> <span class="dt">Nil</span></span>
806<span id="cb143-4"><a href="#cb143-4"></a><span class="fu">take</span> n (<span class="dt">Cons</span> x xs) <span class="ot">=</span> <span class="dt">Cons</span> x (<span class="fu">take</span> (n <span class="op">-</span> <span class="dv">1</span>) xs)</span></code></pre></div>
808<p>Поменялся только тип!</p>
811<section id="где-и-как-смотреть-стандартную-библиотеку" class="slide level1">
812<h1>Где и как смотреть “стандартную библиотеку”</h1>
814<section class="slide level1">
817<li class="fragment"><p><a href="https://hackage.haskell.org/package/base">Hackage</a></p>
818<p>(Там вам нужен только пакет <code>base</code>. Ссылка ведет прямо на него.) Еще если там нажать <code>s</code>, то будет поиск.</p></li>
819<li class="fragment"><p><a href="https://hoogle.haskell.org">Hoogle</a></p>
820<p>Это поиск по типам. Например: <code>Int -> [Int] -> [Int]</code> (Тут вам опять же нужен только пакет <code>base</code>. Нужно чтобы справа было "package:base".)</p></li>
826 <script src="reveal.js/js/reveal.js"></script>
830 // Full list of configuration options available at:
831 // https://github.com/hakimel/reveal.js#configuration
833 // Push each slide change to the browser history
836 // Optional reveal.js plugins
838 { src: 'reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } },
839 { src: 'reveal.js/plugin/zoom-js/zoom.js', async: true },
840 { src: 'reveal.js/plugin/notes/notes.js', async: true }
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list