git.iko.soy/ikoHSE/sc-lectures
on master help sign in
Moved to using pandoc
commit3edbf6450437a159113ad6f3b9296b2a1b65e0db authoriko <ilyakooo0@gmail.com> dateSun 2 Feb 2020, 17:15 (7 years ago) parent8be33fa
181 files changed+3369−1163
.html+654 1.html+684−868 1.md+974 1_old.html+887 build.sh+7 bower.json → reveal.js/bower.json css/print/paper.css → reveal.js/css/print/paper.css css/print/pdf.css → reveal.js/css/print/pdf.css css/reset.css → reveal.js/css/reset.css css/reveal.css → reveal.js/css/reveal.css+131−286 reveal.js/css/reveal.min.css+7 css/reveal.scss → reveal.js/css/reveal.scss css/theme/README.md → reveal.js/css/theme/README.md css/theme/beige.css → reveal.js/css/theme/beige.css css/theme/black copy.css → reveal.js/css/theme/black copy.css css/theme/black.css → reveal.js/css/theme/black.css css/theme/blood.css → reveal.js/css/theme/blood.css css/theme/league.css → reveal.js/css/theme/league.css css/theme/moon.css → reveal.js/css/theme/moon.css css/theme/night.css → reveal.js/css/theme/night.css css/theme/serif.css → reveal.js/css/theme/serif.css css/theme/simple.css → reveal.js/css/theme/simple.css css/theme/sky.css → reveal.js/css/theme/sky.css css/theme/solarized.css → reveal.js/css/theme/solarized.css css/theme/source/beige.scss → reveal.js/css/theme/source/beige.scss css/theme/source/black.scss → reveal.js/css/theme/source/black.scss css/theme/source/blood.scss → reveal.js/css/theme/source/blood.scss css/theme/source/league.scss → reveal.js/css/theme/source/league.scss css/theme/source/moon.scss → reveal.js/css/theme/source/moon.scss css/theme/source/night.scss → reveal.js/css/theme/source/night.scss css/theme/source/serif.scss → reveal.js/css/theme/source/serif.scss css/theme/source/simple.scss → reveal.js/css/theme/source/simple.scss css/theme/source/sky.scss → reveal.js/css/theme/source/sky.scss css/theme/source/solarized.scss → reveal.js/css/theme/source/solarized.scss css/theme/source/superblack.scss → reveal.js/css/theme/source/superblack.scss+4−4 css/theme/source/white.scss → reveal.js/css/theme/source/white.scss css/theme/superblack.css → reveal.js/css/theme/superblack.css+9−4 css/theme/template/mixins.scss → reveal.js/css/theme/template/mixins.scss css/theme/template/settings.scss → reveal.js/css/theme/template/settings.scss css/theme/template/theme.scss → reveal.js/css/theme/template/theme.scss css/theme/white.css → reveal.js/css/theme/white.css gruntfile.js → reveal.js/gruntfile.js js/reveal.js → reveal.js/js/reveal.js js/reveal.min.js → reveal.js/js/reveal.min.js+1−1 lib/css/monokai.css → reveal.js/lib/css/monokai.css lib/css/zenburn.css → reveal.js/lib/css/zenburn.css lib/font/hasklig/Hasklig-Black.eot → reveal.js/lib/font/hasklig/Hasklig-Black.eot lib/font/hasklig/Hasklig-Black.otf → reveal.js/lib/font/hasklig/Hasklig-Black.otf lib/font/hasklig/Hasklig-Black.ttf → reveal.js/lib/font/hasklig/Hasklig-Black.ttf lib/font/hasklig/Hasklig-Black.woff → reveal.js/lib/font/hasklig/Hasklig-Black.woff lib/font/hasklig/Hasklig-BlackIt.eot → reveal.js/lib/font/hasklig/Hasklig-BlackIt.eot lib/font/hasklig/Hasklig-BlackIt.otf → reveal.js/lib/font/hasklig/Hasklig-BlackIt.otf lib/font/hasklig/Hasklig-BlackIt.ttf → reveal.js/lib/font/hasklig/Hasklig-BlackIt.ttf lib/font/hasklig/Hasklig-BlackIt.woff → reveal.js/lib/font/hasklig/Hasklig-BlackIt.woff lib/font/hasklig/Hasklig-Bold.eot → reveal.js/lib/font/hasklig/Hasklig-Bold.eot lib/font/hasklig/Hasklig-Bold.otf → reveal.js/lib/font/hasklig/Hasklig-Bold.otf lib/font/hasklig/Hasklig-Bold.ttf → reveal.js/lib/font/hasklig/Hasklig-Bold.ttf lib/font/hasklig/Hasklig-Bold.woff → reveal.js/lib/font/hasklig/Hasklig-Bold.woff lib/font/hasklig/Hasklig-BoldIt.eot → reveal.js/lib/font/hasklig/Hasklig-BoldIt.eot lib/font/hasklig/Hasklig-BoldIt.otf → reveal.js/lib/font/hasklig/Hasklig-BoldIt.otf lib/font/hasklig/Hasklig-BoldIt.ttf → reveal.js/lib/font/hasklig/Hasklig-BoldIt.ttf lib/font/hasklig/Hasklig-BoldIt.woff → reveal.js/lib/font/hasklig/Hasklig-BoldIt.woff lib/font/hasklig/Hasklig-ExtraLight.eot → reveal.js/lib/font/hasklig/Hasklig-ExtraLight.eot lib/font/hasklig/Hasklig-ExtraLight.otf → reveal.js/lib/font/hasklig/Hasklig-ExtraLight.otf lib/font/hasklig/Hasklig-ExtraLight.ttf → reveal.js/lib/font/hasklig/Hasklig-ExtraLight.ttf lib/font/hasklig/Hasklig-ExtraLight.woff → reveal.js/lib/font/hasklig/Hasklig-ExtraLight.woff lib/font/hasklig/Hasklig-ExtraLightIt.eot → reveal.js/lib/font/hasklig/Hasklig-ExtraLightIt.eot lib/font/hasklig/Hasklig-ExtraLightIt.otf → reveal.js/lib/font/hasklig/Hasklig-ExtraLightIt.otf lib/font/hasklig/Hasklig-ExtraLightIt.ttf → reveal.js/lib/font/hasklig/Hasklig-ExtraLightIt.ttf lib/font/hasklig/Hasklig-ExtraLightIt.woff → reveal.js/lib/font/hasklig/Hasklig-ExtraLightIt.woff lib/font/hasklig/Hasklig-It.eot → reveal.js/lib/font/hasklig/Hasklig-It.eot lib/font/hasklig/Hasklig-It.otf → reveal.js/lib/font/hasklig/Hasklig-It.otf lib/font/hasklig/Hasklig-It.ttf → reveal.js/lib/font/hasklig/Hasklig-It.ttf lib/font/hasklig/Hasklig-It.woff → reveal.js/lib/font/hasklig/Hasklig-It.woff lib/font/hasklig/Hasklig-Light.eot → reveal.js/lib/font/hasklig/Hasklig-Light.eot lib/font/hasklig/Hasklig-Light.otf → reveal.js/lib/font/hasklig/Hasklig-Light.otf lib/font/hasklig/Hasklig-Light.ttf → reveal.js/lib/font/hasklig/Hasklig-Light.ttf lib/font/hasklig/Hasklig-Light.woff → reveal.js/lib/font/hasklig/Hasklig-Light.woff lib/font/hasklig/Hasklig-LightIt.eot → reveal.js/lib/font/hasklig/Hasklig-LightIt.eot lib/font/hasklig/Hasklig-LightIt.otf → reveal.js/lib/font/hasklig/Hasklig-LightIt.otf lib/font/hasklig/Hasklig-LightIt.ttf → reveal.js/lib/font/hasklig/Hasklig-LightIt.ttf lib/font/hasklig/Hasklig-LightIt.woff → reveal.js/lib/font/hasklig/Hasklig-LightIt.woff lib/font/hasklig/Hasklig-Medium.eot → reveal.js/lib/font/hasklig/Hasklig-Medium.eot lib/font/hasklig/Hasklig-Medium.otf → reveal.js/lib/font/hasklig/Hasklig-Medium.otf lib/font/hasklig/Hasklig-Medium.ttf → reveal.js/lib/font/hasklig/Hasklig-Medium.ttf lib/font/hasklig/Hasklig-Medium.woff → reveal.js/lib/font/hasklig/Hasklig-Medium.woff lib/font/hasklig/Hasklig-MediumIt.eot → reveal.js/lib/font/hasklig/Hasklig-MediumIt.eot lib/font/hasklig/Hasklig-MediumIt.otf → reveal.js/lib/font/hasklig/Hasklig-MediumIt.otf lib/font/hasklig/Hasklig-MediumIt.ttf → reveal.js/lib/font/hasklig/Hasklig-MediumIt.ttf lib/font/hasklig/Hasklig-MediumIt.woff → reveal.js/lib/font/hasklig/Hasklig-MediumIt.woff lib/font/hasklig/Hasklig-Regular.eot → reveal.js/lib/font/hasklig/Hasklig-Regular.eot lib/font/hasklig/Hasklig-Regular.otf → reveal.js/lib/font/hasklig/Hasklig-Regular.otf lib/font/hasklig/Hasklig-Regular.ttf → reveal.js/lib/font/hasklig/Hasklig-Regular.ttf lib/font/hasklig/Hasklig-Regular.woff → reveal.js/lib/font/hasklig/Hasklig-Regular.woff lib/font/hasklig/Hasklig-Semibold.eot → reveal.js/lib/font/hasklig/Hasklig-Semibold.eot lib/font/hasklig/Hasklig-Semibold.otf → reveal.js/lib/font/hasklig/Hasklig-Semibold.otf lib/font/hasklig/Hasklig-Semibold.ttf → reveal.js/lib/font/hasklig/Hasklig-Semibold.ttf lib/font/hasklig/Hasklig-Semibold.woff → reveal.js/lib/font/hasklig/Hasklig-Semibold.woff lib/font/hasklig/Hasklig-SemiboldIt.eot → reveal.js/lib/font/hasklig/Hasklig-SemiboldIt.eot lib/font/hasklig/Hasklig-SemiboldIt.otf → reveal.js/lib/font/hasklig/Hasklig-SemiboldIt.otf lib/font/hasklig/Hasklig-SemiboldIt.ttf → reveal.js/lib/font/hasklig/Hasklig-SemiboldIt.ttf lib/font/hasklig/Hasklig-SemiboldIt.woff → reveal.js/lib/font/hasklig/Hasklig-SemiboldIt.woff lib/font/hasklig/hasklig.css → reveal.js/lib/font/hasklig/hasklig.css lib/font/league-gothic/LICENSE → reveal.js/lib/font/league-gothic/LICENSE lib/font/league-gothic/league-gothic.css → reveal.js/lib/font/league-gothic/league-gothic.css lib/font/league-gothic/league-gothic.eot → reveal.js/lib/font/league-gothic/league-gothic.eot lib/font/league-gothic/league-gothic.ttf → reveal.js/lib/font/league-gothic/league-gothic.ttf lib/font/league-gothic/league-gothic.woff → reveal.js/lib/font/league-gothic/league-gothic.woff lib/font/source-sans-pro/LICENSE → reveal.js/lib/font/source-sans-pro/LICENSE lib/font/source-sans-pro/SourceSansPro-Black.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-Black.eot lib/font/source-sans-pro/SourceSansPro-Black.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-Black.ttf lib/font/source-sans-pro/SourceSansPro-Black.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-Black.woff lib/font/source-sans-pro/SourceSansPro-BlackItalic.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-BlackItalic.eot lib/font/source-sans-pro/SourceSansPro-BlackItalic.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-BlackItalic.ttf lib/font/source-sans-pro/SourceSansPro-BlackItalic.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-BlackItalic.woff lib/font/source-sans-pro/SourceSansPro-Bold.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-Bold.eot lib/font/source-sans-pro/SourceSansPro-Bold.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-Bold.ttf lib/font/source-sans-pro/SourceSansPro-Bold.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-Bold.woff lib/font/source-sans-pro/SourceSansPro-BoldItalic.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-BoldItalic.eot lib/font/source-sans-pro/SourceSansPro-BoldItalic.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-BoldItalic.ttf lib/font/source-sans-pro/SourceSansPro-BoldItalic.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-BoldItalic.woff lib/font/source-sans-pro/SourceSansPro-ExtraLight.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-ExtraLight.eot lib/font/source-sans-pro/SourceSansPro-ExtraLight.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-ExtraLight.ttf lib/font/source-sans-pro/SourceSansPro-ExtraLight.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-ExtraLight.woff lib/font/source-sans-pro/SourceSansPro-ExtraLightItalic.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-ExtraLightItalic.eot lib/font/source-sans-pro/SourceSansPro-ExtraLightItalic.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-ExtraLightItalic.ttf lib/font/source-sans-pro/SourceSansPro-ExtraLightItalic.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-ExtraLightItalic.woff lib/font/source-sans-pro/SourceSansPro-Italic.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-Italic.eot lib/font/source-sans-pro/SourceSansPro-Italic.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-Italic.ttf lib/font/source-sans-pro/SourceSansPro-Italic.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-Italic.woff lib/font/source-sans-pro/SourceSansPro-Light.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-Light.eot lib/font/source-sans-pro/SourceSansPro-Light.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-Light.ttf lib/font/source-sans-pro/SourceSansPro-Light.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-Light.woff lib/font/source-sans-pro/SourceSansPro-LightItalic.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-LightItalic.eot lib/font/source-sans-pro/SourceSansPro-LightItalic.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-LightItalic.ttf lib/font/source-sans-pro/SourceSansPro-LightItalic.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-LightItalic.woff lib/font/source-sans-pro/SourceSansPro-Regular.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-Regular.eot lib/font/source-sans-pro/SourceSansPro-Regular.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-Regular.ttf lib/font/source-sans-pro/SourceSansPro-Regular.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-Regular.woff lib/font/source-sans-pro/SourceSansPro-SemiBold.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-SemiBold.eot lib/font/source-sans-pro/SourceSansPro-SemiBold.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-SemiBold.ttf lib/font/source-sans-pro/SourceSansPro-SemiBold.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-SemiBold.woff lib/font/source-sans-pro/SourceSansPro-SemiBoldItalic.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-SemiBoldItalic.eot lib/font/source-sans-pro/SourceSansPro-SemiBoldItalic.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-SemiBoldItalic.ttf lib/font/source-sans-pro/SourceSansPro-SemiBoldItalic.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-SemiBoldItalic.woff lib/font/source-sans-pro/source-sans-pro-italic.eot → reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.eot lib/font/source-sans-pro/source-sans-pro-italic.ttf → reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.ttf lib/font/source-sans-pro/source-sans-pro-italic.woff → reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.woff lib/font/source-sans-pro/source-sans-pro-regular.eot → reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.eot lib/font/source-sans-pro/source-sans-pro-regular.ttf → reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.ttf lib/font/source-sans-pro/source-sans-pro-regular.woff → reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.woff lib/font/source-sans-pro/source-sans-pro-semibold.eot → reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.eot lib/font/source-sans-pro/source-sans-pro-semibold.ttf → reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.ttf lib/font/source-sans-pro/source-sans-pro-semibold.woff → reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.woff lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot → reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf → reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff → reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff lib/font/source-sans-pro/source-sans-pro.css → reveal.js/lib/font/source-sans-pro/source-sans-pro.css lib/js/html5shiv.js → reveal.js/lib/js/html5shiv.js lib/js/promise.js → reveal.js/lib/js/promise.js package-lock.json → reveal.js/package-lock.json package.json → reveal.js/package.json plugin/highlight/highlight.js → reveal.js/plugin/highlight/highlight.js plugin/markdown/example.html → reveal.js/plugin/markdown/example.html plugin/markdown/example.md → reveal.js/plugin/markdown/example.md plugin/markdown/markdown.js → reveal.js/plugin/markdown/markdown.js plugin/markdown/marked.js → reveal.js/plugin/markdown/marked.js plugin/math/math.js → reveal.js/plugin/math/math.js plugin/multiplex/client.js → reveal.js/plugin/multiplex/client.js plugin/multiplex/index.js → reveal.js/plugin/multiplex/index.js plugin/multiplex/master.js → reveal.js/plugin/multiplex/master.js plugin/multiplex/package.json → reveal.js/plugin/multiplex/package.json plugin/notes-server/client.js → reveal.js/plugin/notes-server/client.js plugin/notes-server/index.js → reveal.js/plugin/notes-server/index.js plugin/notes-server/notes.html → reveal.js/plugin/notes-server/notes.html plugin/notes/notes.html → reveal.js/plugin/notes/notes.html plugin/notes/notes.js → reveal.js/plugin/notes/notes.js plugin/print-pdf/print-pdf.js → reveal.js/plugin/print-pdf/print-pdf.js plugin/search/search.js → reveal.js/plugin/search/search.js plugin/zoom-js/zoom.js → reveal.js/plugin/zoom-js/zoom.js style.html+11
.htmlnew file+654
@@ -0,0 +1,654 @@
1+<!DOCTYPE html>
2+<html>
3+<head>
4+ <meta charset="utf-8">
5+ <meta name="generator" content="pandoc">
6+ <meta name="author" content="Ilya Kostyuchenko">
7+ <title>1</title>
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">
13+ <style>
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; }
26+ @media screen {
27+ div.sourceCode { overflow: auto; }
28+ }
29+ @media print {
30+ pre > code.sourceCode { white-space: pre-wrap; }
31+ pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
32+ }
33+ pre.numberSource code
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;
46+ color: #7a7c7d;
47+ }
48+ pre.numberSource { margin-left: 3em; border-left: 1px solid #7a7c7d; padding-left: 4px; }
49+ div.sourceCode
50+ { color: #cfcfc2; background-color: #232629; }
51+ @media screen {
52+ pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
53+ }
54+ code span. { color: #cfcfc2; } /* Normal */
55+ code span.al { color: #95da4c; background-color: #4d1f24; font-weight: bold; } /* Alert */
56+ code span.an { color: #3f8058; } /* Annotation */
57+ code span.at { color: #2980b9; } /* Attribute */
58+ code span.bn { color: #f67400; } /* BaseN */
59+ code span.bu { color: #7f8c8d; } /* BuiltIn */
60+ code span.cf { color: #fdbc4b; font-weight: bold; } /* ControlFlow */
61+ code span.ch { color: #3daee9; } /* Char */
62+ code span.cn { color: #27aeae; font-weight: bold; } /* Constant */
63+ code span.co { color: #7a7c7d; } /* Comment */
64+ code span.cv { color: #7f8c8d; } /* CommentVar */
65+ code span.do { color: #a43340; } /* Documentation */
66+ code span.dt { color: #2980b9; } /* DataType */
67+ code span.dv { color: #f67400; } /* DecVal */
68+ code span.er { color: #da4453; text-decoration: underline; } /* Error */
69+ code span.ex { color: #0099ff; font-weight: bold; } /* Extension */
70+ code span.fl { color: #f67400; } /* Float */
71+ code span.fu { color: #8e44ad; } /* Function */
72+ code span.im { color: #27ae60; } /* Import */
73+ code span.in { color: #c45b00; } /* Information */
74+ code span.kw { color: #cfcfc2; font-weight: bold; } /* Keyword */
75+ code span.op { color: #cfcfc2; } /* Operator */
76+ code span.ot { color: #27ae60; } /* Other */
77+ code span.pp { color: #27ae60; } /* Preprocessor */
78+ code span.re { color: #2980b9; background-color: #153042; } /* RegionMarker */
79+ code span.sc { color: #3daee9; } /* SpecialChar */
80+ code span.ss { color: #da4453; } /* SpecialString */
81+ code span.st { color: #f44f4f; } /* String */
82+ code span.va { color: #27aeae; } /* Variable */
83+ code span.vs { color: #da4453; } /* VerbatimString */
84+ code span.wa { color: #da4453; } /* Warning */
85+ </style>
86+ <link rel="stylesheet" href="reveal.js/css/theme/superblack.css" id="theme">
87+ <!-- Printing and PDF exports -->
88+ <script>
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 );
94+ </script>
95+ <!--[if lt IE 9]>
96+ <script src="reveal.js/lib/js/html5shiv.js"></script>
97+ <![endif]-->
98+ <style>
99+ div.sourceCode {
100+ background-color: transparent;
101+ overflow: auto;
102+ margin: 0em;
103+ }
104+ </style>
105+</head>
106+<body>
107+ <div class="reveal">
108+ <div class="slides">
109+
110+
111+<section id="функциональное-программирование" class="slide level1">
112+<h1>Функциональное программирование</h1>
113+<aside class="notes">
114+<p>Функциональное программирование это не про использование map filter reduce. Функциональное программирование это вообще ортогонально к ооп. ИМХО проблема с ООП – наследование (которое тоже ортогонально к ООП) – нет разграничения между абстракцией и реализацией. и вообще обзывание это функциональным программированием – не совсем правильно. то, что мы сейчас будем пытаться сделать – сделать код более переиспользуемым. сделать наши данные максимально тупыми =&gt; переиспользуемыми. пытаться комбинировать слишком умные куски – не получится – слишком сложно. мы хотим сделать простые куски, которые просто комбинировать и еще чтобы компилятор проверял эти наши комбинации на валидность.</p>
115+</aside>
116+</section>
117+<section class="slide level1">
118+
119+<p>Функциональное программирование:</p>
120+<blockquote>
121+<p>функции – это тоже данные.</p>
122+</blockquote>
123+<p><code>Int -&gt; Bool</code> (функция) – ровно такие же данные как и <code>Int</code>. Их также можно складывать в структуры, передавать как аргументы и т. п.</p>
124+</section>
125+<section id="нотация" class="slide level1">
126+<h1>нотация</h1>
127+</section>
128+<section class="slide level1">
129+
130+<table width="100%">
131+<tr>
132+<td>
133+<div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb1-1"><a href="#cb1-1"></a> <span class="dt">int</span> x;</span></code></pre></div>
134+</td>
135+<td>
136+<div class="sourceCode" id="cb2"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb2-1"><a href="#cb2-1"></a><span class="ot"> x ::</span> <span class="dt">Int</span></span></code></pre></div>
137+</td>
138+</tr>
139+<tr class="fragment">
140+<td>
141+<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> <span class="fu">f</span>(<span class="dt">int</span> x)</span></code></pre></div>
142+</td>
143+<td>
144+<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"> f ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span></span></code></pre></div>
145+</td>
146+</tr>
147+<tr class="fragment">
148+<td>
149+<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">static</span> &lt;T&gt; T <span class="fu">f</span>(T x)</span></code></pre></div>
150+</td>
151+<td>
152+<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> a <span class="ot">-&gt;</span> a</span></code></pre></div>
153+</td>
154+</tr>
155+</table>
156+</section>
157+<section class="slide level1">
158+
159+<table width="100%">
160+<tr>
161+<td>
162+<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> &lt;T&gt; T <span class="fu">f</span>(T x)</span></code></pre></div>
163+</td>
164+<td>
165+<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">-&gt;</span> a</span></code></pre></div>
166+</td>
167+</tr>
168+<tr>
169+<td class="fragment">
170+<div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb9-1"><a href="#cb9-1"></a> <span class="fu">f</span>(x);</span></code></pre></div>
171+</td>
172+<td class="fragment">
173+<div class="sourceCode" id="cb10"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb10-1"><a href="#cb10-1"></a> f x</span></code></pre></div>
174+</td>
175+</tr>
176+<tr class="fragment">
177+<td>
178+<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, y);</span></code></pre></div>
179+</td>
180+<td>
181+<div class="sourceCode" id="cb12"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb12-1"><a href="#cb12-1"></a> f x y</span></code></pre></div>
182+<div class="sourceCode" id="cb13"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb13-1"><a href="#cb13-1"></a> f x y <span class="ot">=</span> (f x) y</span></code></pre></div>
183+</td>
184+</td>
185+</tr>
186+</table>
187+<aside class="notes">
188+<p>Left-associative Currying</p>
189+</aside>
190+</section>
191+<section class="slide level1">
192+
193+<table width="100%">
194+<tr>
195+<td>
196+<div class="sourceCode" id="cb14"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb14-1"><a href="#cb14-1"></a> <span class="dt">static</span> &lt;T&gt; T <span class="fu">f</span>(T x)</span>
197+<span id="cb14-2"><a href="#cb14-2"></a> <span class="dt">static</span> &lt;T&gt; T <span class="fu">g</span>(T x)</span></code></pre></div>
198+</td>
199+<td>
200+<div class="sourceCode" id="cb15"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb15-1"><a href="#cb15-1"></a><span class="ot"> f ::</span> a <span class="ot">-&gt;</span> a</span>
201+<span id="cb15-2"><a href="#cb15-2"></a><span class="ot"> g ::</span> a <span class="ot">-&gt;</span> a</span></code></pre></div>
202+</td>
203+</tr>
204+<tr>
205+<td>
206+<div class="sourceCode" id="cb16"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb16-1"><a href="#cb16-1"></a> <span class="fu">f</span>(<span class="fu">g</span>(x));</span>
207+<span id="cb16-2"><a href="#cb16-2"></a> <span class="fu">g</span>(<span class="fu">f</span>(x));</span></code></pre></div>
208+</td>
209+<td>
210+<div class="sourceCode" id="cb17"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb17-1"><a href="#cb17-1"></a> f (g x)</span>
211+<span id="cb17-2"><a href="#cb17-2"></a> g (f x)</span></code></pre></div>
212+</td>
213+</tr>
214+</table>
215+</section>
216+<section id="композиция" class="slide level1">
217+<h1>Композиция</h1>
218+</section>
219+<section class="slide level1">
220+
221+<div class="sourceCode" id="cb18"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb18-1"><a href="#cb18-1"></a><span class="ot">f ::</span> a <span class="ot">-&gt;</span> a</span>
222+<span id="cb18-2"><a href="#cb18-2"></a><span class="ot">g ::</span> a <span class="ot">-&gt;</span> a</span></code></pre></div>
223+<div class="sourceCode" id="cb19"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb19-1"><a href="#cb19-1"></a>f (g x)</span></code></pre></div>
224+<div class="sourceCode" id="cb20"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb20-1"><a href="#cb20-1"></a>(f <span class="op">.</span> g) x <span class="op">==</span> f (g x)</span></code></pre></div>
225+<div class="sourceCode" id="cb21"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb21-1"><a href="#cb21-1"></a>h <span class="ot">=</span> f <span class="op">.</span> g</span>
226+<span id="cb21-2"><a href="#cb21-2"></a>h x <span class="op">==</span> f (g x)</span></code></pre></div>
227+</section>
228+<section class="slide level1">
229+
230+<div class="sourceCode" id="cb22"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb22-1"><a href="#cb22-1"></a><span class="ot">f ::</span> a <span class="ot">-&gt;</span> a</span>
231+<span id="cb22-2"><a href="#cb22-2"></a><span class="ot">g ::</span> a <span class="ot">-&gt;</span> a</span></code></pre></div>
232+<div class="sourceCode" id="cb23"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb23-1"><a href="#cb23-1"></a><span class="ot">h ::</span> a <span class="ot">-&gt;</span> a</span>
233+<span id="cb23-2"><a href="#cb23-2"></a>h <span class="ot">=</span> f <span class="op">.</span> g</span></code></pre></div>
234+<h3 class="fragment" id="моноид" class="fragment">моноид</h3>
235+<aside class="notes">
236+<p>моноид – у тебя есть две штуки одного типа и ты можешь получить еще одну штуку такого же типа. Это очень простой способ рождения сложности из простоты причем тип h выводится из определения. Нам его указывать не надо. если у нас изначальные маленькие кусочки хорошо описаны, то порожденные большие кусочки будут автоматически хорошо описанными.</p>
237+</aside>
238+</section>
239+<section class="slide level1">
240+
241+<h2 id="моноид-1">Моноид</h2>
242+<p><span class="fragment">Бинарная асоциативная операция</span></p>
243+<div class="sourceCode" id="cb24"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb24-1"><a href="#cb24-1"></a><span class="ot">(.) ::</span> (a <span class="ot">-&gt;</span> a) <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> a) <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> a)</span></code></pre></div>
244+<p><span class="fragment">Нейтральный элемент</span></p>
245+<div class="sourceCode" id="cb25"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb25-1"><a href="#cb25-1"></a><span class="fu">id</span><span class="ot"> ::</span> a <span class="ot">-&gt;</span> a</span>
246+<span id="cb25-2"><a href="#cb25-2"></a><span class="fu">id</span> x <span class="ot">=</span> x</span></code></pre></div>
247+</section>
248+<section id="haskell" class="slide level1">
249+<h1>Haskell</h1>
250+</section>
251+<section class="slide level1">
252+
253+<h3 id="чисто-функционаьлный">Чисто функционаьлный</h3>
254+<p>Все что функция может сделать – посмотреть на свои аргументы это вернуть значение.</p>
255+<aside class="notes">
256+<p>Нельзя просто произвольно распечатать строку в консоль, нельзя просто произвольно отправить запрос на бд, нельзя просто произвольно изменить глобальную переменную.</p>
257+</aside>
258+</section>
259+<section class="slide level1">
260+
261+<h3 id="referential-transparency">Referential transparency</h3>
262+<h5 id="любую-константу-можно-заменить-на-само-значение">(Любую константу можно заменить на само значение)</h5>
263+<div class="sourceCode" id="cb26"><pre class="sourceCode java fragment"><code class="sourceCode java"><span id="cb26-1"><a href="#cb26-1"></a><span class="dt">int</span> x = <span class="dv">8</span>;</span>
264+<span id="cb26-2"><a href="#cb26-2"></a><span class="dt">int</span> y = x++;</span>
265+<span id="cb26-3"><a href="#cb26-3"></a><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(y + <span class="st">&quot; might be the same as &quot;</span> + y);</span></code></pre></div>
266+<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>
267+<span id="cb27-2"><a href="#cb27-2"></a><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(x++ + <span class="st">&quot; might be the same as &quot;</span> + x++);</span></code></pre></div>
268+<aside class="notes">
269+<p>Сильно упрощает рефакторинг и понимание кода.</p>
270+</aside>
271+</section>
272+<section class="slide level1">
273+
274+<h3 id="нет-переменных-циклов-и-условных-переходов">Нет переменных, циклов и условных переходов</h3>
275+<p><span class="fragment">Зато есть константы и нормальная рекурсия (А переходов вообще нет)</span></p>
276+</section>
277+<section class="slide level1">
278+
279+<h3 id="очень-ленивый">Очень ленивый</h3>
280+<div class="sourceCode" id="cb28"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb28-1"><a href="#cb28-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>
281+<span id="cb28-2"><a href="#cb28-2"></a>xs&#39; <span class="ot">=</span> <span class="fu">sort</span> xs</span>
282+<span id="cb28-3"><a href="#cb28-3"></a><span class="fu">print</span> xs</span></code></pre></div>
283+<div class="fragment">
284+<p><code>xs'</code> не нужен чтобы распечатать <code>xs</code>, поэтому сортироваться ничто не будет. (Зачем делать то, что можно не делать)</p>
285+</div>
286+</section>
287+<section class="slide level1">
288+
289+<p>Если хотите быстро и просто потыкаться, тут есть интерктивная штука:</p>
290+<p><a href="https://www.haskell.org">haskell.org</a></p>
291+</section>
292+<section id="синтаксис" class="slide level1">
293+<h1>Синтаксис</h1>
294+</section>
295+<section id="функции" class="slide level1">
296+<h1>Функции</h1>
297+</section>
298+<section class="slide level1">
299+
300+<div class="sourceCode" id="cb29"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb29-1"><a href="#cb29-1"></a><span class="ot">add2 ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span></span>
301+<span id="cb29-2"><a href="#cb29-2"></a>add2 x <span class="ot">=</span> x <span class="op">+</span> <span class="dv">2</span></span></code></pre></div>
302+<p>Все функции и константы всегда обозначаются словами с маленькой буквы без пробелов.</p>
303+<p>(Константы это просто функции с нулем аргументов.)</p>
304+</section>
305+<section class="slide level1">
306+
307+<h2 id="pattern-mathcing">Pattern mathcing</h2>
308+<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">fixBuz ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">String</span></span>
309+<span id="cb30-2"><a href="#cb30-2"></a>divide8 <span class="dv">3</span> <span class="ot">=</span> <span class="st">&quot;Fiz&quot;</span></span>
310+<span id="cb30-3"><a href="#cb30-3"></a>divide8 <span class="dv">5</span> <span class="ot">=</span> <span class="st">&quot;Buz&quot;</span></span>
311+<span id="cb30-4"><a href="#cb30-4"></a>divide8 <span class="dv">15</span> <span class="ot">=</span> <span class="st">&quot;FizBuz&quot;</span></span>
312+<span id="cb30-5"><a href="#cb30-5"></a>divide8 _ <span class="ot">=</span> <span class="st">&quot;Some other number&quot;</span></span></code></pre></div>
313+<p>Так матчить можно произвольные структуры произвольного уровня вложенности.</p>
314+<p><code>_</code> – специальное название константы, которое говорит что вам все равно что в ней лежит.</p>
315+<aside class="notes">
316+<p>функции объявляются в несколькро строк. Первая – обьявленик типа функции, а последубщие – реализация. В общем случае тип можно не указывать, но указывать тип у высказыванй на самом верхнем уровне (не вложенные) считается хорошим тоном и улучшает выведение типов и ошибки компиляции. У функции может быть несколько реализаций: какая из них вызовется зависит от значений передаваемых аргументов. матчинг произхводится сверху вниз. если в аргемантах написано слово с маленькой буквы, то значение аргумента биндится на эту константу.</p>
317+</aside>
318+</section>
319+<section class="slide level1">
320+
321+<h2 id="структуры">Структуры</h2>
322+</section>
323+<section class="slide level1">
324+
325+<div class="sourceCode" id="cb31"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb31-1"><a href="#cb31-1"></a><span class="kw">data</span> <span class="dt">Foo</span> <span class="ot">=</span> <span class="dt">Bar</span></span>
326+<span id="cb31-2"><a href="#cb31-2"></a><span class="ot">foo ::</span> <span class="dt">Bar</span></span>
327+<span id="cb31-3"><a href="#cb31-3"></a>foo <span class="ot">=</span> <span class="dt">Bar</span></span></code></pre></div>
328+<p><code>Foo</code> – тип структуры. <code>Bar</code> – конструктор структуры.</p>
329+<p>Тут у <code>Foo</code> всего одно значение <code>Bar</code>.</p>
330+</section>
331+<section class="slide level1">
332+
333+<h2 id="произведение-типов">Произведение типов</h2>
334+<h5 id="обычные-поля-структур">(обычные поля структур)</h5>
335+<aside class="notes">
336+<p>После констрктора можно укзать существующие типы, которые в нем храняться.</p>
337+</aside>
338+<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>
339+<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>
340+<span id="cb33-2"><a href="#cb33-2"></a>vasya <span class="ot">=</span> <span class="dt">Person</span> <span class="st">&quot;Vasya&quot;</span> <span class="dv">8</span></span>
341+<span id="cb33-3"><a href="#cb33-3"></a><span class="co">-- тип можно не укзывать</span></span>
342+<span id="cb33-4"><a href="#cb33-4"></a>petya <span class="ot">=</span> <span class="dt">Person</span> <span class="st">&quot;Petya&quot;</span> <span class="dv">5</span></span></code></pre></div>
343+<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">-&gt;</span> <span class="dt">String</span></span>
344+<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>
345+<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">-&gt;</span> <span class="dt">String</span></span>
346+<span id="cb35-2"><a href="#cb35-2"></a>greetPerson p <span class="ot">=</span> <span class="st">&quot;Hello, &quot;</span> <span class="op">++</span> getName p</span></code></pre></div>
347+<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>
348+<span id="cb36-2"><a href="#cb36-2"></a><span class="co">-- &quot;Hello, Petya&quot;</span></span></code></pre></div>
349+<h3 id="еще-немного-функций">Еще немного функций</h3>
350+<pre><code>greetPerson :: PersonType -&gt; String
351+greetPerson p = &quot;Hello, &quot; ++ getName p
352+
353+greetPerson :: PersonType -&gt; String
354+greetPerson p = &quot;Hello, &quot; ++ name
355+ where
356+ name = getName p
357+
358+greetPerson :: PersonType -&gt; String
359+greetPerson p = &quot;Hello, &quot; ++ name
360+ where
361+ getName&#39; (Person name _) = name
362+ name = getName&#39; p
363+
364+data PersonType = Person String Int
365+
366+getName :: PersonType -&gt; String
367+getName (Person name _) = name
368+
369+greetName :: String -&gt; String
370+greetName name = &quot;Hello, &quot; ++ name
371+
372+greetPerson :: PersonType -&gt; String
373+greetPerson p = greetName (getName p)
374+
375+greetPerson :: PersonType -&gt; String
376+greetPerson = greetName . getName
377+
378+greetPerson petya
379+-- &quot;Hello, Petya&quot;
380+
381+(greetName . getName) petya
382+-- &quot;Hello, Petya&quot;</code></pre>
383+<h3 id="суммы-типов">Суммы типов</h3>
384+<p>Функции нескольких аргументов – странный синтаксис – потом расскажу.</p>
385+<pre><code>data Bool = False | True
386+
387+x :: Bool
388+x = True
389+y = False
390+
391+ifThenElse :: (Bool, a, a) -&gt; a
392+
393+ifThenElse (True, a, _) = a
394+ifThenElse (False, _, b) = b
395+
396+ifThenElse (True, &quot;Hello&quot;, &quot;World&quot;)
397+-- &quot;Hello&quot;
398+
399+ifThenElse (False, &quot;Hello&quot;, &quot;World&quot;)
400+-- &quot;World&quot;
401+
402+data CircleType = Circle Double Double Double
403+data RectangleType = Rectangle Double Double Double Double
404+
405+data Shape =
406+ CircleShape CircleType | RectangleShape RectangleType
407+
408+surface :: Shape -&gt; Double
409+
410+surface (CircleShape (Circle _ _ r)) =
411+ pi * r ^ 2
412+
413+surface (RectangleShape (Rectangle x1 y1 x2 y2)) =
414+ (abs (x2 - x1)) * (abs (y2 - y1))
415+
416+shape = CircleShape (Circle 0 0 2)
417+surface shape
418+-- 12.566370614359172
419+
420+otherShape = RectangleShape (Rectangle 1 2 3 4)
421+surface otherShape
422+-- 4.0</code></pre>
423+<h2 id="и-еще-немного-функций">И еще немного функций</h2>
424+<h3 id="лямбда-выражения">Лямбда-выражения</h3>
425+<pre><code>add8 :: Int -&gt; Int
426+
427+add8 x = x + 8
428+
429+add8 = \x -&gt; x + 8</code></pre>
430+<p>λ – <code>\\</code> (λ печатать тяжело)</p>
431+<pre><code>foo :: (Int -&gt; Int) -&gt; Int
432+
433+foo add8
434+
435+foo (\x -&gt; x + 8)</code></pre>
436+<h3 id="давайте-придумаем-синтаксис-для-функции-нескольких-аргументов">Давайте придумаем синтаксис для функции нескольких аргументов!</h3>
437+<pre><code>x, y :: Int
438+x = 42
439+y = 69
440+
441+xPlusY :: Int
442+xPlusY = add x y</code></pre>
443+<p>Применение функции – лево-ассоциативно</p>
444+<pre><code>xPlusY = (add x) y
445+
446+xPlusY = f y
447+f = add x
448+
449+f :: Int -&gt; Int
450+
451+add :: Int -&gt; (Int -&gt; Int)
452+
453+add :: Int -&gt; (Int -&gt; Int)</code></pre>
454+<p>Тип <code>-\&gt;</code> – право-ассоциативный</p>
455+<pre><code>add :: Int -&gt; Int -&gt; Int
456+
457+add a b = a + b
458+
459+add = \a b -&gt; a + b</code></pre>
460+<p>Любая функция берет строго один аргумент.</p>
461+<p>Функция нескольких аргументов все равно берет строго одтн аргумент и возвращает функцию, которая берет следйющий.</p>
462+<p><em>(И из-за того, что применение функции лево-ассоциативно, вызов таких не трубует особого синтаксиса.)</em></p>
463+<h3 id="currying">Currying</h3>
464+<pre><code>add :: Int -&gt; Int -&gt; Int
465+add a b = a + b
466+
467+add8 :: Int -&gt; Int
468+
469+add :: Int -&gt; (Int -&gt; Int)
470+
471+add8 = add 8
472+
473+add8 3
474+-- 11</code></pre>
475+<h3 id="funny-fact">Funny fact</h3>
476+<p>Оператор (например <code>+</code>) – функция, название которой не содержит буквы и цифры.</p>
477+<pre><code>x +&amp;+ y = x + y
478+
479+8 +&amp;+ 9
480+-- 17</code></pre>
481+<h3 id="funny-fact-2">Funny fact 2</h3>
482+<p>Оператор можно превратить в функцию, окружив его скобками.</p>
483+<pre><code>add :: Int -&gt; Int -&gt; Int
484+add x y = x + y
485+
486+add = (+&amp;+)
487+
488+add = (+)</code></pre>
489+<h3 id="funny-fact-3">Funny fact 3</h3>
490+<p>Функцию можно превратить в оператор, окружив ее обратными кавычками.</p>
491+<pre><code>add :: Int -&gt; Int -&gt; Int
492+add x y = x + y
493+
494+add 8 9
495+-- 17
496+
497+8 `add` 9
498+-- 17</code></pre>
499+<h2 id="список">Список</h2>
500+<h3 id="односвязный-список">Односвязный список</h3>
501+<pre><code>data IntList = Cons Int IntList | Nil
502+
503+nums :: IntList
504+nums = 1 `Cons` (2 `Cons` (3 `Cons` Nil))
505+
506+sum :: IntList -&gt; Int
507+
508+sum (Cons x xs) = x + sum xs
509+
510+sum Nil = 0
511+sum (Cons x xs) = x + sum xs
512+
513+sum nums
514+-- 6
515+
516+take :: Int -&gt; IntList -&gt; IntList
517+
518+take _ Nil = Nil
519+take 0 _ = Nil
520+take n (Cons x xs) = Cons x (take (n - 1) xs)
521+
522+nums :: IntList
523+nums = 1 `Cons` (2 `Cons` (3 `Cons` Nil))
524+
525+take 2 nums
526+-- Cons 1 (Cons 2 Nil)
527+take 1029 nums
528+-- Cons 1 (Cons 2 (Cons 3 Nil))
529+take 0 nums
530+-- Nil
531+
532+repeat :: Int -&gt; IntList
533+
534+repeat n = n : (repeat n)
535+
536+repeat 8
537+-- Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (...
538+
539+(take 3 . repeat) 8
540+-- Cons 8 (Cons 8 (Cons 8 Nil))
541+
542+(sum . take 3 . repeat) 8
543+-- 24</code></pre>
544+<table>
545+<colgroup>
546+<col style="width: 50%" />
547+<col style="width: 50%" />
548+</colgroup>
549+<tbody>
550+<tr class="odd">
551+<td>Наша самодеятельность</td>
552+<td>В стандартной библиотеке</td>
553+</tr>
554+<tr class="even">
555+<td><pre><code>IntList</code></pre></td>
556+<td><pre><code>[Int]</code></pre></td>
557+</tr>
558+<tr class="odd">
559+<td><pre><code>Nil</code></pre></td>
560+<td><pre><code>[]</code></pre></td>
561+</tr>
562+<tr class="even">
563+<td><pre><code>Cons</code></pre></td>
564+<td><pre><code>:</code></pre></td>
565+</tr>
566+<tr class="odd">
567+<td><pre><code>Cons 3 (Cons 4 Nil)</code></pre></td>
568+<td><pre class="fragment"><code>3 : 4 : []</code></pre>
569+<pre class="fragment"><code>[3, 4]</code></pre></td>
570+</tr>
571+</tbody>
572+</table>
573+<p><code>repeat</code>, <code>sum</code> и <code>take</code> тоже есть в стандартной библиотеке.</p>
574+<h2 id="quicksort">QuickSort</h2>
575+<pre><code>quicksort :: [Int] -&gt; [Int]
576+
577+quicksort (x:xs) =
578+ quicksort smaller ++ [x] ++ quicksort larger
579+ where
580+ smaller = filter (&lt; x) xs
581+ larger = filter (&gt;= x) xs
582+
583+filter :: (Bool -&gt; Int) -&gt; [Int] -&gt; [Int]
584+
585+filter f (x:xs) =
586+ if f x
587+ then filter f xs
588+ else x:(filter f xs)
589+
590+filter _ [] = []
591+filter f (x:xs) =
592+ if f x
593+ then filter f xs
594+ else x:(filter f xs)
595+
596+quicksort :: [Int] -&gt; [Int]
597+quicksort (x:xs) =
598+ quicksort smaller ++ [x] ++ quicksort larger
599+ where
600+ smaller = filter (&lt; x) xs
601+ larger = filter (&gt;= x) xs
602+ filter _ [] = []
603+ filter f (x:xs) =
604+ if f x
605+ then filter f xs
606+ else x:(filter f xs)
607+
608+quicksort :: [Int] -&gt; [Int]
609+quicksort [] = []
610+quicksort (x:xs) =
611+ quicksort smaller ++ [x] ++ quicksort larger
612+ where
613+ smaller = filter (&lt; x) xs
614+ larger = filter (&gt;= x) xs
615+ filter _ [] = []
616+ filter f (x:xs) =
617+ if f x
618+ then filter f xs
619+ else x:(filter f xs)
620+
621+quicksort [2, 1, 3, 4]
622+-- [1, 2, 3, 4]</code></pre>
623+<p><code>filter</code> тоже есть в стандартной библиотеке.</p>
624+<h2 id="где-и-как-смотреть-стандартную-библиотеку">Где и как смотреть "стандартную библиотеку"</h2>
625+<ol type="1">
626+<li class="fragment"><p><a href="https://hackage.haskell.org/package/base">Hackage</a></p>
627+<p>(Там вам нужен только пакет <code>base</code>. Ссылка ведет прямо на него.) Еще если там нажать <code>s</code>, то будет поиск.</p></li>
628+<li class="fragment"><p><a href="https://hoogle.haskell.org">Hoogle</a></p>
629+<p>Это поиск по типам. Например: <code>Int -\&gt; \[Int\] -\&gt; \[Int\]</code> (Тут вам опять же нужен только пакет <code>base</code>. Нужно чтобы справа было "package:base".) –&gt;</p></li>
630+</ol>
631+</section>
632+ </div>
633+ </div>
634+
635+ <script src="reveal.js/js/reveal.js"></script>
636+
637+ <script>
638+
639+ // Full list of configuration options available at:
640+ // https://github.com/hakimel/reveal.js#configuration
641+ Reveal.initialize({
642+ // Push each slide change to the browser history
643+ history: true,
644+
645+ // Optional reveal.js plugins
646+ dependencies: [
647+ { src: 'reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } },
648+ { src: 'reveal.js/plugin/zoom-js/zoom.js', async: true },
649+ { src: 'reveal.js/plugin/notes/notes.js', async: true }
650+ ]
651+ });
652+ </script>
653+ </body>
654+</html>
1.html+684−868
@@ -1,887 +1,703 @@
1−<!doctype html>
1+<!DOCTYPE html>
22<html>
3−
43<head>
54 <meta charset="utf-8">
6− <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
7−
8− <link rel="stylesheet" href="css/reset.css">
9− <link rel="stylesheet" href="css/reveal.css">
10− <link rel="stylesheet" href="css/theme/superblack.css">
11−
12− <!-- Theme used for syntax highlighting of code -->
13− <link rel="stylesheet" href="lib/css/monokai.css">
14−
5+ <meta name="generator" content="pandoc">
6+ <meta name="author" content="Ilya Kostyuchenko">
7+ <title>1</title>
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">
13+ <style>
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; }
26+ @media screen {
27+ div.sourceCode { overflow: auto; }
28+ }
29+ @media print {
30+ pre > code.sourceCode { white-space: pre-wrap; }
31+ pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
32+ }
33+ pre.numberSource code
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;
46+ color: #7a7c7d;
47+ }
48+ pre.numberSource { margin-left: 3em; border-left: 1px solid #7a7c7d; padding-left: 4px; }
49+ div.sourceCode
50+ { color: #cfcfc2; background-color: #232629; }
51+ @media screen {
52+ pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
53+ }
54+ code span. { color: #cfcfc2; } /* Normal */
55+ code span.al { color: #95da4c; background-color: #4d1f24; font-weight: bold; } /* Alert */
56+ code span.an { color: #3f8058; } /* Annotation */
57+ code span.at { color: #2980b9; } /* Attribute */
58+ code span.bn { color: #f67400; } /* BaseN */
59+ code span.bu { color: #7f8c8d; } /* BuiltIn */
60+ code span.cf { color: #fdbc4b; font-weight: bold; } /* ControlFlow */
61+ code span.ch { color: #3daee9; } /* Char */
62+ code span.cn { color: #27aeae; font-weight: bold; } /* Constant */
63+ code span.co { color: #7a7c7d; } /* Comment */
64+ code span.cv { color: #7f8c8d; } /* CommentVar */
65+ code span.do { color: #a43340; } /* Documentation */
66+ code span.dt { color: #2980b9; } /* DataType */
67+ code span.dv { color: #f67400; } /* DecVal */
68+ code span.er { color: #da4453; text-decoration: underline; } /* Error */
69+ code span.ex { color: #0099ff; font-weight: bold; } /* Extension */
70+ code span.fl { color: #f67400; } /* Float */
71+ code span.fu { color: #8e44ad; } /* Function */
72+ code span.im { color: #27ae60; } /* Import */
73+ code span.in { color: #c45b00; } /* Information */
74+ code span.kw { color: #cfcfc2; font-weight: bold; } /* Keyword */
75+ code span.op { color: #cfcfc2; } /* Operator */
76+ code span.ot { color: #27ae60; } /* Other */
77+ code span.pp { color: #27ae60; } /* Preprocessor */
78+ code span.re { color: #2980b9; background-color: #153042; } /* RegionMarker */
79+ code span.sc { color: #3daee9; } /* SpecialChar */
80+ code span.ss { color: #da4453; } /* SpecialString */
81+ code span.st { color: #f44f4f; } /* String */
82+ code span.va { color: #27aeae; } /* Variable */
83+ code span.vs { color: #da4453; } /* VerbatimString */
84+ code span.wa { color: #da4453; } /* Warning */
85+ </style>
86+ <link rel="stylesheet" href="reveal.js/css/theme/superblack.css" id="theme">
1587 <!-- Printing and PDF exports -->
1688 <script>
17− var link = document.createElement('link');
89+ var link = document.createElement( 'link' );
1890 link.rel = 'stylesheet';
1991 link.type = 'text/css';
20− link.href = window.location.search.match(/print-pdf/gi) ? 'css/print/pdf.css' : 'css/print/paper.css';
21− document.getElementsByTagName('head')[0].appendChild(link);
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 );
2294 </script>
95+ <!--[if lt IE 9]>
96+ <script src="reveal.js/lib/js/html5shiv.js"></script>
97+ <![endif]-->
98+ <style>
99+ div.sourceCode {
100+ background-color: transparent;
101+ overflow: auto;
102+ margin: 0em;
103+ }
104+
105+ pre.sourceCode {
106+ margin: 8px auto;
107+ }
108+ </style>
23109</head>
24−
25110<body>
26111 <div class="reveal">
27112 <div class="slides">
28− <section>
29− <h2>Функциональное программирование</h2>
30− <aside class="notes" data-markdown>
31− Функциональное программирование это не про использование map filter reduce.
32−
33− Функциональное программирование это вообще ортогонально к ооп.
34−
35− ИМХО проблема с ООП -- наследование (которое тоже ортогонально к ООП) -- нет разграничения между абстракцией и
36− реализацией.
37−
38− и вообще обзывание это функциональным программированием -- не совсем правильно.
39−
40− то, что мы сейчас будем пытаться сделать -- сделать код более переиспользуемым.
41−
42− сделать наши данные максимально тупыми => переиспользуемыми.
43−
44− пытаться комбинировать слишком умные куски -- не получится -- слишком сложно.
45−
46− мы хотим сделать простые куски, которые просто комбинировать и еще чтобы компилятор проверял эти наши
47− комбинации на валидность.
48− </aside>
49− </section>
50− <section data-markdown>
51− Функциональное программирование:
52− > функции -- это тоже данные.
53−
54− `Int -> Bool` (функция) -- ровно такие же данные как и `Int`. Их также можно складывать в структуры,
55− передавать как аргументы и т. п.
56− </section>
57−
58− <section>
59− <section>
60− <h1>нотация</h1>
61− </section>
62− <section>
63− <table width="100%">
64− <tr>
65− <td>
66− <pre>
67− <code class="java">int x;</code>
68− </pre>
69− </td>
70− <td>
71− <pre>
72− <code class="haskell">x :: Int</code>
73− </pre>
74− </td>
75− </tr>
76− <tr class="fragment">
77− <td>
78− <pre>
79− <code class="java">int f(int x)</code>
80− </pre>
81− </td>
82− <td>
83− <pre>
84− <code class="haskell">f :: Int -> Int</code>
85− </pre>
86− </td>
87− </tr>
88− <tr class="fragment">
89− <td>
90− <pre>
91− <code class="java">static &lt;T&gt; T f(T x)</code>
92− </pre>
93−
94− </td>
95− <td>
96− <pre>
97− <code class="haskell">f :: a -> a</code>
98− </pre>
99− </td>
100− </tr>
101− </table>
102− </section>
103− <section>
104− <table width="100%">
105− <tr>
106− <td>
107− <pre>
108− <code class="java">static &lt;T&gt; T f(T x)</code>
109− </pre>
110− </td>
111− <td>
112− <pre>
113− <code class="haskell">f :: a -> a</code>
114− </pre>
115− </td>
116− </tr>
117− <tr>
118− <td class="fragment">
119− <pre>
120− <code class="java">f(x);</code>
121− </pre>
122− </td>
123− <td class="fragment">
124− <pre>
125− <code class="haskell">f x</code>
126− </pre>
127− </td>
128− </tr>
129− <tr class="fragment">
130− <td>
131− <pre>
132− <code class="java">f(x, y);</code>
133− </pre>
134− </td>
135− <td>
136− <pre>
137− <code class="haskell">f x y</code>
138− </pre>
139− <pre class="fragment">
140− <code class="haskell">f x y = (f x) y</code>
141− </pre>
142− <aside class="notes">
143− Left-associative
144− Currying
145− </aside>
146− </td>
147− </td>
148− </tr>
149− </table>
150− </section>
151− <section>
152− <table width="100%">
153− <tr>
154− <td>
155− <pre>
156− <code class="java">static &lt;T&gt; T f(T x)
157−static &lt;T&gt; T g(T x)</code>
158− </pre>
159− </td>
160− <td>
161− <pre>
162− <code class="haskell">f :: a -> a
163−g :: a -> a</code>
164− </pre>
165− </td>
166− </tr>
167− <tr class="fragment">
168− <td>
169− <pre>
170− <code class="java">f(g(x));
171−g(f(x));</code>
172− </pre>
173− </td>
174− <td class="fragment">
175− <pre>
176− <code class="haskell">f (g x)
177−g (f x)</code>
178− </pre>
179− </td>
180− </tr>
181− </table>
182− </section>
183− </section>
184− <section>
185− <section>
186− <h1>
187− Композиция
188− </h1>
189− </section>
190− <section>
191− <pre><code class="haskell">f :: a -> a
192−g :: a -> a</code></pre>
193− <pre class="fragment"><code class="haskell">f (g x)</code></pre>
194− <pre class="fragment"><code class="haskell">(f . g) x == f (g x)</code></pre>
195− <pre class="fragment"><code class="haskell">h = f . g
196−h x == f (g x)</code></pre>
197− </section>
198− <section>
199− <pre><code class="haskell">f :: a -> a
200−g :: a -> a
201−
202−h :: a -> a
203−h = f . g</code></pre>
204−
205− <h3 class="fragment">моноид</h3>
206−
207− <aside class="notes" data-markdown>
208− моноид -- у тебя есть две штуки одного типа и ты можешь получить еще одну
209− штуку такого же
210− типа.
211−
212− Это очень простой способ рождения сложности из простоты
213−
214− причем тип h выводится из определения. Нам его указывать не надо.
215−
216− если у нас изначальные маленькие кусочки хорошо описаны, то порожденные большие кусочки будут автоматически
217− хорошо описанными.
218− </aside>
219− </section>
220− <section>
221− <h3>
222− Моноид
223− </h3>
224−
225− <p class="fragment">
226− Бинарная асоциативная операция
227− </p>
228−
229− <pre><code class="haskell fragment">(.) :: (a -> a) -> (a -> a) -> (a -> a)</code></pre>
230−
231− <p class="fragment">
232− Нейтральный элемент
233− </p>
234−
235− <pre><code class="haskell fragment">id :: a -> a
236−id x = x</code></pre>
237− </section>
238− </section>
239− </section>
240− <section>
241− <section>
242− <h2>Haskell</h2>
243− </section>
244− <section>
245− <h3>Чисто функционаьлный</h3>
246− <p class="fragment" data-markdown>Все что функция может сделать -- посмотреть на свои аргументы это вернуть
247− значение.</p>
248− <aside class="notes" data-markdown>Нельзя просто произвольно распечатать строку в консоль, нельзя просто
249− произвольно
250− отправить запрос на бд, нельзя просто произвольно изменить глобальную переменную.</aside>
251− </section>
252− <section>
253− <h3>Referential transparency</h3>
254− <h5>(Любую константу можно заменить на само значение)</h5>
255− <pre><code class="java fragment">int x = 8;
256−int y = x++;
257−System.out.println(y + " might be the same as " + y);</code></pre>
258− <pre><code class="java fragment">int x = 8;
259−System.out.println(x++ + " might be the same as " + x++);</code></pre>
260−
261− <aside class="notes" data-markdown>Сильно упрощает рефакторинг и понимание кода.</aside>
262− </section>
263− <section>
264− <h3>Нет переменных, циклов и условных переходов</h3>
265−
266− <p class="fragment" data-markdown>
267− Зато есть константы и нормальная рекурсия
268−
269− (А переходов вообще нет)
270− </p>
271− </section>
272− <section>
273− <h3>Очень ленивый</h3>
274−
275− <pre><code class="haskell fragment">xs = [4, 1, 3, 2]
276−xs' = sort xs
277−print xs</code></pre>
278−
279− <p class="fragment" data-markdown>
280− `xs'` не нужен чтобы распечатать `xs`, поэтому сортироваться ничто не будет.
281−
282− (Зачем делать то, что можно не делать)
283− </p>
284− </section>
285− <section>
286− <p>Если хотите быстро и просто потыкаться, тут есть интерктивная штука:</p>
287− <a href="https://www.haskell.org">haskell.org</a>
288− </section>
289− </section>
290− <section>
291− <h2>Синтаксис</h2>
292− </section>
293− <section>
294− <section>
295− <h2>Функции</h2>
296− </section>
297− <section>
298− <pre><code class="haskell">add2 :: Int -> Int
299−add2 x = x + 2</code></pre>
300− <p>Все функции и константы всегда обозначаются словами с маленькой буквы без пробелов.</p>
301− <p>(Константы это просто функции с нулем аргументов.)</p>
302− </section>
303− <section>
304− <h3>Pattern mathcing</h3>
305− <pre><code class="haskell">fixBuz :: Int -> String
306−divide8 3 = "Fiz"
307−divide8 5 = "Buz"
308−divide8 15 = "FizBuz"
309−divide8 _ = "Some other number"</code></pre>
310−
311− <p data-markdown>
312− Так матчить можно произвольные структуры произвольного уровня вложенности.
313−
314− `_` -- специальное название константы, которое говорит что вам все равно что в ней лежит.
315− </p>
316− <aside class="notes" data-markdown>
317− функции объявляются в несколькро строк. Первая -- обьявленик типа функции,
318− а последубщие -- реализация. В общем случае тип можно не указывать, но указывать тип у высказыванй на самом
319− верхнем уровне (не вложенные) считается хорошим тоном и улучшает выведение типов и ошибки компиляции.
320−
321− У функции может быть несколько реализаций: какая из них вызовется зависит от значений передаваемых
322− аргументов. матчинг произхводится сверху вниз.
323−
324− если в аргемантах написано слово с маленькой буквы, то значение аргумента биндится на эту константу.
325− </aside>
326− </section>
327− </section>
328− <section>
329− <section>
330− <h2>Структуры</h2>
331− </section>
332− <section>
333− <pre><code class="haskell">data Foo = Bar
334−foo :: Bar
335−foo = Bar</code></pre>
336−
337− <p data-markdown>
338− `Foo` -- тип структуры. `Bar` -- конструктор структуры.
339−
340− Тут у `Foo` всего одно значение `Bar`.
341− </p>
342− </section>
343− <section>
344− <h3>Произведение типов</h3>
345− <h5>(обычные поля структур)</h5>
346− <aside class="notes" data-markdown>
347− После констрктора можно укзать существующие типы, которые в нем храняться.
348− </aside>
349−
350− <pre><code class="haskell">data PersonType = Person String Int</code></pre>
351− <pre><code class="haskell fragment">vasya :: PersonType
352−vasya = Person "Vasya" 8
353−-- тип можно не укзывать
354−petya = Person "Petya" 5</code></pre>
355− <pre><code class="haskell fragment">getName :: PersonType -> String
356−getName (Person name _) = name</code></pre>
357− <pre><code class="haskell fragment">greetPerson :: PersonType -> String
358−greetPerson p = "Hello, " ++ getName p</code></pre>
359− <pre><code class="haskell fragment">greetPerson petya
360−-- "Hello, Petya"</code></pre>
361− </section>
362− <section>
363− <h3>Еще немного функций</h3>
364− <pre><code class="haskell fragment">greetPerson :: PersonType -> String
365−greetPerson p = "Hello, " ++ getName p</code></pre>
366−
367− <pre><code class="haskell fragment">greetPerson :: PersonType -> String
368−greetPerson p = "Hello, " ++ name
369− where
370− name = getName p</code></pre>
371− <pre><code class="haskell fragment">greetPerson :: PersonType -> String
372−greetPerson p = "Hello, " ++ name
373− where
374− getName' (Person name _) = name
375− name = getName' p</code></pre>
376− </section>
377− <section>
378− <pre><code class="haskell">data PersonType = Person String Int
379−
380−getName :: PersonType -> String
381−getName (Person name _) = name</code></pre>
382− <pre><code class="haskell fragment">greetName :: String -> String
383−greetName name = "Hello, " ++ name</code></pre>
384− <pre><code class="haskell fragment">greetPerson :: PersonType -> String
385−greetPerson p = greetName (getName p)</code></pre>
386− <pre><code class="haskell fragment">greetPerson :: PersonType -> String
387−greetPerson = greetName . getName</code></pre>
388− <pre><code class="haskell fragment">greetPerson petya
389−-- "Hello, Petya"</code></pre>
390− <pre><code class="haskell fragment">(greetName . getName) petya
391−-- "Hello, Petya"</code></pre>
392− </section>
393− <section>
394− <h3>Суммы типов</h3>
395− <aside class="notes" data-markdown>
396− Функции нескольких аргументов -- странный синтаксис -- потом расскажу.
397− </aside>
398−
399− <pre><code class="haskell fragment">data Bool = False | True</code></pre>
400− <pre><code class="haskell fragment">x :: Bool
401−x = True
402−y = False</code></pre>
403−
404− <pre><code class="haskell fragment">ifThenElse :: (Bool, a, a) -> a</code></pre>
405− <pre><code class="haskell fragment">ifThenElse (True, a, _) = a
406−ifThenElse (False, _, b) = b</code></pre>
407− <pre><code class="haskell fragment">ifThenElse (True, "Hello", "World")
408−-- "Hello"</code></pre>
409−
410− <pre><code class="haskell fragment">ifThenElse (False, "Hello", "World")
411−-- "World"</code></pre>
412−
413− </section>
414− <section>
415− <pre><code class="haskell">data CircleType = Circle Double Double Double
416−data RectangleType = Rectangle Double Double Double Double
417−</code></pre>
418− <pre><code class="haskell fragment">data Shape =
419− CircleShape CircleType | RectangleShape RectangleType</code></pre>
420− <pre><code class="haskell fragment">surface :: Shape -> Double</code></pre>
421− <pre><code class="haskell fragment">surface (CircleShape (Circle _ _ r)) =
422− pi * r ^ 2</code></pre>
423− <pre><code class="haskell fragment">surface (RectangleShape (Rectangle x1 y1 x2 y2)) =
424− (abs (x2 - x1)) * (abs (y2 - y1))</code></pre>
425− <pre><code class="haskell fragment">shape = CircleShape (Circle 0 0 2)
426−surface shape
427−-- 12.566370614359172
428−</code></pre>
429− <pre><code class="haskell fragment">otherShape = RectangleShape (Rectangle 1 2 3 4)
430−surface otherShape
431−-- 4.0
432−</code></pre>
433− </section>
434− </section>
435− <section>
436− <section>
437− <h2>И еще немного функций</h2>
438− </section>
439− <section>
440− <h3>Лямбда-выражения</h3>
441−
442− <pre><code class="haskell fragment">add8 :: Int -> Int</code></pre>
443− <pre><code class="haskell fragment">add8 x = x + 8</code></pre>
444− <pre><code class="haskell fragment">add8 = \x -> x + 8</code></pre>
445− <p data-markdown class="fragment">
446− λ -- `\`
447−
448− (λ печатать тяжело)</p>
449−
450− <pre><code class="haskell fragment">foo :: (Int -> Int) -> Int</code></pre>
451− <pre><code class="haskell fragment">foo add8</code></pre>
452− <pre><code class="haskell fragment">foo (\x -> x + 8)</code></pre>
453− </section>
454− <section>
455− <h3>Давайте придумаем синтаксис для функции нескольких аргументов!</h3>
456− </section>
457− <section>
458− <pre><code class="haskell">x, y :: Int
459−x = 42
460−y = 69
461−</code></pre>
462−
463− <pre><code class="haskell fragment">xPlusY :: Int
464−xPlusY = add x y</code></pre>
465− <p class="fragment" data-markdown>Применение функции -- лево-ассоциативно</p>
466− <pre><code class="haskell fragment">xPlusY = (add x) y</code></pre>
467− <pre><code class="haskell fragment">xPlusY = f y
468−f = add x</code></pre>
469− <pre><code class="haskell fragment">f :: Int -> Int</code></pre>
470− <pre><code class="haskell fragment">add :: Int -> (Int -> Int)</code></pre>
471− </section>
472− <section>
473− <pre><code class="haskell">add :: Int -> (Int -> Int)</code></pre>
474− <p class="fragment" data-markdown>Тип `->` -- право-ассоциативный</p>
475−
476− <pre><code class="haskell fragment">add :: Int -> Int -> Int</code></pre>
477− <pre><code class="haskell fragment">add a b = a + b</code></pre>
478− <pre><code class="haskell fragment">add = \a b -> a + b</code></pre>
479− </section>
480− <section>
481− <p>Любая функция берет строго один аргумент.</p>
482−
483− <p>Функция нескольких аргументов все равно берет строго одтн аргумент и возвращает функцию, которая берет
484− следйющий.
485− </p>
486−
487− <p>
488− <em>
489− (И из-за того, что применение функции лево-ассоциативно, вызов таких не трубует особого
490− синтаксиса.)
491− </em>
492− </p>
493− </section>
494− <section>
495− <h3>Currying</h3>
496− <pre><code class="haskell fragment">add :: Int -> Int -> Int
497−add a b = a + b</code></pre>
498−
499− <pre><code class="haskell fragment">add8 :: Int -> Int</code></pre>
500− <pre><code class="haskell fragment">add :: Int -> (Int -> Int)</code></pre>
501− <pre><code class="haskell fragment">add8 = add 8</code></pre>
502− <pre><code class="haskell fragment">add8 3
503−-- 11</code></pre>
504− </section>
505− <section>
506− <h3>Funny fact</h3>
507−
508− <p class="fragment" data-markdown>Оператор (например `+`) -- функция, название которой не содержит буквы и
509− цифры.</p>
510− <pre><code class="haskell fragment">x +&+ y = x + y</code></pre>
511− <pre><code class="haskell fragment">8 +&+ 9
512−-- 17</code></pre>
513−
514− </section>
515− <section>
516− <h3>Funny fact 2</h3>
517−
518− <p class="fragment" data-markdown>Оператор можно превратить в функцию, окружив его скобками.</p>
519− <pre><code class="haskell fragment">add :: Int -> Int -> Int
520−add x y = x + y</code></pre>
521− <pre><code class="haskell fragment">add = (+&+)</code></pre>
522− <pre><code class="haskell fragment">add = (+)</code></pre>
523−
524− </section>
525− <section>
526− <h3>Funny fact 3</h3>
527−
528− <p class="fragment" data-markdown>Функцию можно превратить в оператор, окружив ее обратными кавычками.</p>
529− <pre><code class="haskell fragment">add :: Int -> Int -> Int
530−add x y = x + y</code></pre>
531− <pre><code class="haskell fragment">add 8 9
532−-- 17</code></pre>
533− <pre><code class="haskell fragment">8 `add` 9
534−-- 17</code></pre>
535− </section>
536− </section>
537− </section>
538− <section>
539− <section>
540− <h2>Список</h2>
541− </section>
542− <section>
543− <h3>Односвязный список</h3>
544− <pre><code class="haskell fragment">data IntList = Cons Int IntList | Nil</code></pre>
545− <pre><code class="haskell fragment">nums :: IntList
546−nums = 1 `Cons` (2 `Cons` (3 `Cons` Nil))</code></pre>
547− <pre><code class="haskell fragment">sum :: IntList -> Int</code></pre>
548− <pre><code class="haskell fragment">sum (Cons x xs) = x + sum xs</code></pre>
549− <pre><code class="haskell fragment">sum Nil = 0
550−sum (Cons x xs) = x + sum xs</code></pre>
551− <pre><code class="haskell fragment">sum nums
552−-- 6</code></pre>
553−
554− </section>
555− <section>
556− <pre><code class="haskell">take :: Int -> IntList -> IntList</code></pre>
557− <pre><code class="haskell fragment">take _ Nil = Nil
558−take 0 _ = Nil
559−take n (Cons x xs) = Cons x (take (n - 1) xs)</code></pre>
560− <pre><code class="haskell fragment">nums :: IntList
561−nums = 1 `Cons` (2 `Cons` (3 `Cons` Nil))</code></pre>
562− <pre><code class="haskell fragment">take 2 nums
563−-- Cons 1 (Cons 2 Nil)
564−take 1029 nums
565−-- Cons 1 (Cons 2 (Cons 3 Nil))
566−take 0 nums
567−-- Nil</code></pre>
568−
569− </section>
570− <section>
571− <pre><code class="haskell">repeat :: Int -> IntList</code></pre>
572− <pre><code class="haskell fragment">repeat n = n : (repeat n)</code></pre>
573− <pre><code class="haskell fragment">repeat 8
574−-- Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (...</code></pre>
575− <pre><code class="haskell fragment">(take 3 . repeat) 8
576−-- Cons 8 (Cons 8 (Cons 8 Nil))</code></pre>
577− <pre><code class="haskell fragment">(sum . take 3 . repeat) 8
578−-- 24</code></pre>
579− </section>
580− <section>
581− <table>
582− <tr>
583− <td>Наша самодеятельность</td>
584− <td>В стандартной библиотеке</td>
585− </tr>
586− <tr class="fragment">
587− <td>
588− <pre><code class="haskell">IntList</code></pre>
589− </td>
590− <td>
591− <pre><code class="haskell">[Int]</code></pre>
592− </td>
593− </tr>
594− <tr class="fragment">
595− <td>
596− <pre><code class="haskell">Nil</code></pre>
597− </td>
598− <td>
599− <pre><code class="haskell">[]</code></pre>
600− </td>
601− </tr>
602− <tr class="fragment">
603− <td>
604− <pre><code class="haskell">Cons</code></pre>
605− </td>
606− <td>
607− <pre><code class="haskell">:</code></pre>
608− </td>
609− </tr>
610− <tr class="fragment">
611− <td>
612− <pre><code class="haskell">Cons 3 (Cons 4 Nil)</code></pre>
613− </td>
614− <td>
615− <pre class="fragment"><code class="haskell">3 : 4 : []</code></pre>
616− <pre class="fragment"><code class="haskell">[3, 4]</code></pre>
617− </td>
618− </tr>
619− </table>
620− </section>
621− <section>
622− <p data-markdown>`repeat`, `sum` и `take` тоже есть в стандартной библиотеке.</p>
623− </section>
624− </section>
625− <section>
626− <section>
627− <h2>QuickSort</h2>
628− </section>
629− <section>
630− <pre><code class="haskell">quicksort :: [Int] -> [Int]</code></pre>
631−
632− <pre><code class="haskell fragment">quicksort (x:xs) =
633− quicksort smaller ++ [x] ++ quicksort larger
634− where
635− smaller = filter (< x) xs
636− larger = filter (>= x) xs</code></pre>
637− </section>
638− <section>
639− <pre><code class="haskell">filter :: (Bool -> Int) -> [Int] -> [Int]</code></pre>
640− <pre><code class="haskell fragment">filter f (x:xs) =
641− if f x
642− then filter f xs
643− else x:(filter f xs)</code></pre>
644− <pre><code class="haskell fragment">filter _ [] = []
645−filter f (x:xs) =
646− if f x
647− then filter f xs
648− else x:(filter f xs)</code></pre>
649− </section>
650− <section>
651− <pre><code class="haskell">quicksort :: [Int] -> [Int]
652−quicksort (x:xs) =
653− quicksort smaller ++ [x] ++ quicksort larger
654− where
655− smaller = filter (< x) xs
656− larger = filter (>= x) xs
657− filter _ [] = []
658− filter f (x:xs) =
659− if f x
660− then filter f xs
661− else x:(filter f xs)</code></pre>
662− </section>
663− <section>
664− <pre><code class="haskell">quicksort :: [Int] -> [Int]
665−quicksort [] = []
666−quicksort (x:xs) =
667− quicksort smaller ++ [x] ++ quicksort larger
668− where
669− smaller = filter (< x) xs
670− larger = filter (>= x) xs
671− filter _ [] = []
672− filter f (x:xs) =
673− if f x
674− then filter f xs
675− else x:(filter f xs)</code></pre>
676− <pre><code class="haskell fragment">quicksort [2, 1, 3, 4]
677−-- [1, 2, 3, 4]</code></pre>
678− </section>
679− <section>
680− <p data-markdown>`filter` тоже есть в стандартной библиотеке.</p>
681− </section>
682− </section>
683− <section>
684− <section>
685− <h2>Где и как смотреть "стандартную библиотеку"</h2>
686− </section>
687− <section>
688− <ol>
689− <li>
690− <a href="https://hackage.haskell.org/package/base">Hackage</a>
691−
692− <p data-markdown>
693− (Там вам нужен только пакет `base`. Ссылка ведет прямо на него.)
694−
695− Еще если там нажать `s`, то будет поиск.
696− </p>
697− </li>
698− <li class="fragment">
699− <a href="https://hoogle.haskell.org">Hoogle</a>
700−
701− <p data-markdown>
702− Это поиск по типам.
703−
704− Например: `Int -> [Int] -> [Int]`
705−
706− (Тут вам опять же нужен только пакет `base`. Нужно чтобы справа было "package:base".)
707−
708− </p>
709− </li>
710− </ol>
711− </section>
712− </section>
113+
114+
115+<section id="функциональное-программирование" class="slide level1">
116+<h1>Функциональное программирование</h1>
117+<aside class="notes">
118+<p>Функциональное программирование это не про использование map filter reduce. Функциональное программирование это вообще ортогонально к ооп. ИМХО проблема с ООП – наследование (которое тоже ортогонально к ООП) – нет разграничения между абстракцией и реализацией. и вообще обзывание это функциональным программированием – не совсем правильно. то, что мы сейчас будем пытаться сделать – сделать код более переиспользуемым. сделать наши данные максимально тупыми =&gt; переиспользуемыми. пытаться комбинировать слишком умные куски – не получится – слишком сложно. мы хотим сделать простые куски, которые просто комбинировать и еще чтобы компилятор проверял эти наши комбинации на валидность.</p>
119+</aside>
120+</section>
121+<section class="slide level1">
122+
123+<p>Функциональное программирование:</p>
124+<blockquote>
125+<p>функции – это тоже данные.</p>
126+</blockquote>
127+<p><code>Int -&gt; Bool</code> (функция) – ровно такие же данные как и <code>Int</code>. Их также можно складывать в структуры, передавать как аргументы и т. п.</p>
128+</section>
129+<section id="нотация" class="slide level1">
130+<h1>нотация</h1>
131+</section>
132+<section class="slide level1">
133+
134+<table width="100%">
135+<tr>
136+<td>
137+<div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb1-1"><a href="#cb1-1"></a> <span class="dt">int</span> x;</span></code></pre></div>
138+</td>
139+<td>
140+<div class="sourceCode" id="cb2"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb2-1"><a href="#cb2-1"></a><span class="ot"> x ::</span> <span class="dt">Int</span></span></code></pre></div>
141+</td>
142+</tr>
143+<tr class="fragment">
144+<td>
145+<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> <span class="fu">f</span>(<span class="dt">int</span> x)</span></code></pre></div>
146+</td>
147+<td>
148+<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"> f ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span></span></code></pre></div>
149+</td>
150+</tr>
151+<tr class="fragment">
152+<td>
153+<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">static</span> &lt;T&gt; T <span class="fu">f</span>(T x)</span></code></pre></div>
154+</td>
155+<td>
156+<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> a <span class="ot">-&gt;</span> a</span></code></pre></div>
157+</td>
158+</tr>
159+</table>
160+</section>
161+<section class="slide level1">
162+
163+<table width="100%">
164+<tr>
165+<td>
166+<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> &lt;T&gt; T <span class="fu">f</span>(T x)</span></code></pre></div>
167+</td>
168+<td>
169+<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">-&gt;</span> a</span></code></pre></div>
170+</td>
171+</tr>
172+<tr>
173+<td class="fragment">
174+<div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb9-1"><a href="#cb9-1"></a> <span class="fu">f</span>(x);</span></code></pre></div>
175+</td>
176+<td class="fragment">
177+<div class="sourceCode" id="cb10"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb10-1"><a href="#cb10-1"></a> f x</span></code></pre></div>
178+</td>
179+</tr>
180+<tr class="fragment">
181+<td>
182+<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, y);</span></code></pre></div>
183+</td>
184+<td>
185+<div class="sourceCode" id="cb12"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb12-1"><a href="#cb12-1"></a> f x y</span></code></pre></div>
186+<div class="sourceCode" id="cb13"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb13-1"><a href="#cb13-1"></a> f x y <span class="ot">=</span> (f x) y</span></code></pre></div>
187+</td>
188+</td>
189+</tr>
190+</table>
191+<aside class="notes">
192+<p>Left-associative Currying</p>
193+</aside>
194+</section>
195+<section class="slide level1">
196+
197+<table width="100%">
198+<tr>
199+<td>
200+<div class="sourceCode" id="cb14"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb14-1"><a href="#cb14-1"></a> <span class="dt">static</span> &lt;T&gt; T <span class="fu">f</span>(T x)</span>
201+<span id="cb14-2"><a href="#cb14-2"></a> <span class="dt">static</span> &lt;T&gt; T <span class="fu">g</span>(T x)</span></code></pre></div>
202+</td>
203+<td>
204+<div class="sourceCode" id="cb15"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb15-1"><a href="#cb15-1"></a><span class="ot"> f ::</span> a <span class="ot">-&gt;</span> a</span>
205+<span id="cb15-2"><a href="#cb15-2"></a><span class="ot"> g ::</span> a <span class="ot">-&gt;</span> a</span></code></pre></div>
206+</td>
207+</tr>
208+<tr>
209+<td class="fragment">
210+<div class="sourceCode" id="cb16"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb16-1"><a href="#cb16-1"></a> <span class="fu">f</span>(<span class="fu">g</span>(x));</span>
211+<span id="cb16-2"><a href="#cb16-2"></a> <span class="fu">g</span>(<span class="fu">f</span>(x));</span></code></pre></div>
212+</td>
213+<td class="fragment">
214+<div class="sourceCode" id="cb17"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb17-1"><a href="#cb17-1"></a> f (g x)</span>
215+<span id="cb17-2"><a href="#cb17-2"></a> g (f x)</span></code></pre></div>
216+</td>
217+</tr>
218+</table>
219+</section>
220+<section id="композиция" class="slide level1">
221+<h1>Композиция</h1>
222+</section>
223+<section class="slide level1">
224+
225+<div class="sourceCode" id="cb18"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb18-1"><a href="#cb18-1"></a><span class="ot">f ::</span> a <span class="ot">-&gt;</span> a</span>
226+<span id="cb18-2"><a href="#cb18-2"></a><span class="ot">g ::</span> a <span class="ot">-&gt;</span> a</span></code></pre></div>
227+<div class="sourceCode" id="cb19"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb19-1"><a href="#cb19-1"></a>f (g x)</span></code></pre></div>
228+<div class="sourceCode" id="cb20"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb20-1"><a href="#cb20-1"></a>(f <span class="op">.</span> g) x <span class="op">==</span> f (g x)</span></code></pre></div>
229+<div class="sourceCode" id="cb21"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb21-1"><a href="#cb21-1"></a>h <span class="ot">=</span> f <span class="op">.</span> g</span>
230+<span id="cb21-2"><a href="#cb21-2"></a>h x <span class="op">==</span> f (g x)</span></code></pre></div>
231+</section>
232+<section class="slide level1">
233+
234+<div class="sourceCode" id="cb22"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb22-1"><a href="#cb22-1"></a><span class="ot">f ::</span> a <span class="ot">-&gt;</span> a</span>
235+<span id="cb22-2"><a href="#cb22-2"></a><span class="ot">g ::</span> a <span class="ot">-&gt;</span> a</span></code></pre></div>
236+<div class="sourceCode" id="cb23"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb23-1"><a href="#cb23-1"></a><span class="ot">h ::</span> a <span class="ot">-&gt;</span> a</span>
237+<span id="cb23-2"><a href="#cb23-2"></a>h <span class="ot">=</span> f <span class="op">.</span> g</span></code></pre></div>
238+<h3 class="fragment" id="моноид" class="fragment">моноид</h3>
239+<aside class="notes">
240+<p>моноид – у тебя есть две штуки одного типа и ты можешь получить еще одну штуку такого же типа. Это очень простой способ рождения сложности из простоты причем тип h выводится из определения. Нам его указывать не надо. если у нас изначальные маленькие кусочки хорошо описаны, то порожденные большие кусочки будут автоматически хорошо описанными.</p>
241+</aside>
242+</section>
243+<section class="slide level1">
244+
245+<h2 id="моноид-1">Моноид</h2>
246+<p><span class="fragment">Бинарная асоциативная операция</span></p>
247+<div class="sourceCode" id="cb24"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb24-1"><a href="#cb24-1"></a><span class="ot">(.) ::</span> (a <span class="ot">-&gt;</span> a) <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> a) <span class="ot">-&gt;</span> (a <span class="ot">-&gt;</span> a)</span></code></pre></div>
248+<p><span class="fragment">Нейтральный элемент</span></p>
249+<div class="sourceCode" id="cb25"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb25-1"><a href="#cb25-1"></a><span class="fu">id</span><span class="ot"> ::</span> a <span class="ot">-&gt;</span> a</span>
250+<span id="cb25-2"><a href="#cb25-2"></a><span class="fu">id</span> x <span class="ot">=</span> x</span></code></pre></div>
251+</section>
252+<section id="haskell" class="slide level1">
253+<h1>Haskell</h1>
254+</section>
255+<section class="slide level1">
256+
257+<h3 id="чисто-функционаьлный">Чисто функционаьлный</h3>
258+<p>Все что функция может сделать – посмотреть на свои аргументы это вернуть значение.</p>
259+<aside class="notes">
260+<p>Нельзя просто произвольно распечатать строку в консоль, нельзя просто произвольно отправить запрос на бд, нельзя просто произвольно изменить глобальную переменную.</p>
261+</aside>
262+</section>
263+<section class="slide level1">
264+
265+<h3 id="referential-transparency">Referential transparency</h3>
266+<h5 id="любую-константу-можно-заменить-на-само-значение">(Любую константу можно заменить на само значение)</h5>
267+<div class="sourceCode" id="cb26"><pre class="sourceCode java fragment"><code class="sourceCode java"><span id="cb26-1"><a href="#cb26-1"></a><span class="dt">int</span> x = <span class="dv">8</span>;</span>
268+<span id="cb26-2"><a href="#cb26-2"></a><span class="dt">int</span> y = x++;</span>
269+<span id="cb26-3"><a href="#cb26-3"></a><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(y + <span class="st">&quot; might be the same as &quot;</span> + y);</span></code></pre></div>
270+<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>
271+<span id="cb27-2"><a href="#cb27-2"></a><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(x++ + <span class="st">&quot; might be the same as &quot;</span> + x++);</span></code></pre></div>
272+<aside class="notes">
273+<p>Сильно упрощает рефакторинг и понимание кода.</p>
274+</aside>
275+</section>
276+<section class="slide level1">
277+
278+<h3 id="нет-переменных-циклов-и-условных-переходов">Нет переменных, циклов и условных переходов</h3>
279+<p><span class="fragment">Зато есть константы и нормальная рекурсия (А переходов вообще нет)</span></p>
280+</section>
281+<section class="slide level1">
282+
283+<h3 id="очень-ленивый">Очень ленивый</h3>
284+<div class="sourceCode" id="cb28"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb28-1"><a href="#cb28-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>
285+<span id="cb28-2"><a href="#cb28-2"></a>xs&#39; <span class="ot">=</span> <span class="fu">sort</span> xs</span>
286+<span id="cb28-3"><a href="#cb28-3"></a><span class="fu">print</span> xs</span></code></pre></div>
287+<div class="fragment">
288+<p><code>xs'</code> не нужен чтобы распечатать <code>xs</code>, поэтому сортироваться ничто не будет. (Зачем делать то, что можно не делать)</p>
289+</div>
290+</section>
291+<section class="slide level1">
292+
293+<p>Если хотите быстро и просто потыкаться, тут есть интерктивная штука:</p>
294+<p><a href="https://www.haskell.org">haskell.org</a></p>
295+</section>
296+<section id="синтаксис" class="slide level1">
297+<h1>Синтаксис</h1>
298+</section>
299+<section id="функции" class="slide level1">
300+<h1>Функции</h1>
301+</section>
302+<section class="slide level1">
303+
304+<div class="sourceCode" id="cb29"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb29-1"><a href="#cb29-1"></a><span class="ot">add2 ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span></span>
305+<span id="cb29-2"><a href="#cb29-2"></a>add2 x <span class="ot">=</span> x <span class="op">+</span> <span class="dv">2</span></span></code></pre></div>
306+<p>Все функции и константы всегда обозначаются словами с маленькой буквы без пробелов.</p>
307+<p>(Константы это просто функции с нулем аргументов.)</p>
308+</section>
309+<section class="slide level1">
310+
311+<h2 id="pattern-mathcing">Pattern mathcing</h2>
312+<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">fixBuz ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">String</span></span>
313+<span id="cb30-2"><a href="#cb30-2"></a>divide8 <span class="dv">3</span> <span class="ot">=</span> <span class="st">&quot;Fiz&quot;</span></span>
314+<span id="cb30-3"><a href="#cb30-3"></a>divide8 <span class="dv">5</span> <span class="ot">=</span> <span class="st">&quot;Buz&quot;</span></span>
315+<span id="cb30-4"><a href="#cb30-4"></a>divide8 <span class="dv">15</span> <span class="ot">=</span> <span class="st">&quot;FizBuz&quot;</span></span>
316+<span id="cb30-5"><a href="#cb30-5"></a>divide8 _ <span class="ot">=</span> <span class="st">&quot;Some other number&quot;</span></span></code></pre></div>
317+<p>Так матчить можно произвольные структуры произвольного уровня вложенности.</p>
318+<p><code>_</code> – специальное название константы, которое говорит что вам все равно что в ней лежит.</p>
319+<aside class="notes">
320+<p>функции объявляются в несколькро строк. Первая – обьявленик типа функции, а последубщие – реализация. В общем случае тип можно не указывать, но указывать тип у высказыванй на самом верхнем уровне (не вложенные) считается хорошим тоном и улучшает выведение типов и ошибки компиляции. У функции может быть несколько реализаций: какая из них вызовется зависит от значений передаваемых аргументов. матчинг произхводится сверху вниз. если в аргемантах написано слово с маленькой буквы, то значение аргумента биндится на эту константу.</p>
321+</aside>
322+</section>
323+<section class="slide level1">
324+
325+<h2 id="структуры">Структуры</h2>
326+</section>
327+<section class="slide level1">
328+
329+<div class="sourceCode" id="cb31"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb31-1"><a href="#cb31-1"></a><span class="kw">data</span> <span class="dt">Foo</span> <span class="ot">=</span> <span class="dt">Bar</span></span>
330+<span id="cb31-2"><a href="#cb31-2"></a><span class="ot">foo ::</span> <span class="dt">Bar</span></span>
331+<span id="cb31-3"><a href="#cb31-3"></a>foo <span class="ot">=</span> <span class="dt">Bar</span></span></code></pre></div>
332+<p><code>Foo</code> – тип структуры. <code>Bar</code> – конструктор структуры.</p>
333+<p>Тут у <code>Foo</code> всего одно значение <code>Bar</code>.</p>
334+</section>
335+<section class="slide level1">
336+
337+<h2 id="произведение-типов">Произведение типов</h2>
338+<h5 id="обычные-поля-структур">(обычные поля структур)</h5>
339+<aside class="notes">
340+<p>После констрктора можно укзать существующие типы, которые в нем храняться.</p>
341+</aside>
342+<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>
343+<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>
344+<span id="cb33-2"><a href="#cb33-2"></a>vasya <span class="ot">=</span> <span class="dt">Person</span> <span class="st">&quot;Vasya&quot;</span> <span class="dv">8</span></span>
345+<span id="cb33-3"><a href="#cb33-3"></a><span class="co">-- тип можно не укзывать</span></span>
346+<span id="cb33-4"><a href="#cb33-4"></a>petya <span class="ot">=</span> <span class="dt">Person</span> <span class="st">&quot;Petya&quot;</span> <span class="dv">5</span></span></code></pre></div>
347+<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">-&gt;</span> <span class="dt">String</span></span>
348+<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>
349+<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">-&gt;</span> <span class="dt">String</span></span>
350+<span id="cb35-2"><a href="#cb35-2"></a>greetPerson p <span class="ot">=</span> <span class="st">&quot;Hello, &quot;</span> <span class="op">++</span> getName p</span></code></pre></div>
351+<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>
352+<span id="cb36-2"><a href="#cb36-2"></a><span class="co">-- &quot;Hello, Petya&quot;</span></span></code></pre></div>
353+</section>
354+<section class="slide level1">
355+
356+<h2 id="еще-немного-функций">Еще немного функций</h2>
357+<div class="sourceCode" id="cb37"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb37-1"><a href="#cb37-1"></a><span class="ot">greetPerson ::</span> <span class="dt">PersonType</span> <span class="ot">-&gt;</span> <span class="dt">String</span></span>
358+<span id="cb37-2"><a href="#cb37-2"></a>greetPerson p <span class="ot">=</span> <span class="st">&quot;Hello, &quot;</span> <span class="op">++</span> getName p</span></code></pre></div>
359+<div class="sourceCode" id="cb38"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb38-1"><a href="#cb38-1"></a><span class="ot">greetPerson ::</span> <span class="dt">PersonType</span> <span class="ot">-&gt;</span> <span class="dt">String</span></span>
360+<span id="cb38-2"><a href="#cb38-2"></a>greetPerson p <span class="ot">=</span> <span class="st">&quot;Hello, &quot;</span> <span class="op">++</span> name</span>
361+<span id="cb38-3"><a href="#cb38-3"></a> <span class="kw">where</span></span>
362+<span id="cb38-4"><a href="#cb38-4"></a> name <span class="ot">=</span> getName p</span></code></pre></div>
363+<div class="sourceCode" id="cb39"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb39-1"><a href="#cb39-1"></a><span class="ot">greetPerson ::</span> <span class="dt">PersonType</span> <span class="ot">-&gt;</span> <span class="dt">String</span></span>
364+<span id="cb39-2"><a href="#cb39-2"></a>greetPerson p <span class="ot">=</span> <span class="st">&quot;Hello, &quot;</span> <span class="op">++</span> name</span>
365+<span id="cb39-3"><a href="#cb39-3"></a> <span class="kw">where</span></span>
366+<span id="cb39-4"><a href="#cb39-4"></a> getName&#39; (<span class="dt">Person</span> name _) <span class="ot">=</span> name</span>
367+<span id="cb39-5"><a href="#cb39-5"></a> name <span class="ot">=</span> getName&#39; p</span></code></pre></div>
368+</section>
369+<section class="slide level1">
370+
371+<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">PersonType</span> <span class="ot">=</span> <span class="dt">Person</span> <span class="dt">String</span> <span class="dt">Int</span></span>
372+<span id="cb40-2"><a href="#cb40-2"></a></span>
373+<span id="cb40-3"><a href="#cb40-3"></a><span class="ot">getName ::</span> <span class="dt">PersonType</span> <span class="ot">-&gt;</span> <span class="dt">String</span></span>
374+<span id="cb40-4"><a href="#cb40-4"></a>getName (<span class="dt">Person</span> name _) <span class="ot">=</span> name</span></code></pre></div>
375+<div class="sourceCode" id="cb41"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb41-1"><a href="#cb41-1"></a><span class="ot">greetName ::</span> <span class="dt">String</span> <span class="ot">-&gt;</span> <span class="dt">String</span></span>
376+<span id="cb41-2"><a href="#cb41-2"></a>greetName name <span class="ot">=</span> <span class="st">&quot;Hello, &quot;</span> <span class="op">++</span> name</span></code></pre></div>
377+<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">-&gt;</span> <span class="dt">String</span></span>
378+<span id="cb42-2"><a href="#cb42-2"></a>greetPerson p <span class="ot">=</span> greetName (getName p)</span></code></pre></div>
379+<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">-&gt;</span> <span class="dt">String</span></span>
380+<span id="cb43-2"><a href="#cb43-2"></a>greetPerson <span class="ot">=</span> greetName <span class="op">.</span> getName</span></code></pre></div>
381+<div class="sourceCode" id="cb44"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb44-1"><a href="#cb44-1"></a>greetPerson petya</span>
382+<span id="cb44-2"><a href="#cb44-2"></a><span class="co">-- &quot;Hello, Petya&quot;</span></span></code></pre></div>
383+<div class="sourceCode" id="cb45"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb45-1"><a href="#cb45-1"></a>(greetName <span class="op">.</span> getName) petya</span>
384+<span id="cb45-2"><a href="#cb45-2"></a><span class="co">-- &quot;Hello, Petya&quot;</span></span></code></pre></div>
385+</section>
386+<section class="slide level1">
387+
388+<h2 id="суммы-типов">Суммы типов</h2>
389+<aside class="notes">
390+<p>Функции нескольких аргументов – странный синтаксис – потом расскажу. А пока используем тюпли!</p>
391+</aside>
392+<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="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>
393+<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">x ::</span> <span class="dt">Bool</span></span>
394+<span id="cb47-2"><a href="#cb47-2"></a>x <span class="ot">=</span> <span class="dt">True</span></span>
395+<span id="cb47-3"><a href="#cb47-3"></a>y <span class="ot">=</span> <span class="dt">False</span></span></code></pre></div>
396+<div class="sourceCode" id="cb48"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb48-1"><a href="#cb48-1"></a><span class="ot">ifThenElse ::</span> (<span class="dt">Bool</span>, a, a) <span class="ot">-&gt;</span> a</span></code></pre></div>
397+<div class="sourceCode" id="cb49"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb49-1"><a href="#cb49-1"></a>ifThenElse (<span class="dt">True</span>, a, _) <span class="ot">=</span> a</span>
398+<span id="cb49-2"><a href="#cb49-2"></a>ifThenElse (<span class="dt">False</span>, _, b) <span class="ot">=</span> b</span></code></pre></div>
399+<div class="sourceCode" id="cb50"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb50-1"><a href="#cb50-1"></a>ifThenElse (<span class="dt">True</span>, <span class="st">&quot;Hello&quot;</span>, <span class="st">&quot;World&quot;</span>)</span>
400+<span id="cb50-2"><a href="#cb50-2"></a><span class="co">-- &quot;Hello&quot;</span></span></code></pre></div>
401+<div class="sourceCode" id="cb51"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb51-1"><a href="#cb51-1"></a>ifThenElse (<span class="dt">False</span>, <span class="st">&quot;Hello&quot;</span>, <span class="st">&quot;World&quot;</span>)</span>
402+<span id="cb51-2"><a href="#cb51-2"></a><span class="co">-- &quot;World&quot;</span></span></code></pre></div>
403+</section>
404+<section class="slide level1">
405+
406+<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="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>
407+<span id="cb52-2"><a href="#cb52-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>
408+<div class="sourceCode" id="cb53"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb53-1"><a href="#cb53-1"></a><span class="kw">data</span> <span class="dt">Shape</span> <span class="ot">=</span></span>
409+<span id="cb53-2"><a href="#cb53-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>
410+<div class="sourceCode" id="cb54"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb54-1"><a href="#cb54-1"></a><span class="ot">surface ::</span> <span class="dt">Shape</span> <span class="ot">-&gt;</span> <span class="dt">Double</span></span></code></pre></div>
411+<div class="sourceCode" id="cb55"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb55-1"><a href="#cb55-1"></a>surface (<span class="dt">CircleShape</span> (<span class="dt">Circle</span> _ _ r)) <span class="ot">=</span></span>
412+<span id="cb55-2"><a href="#cb55-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>
413+<div class="sourceCode" id="cb56"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb56-1"><a href="#cb56-1"></a>surface (<span class="dt">RectangleShape</span> (<span class="dt">Rectangle</span> x1 y1 x2 y2)) <span class="ot">=</span></span>
414+<span id="cb56-2"><a href="#cb56-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>
415+<div class="sourceCode" id="cb57"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb57-1"><a href="#cb57-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>
416+<span id="cb57-2"><a href="#cb57-2"></a>surface shape</span>
417+<span id="cb57-3"><a href="#cb57-3"></a><span class="co">-- 12.566370614359172</span></span></code></pre></div>
418+<div class="sourceCode" id="cb58"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb58-1"><a href="#cb58-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>
419+<span id="cb58-2"><a href="#cb58-2"></a>surface otherShape</span>
420+<span id="cb58-3"><a href="#cb58-3"></a><span class="co">-- 4.0</span></span></code></pre></div>
421+</section>
422+<section id="и-еще-немного-функций" class="slide level1">
423+<h1>И еще немного функций</h1>
424+</section>
425+<section class="slide level1">
426+
427+<h2 id="лямбда-выражения">Лямбда-выражения</h2>
428+<div class="sourceCode" id="cb59"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb59-1"><a href="#cb59-1"></a><span class="ot">add8 ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span></span></code></pre></div>
429+<div class="sourceCode" id="cb60"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb60-1"><a href="#cb60-1"></a>add8 x <span class="ot">=</span> x <span class="op">+</span> <span class="dv">8</span></span></code></pre></div>
430+<div class="sourceCode" id="cb61"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb61-1"><a href="#cb61-1"></a>add8 <span class="ot">=</span> \x <span class="ot">-&gt;</span> x <span class="op">+</span> <span class="dv">8</span></span></code></pre></div>
431+<p><span class="fragment">λ – <code>\</code> (λ печатать тяжело)</span></p>
432+<div class="sourceCode" id="cb62"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb62-1"><a href="#cb62-1"></a><span class="ot">foo ::</span> (<span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span>) <span class="ot">-&gt;</span> <span class="dt">Int</span></span></code></pre></div>
433+<div class="sourceCode" id="cb63"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb63-1"><a href="#cb63-1"></a>foo add8</span></code></pre></div>
434+<div class="sourceCode" id="cb64"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb64-1"><a href="#cb64-1"></a>foo (\x <span class="ot">-&gt;</span> x <span class="op">+</span> <span class="dv">8</span>)</span></code></pre></div>
435+</section>
436+<section class="slide level1">
437+
438+<h3 id="давайте-придумаем-синтаксис-для-функции-нескольких-аргументов">Давайте придумаем синтаксис для функции нескольких аргументов!</h3>
439+</section>
440+<section class="slide level1">
441+
442+<div class="sourceCode" id="cb65"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb65-1"><a href="#cb65-1"></a>x,<span class="ot"> y ::</span> <span class="dt">Int</span></span>
443+<span id="cb65-2"><a href="#cb65-2"></a>x <span class="ot">=</span> <span class="dv">42</span></span>
444+<span id="cb65-3"><a href="#cb65-3"></a>y <span class="ot">=</span> <span class="dv">69</span></span></code></pre></div>
445+<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">xPlusY ::</span> <span class="dt">Int</span></span>
446+<span id="cb66-2"><a href="#cb66-2"></a>xPlusY <span class="ot">=</span> add x y</span></code></pre></div>
447+<p><span class="fragment">Применение функции – лево-ассоциативно</span></p>
448+<div class="sourceCode" id="cb67"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb67-1"><a href="#cb67-1"></a>xPlusY <span class="ot">=</span> (add x) y</span></code></pre></div>
449+<div class="sourceCode" id="cb68"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb68-1"><a href="#cb68-1"></a>xPlusY <span class="ot">=</span> f y</span>
450+<span id="cb68-2"><a href="#cb68-2"></a>f <span class="ot">=</span> add x</span></code></pre></div>
451+<div class="sourceCode" id="cb69"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb69-1"><a href="#cb69-1"></a><span class="ot">f ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span></span></code></pre></div>
452+<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">add ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> (<span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span>)</span></code></pre></div>
453+</section>
454+<section class="slide level1">
455+
456+<div class="sourceCode" id="cb71"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb71-1"><a href="#cb71-1"></a><span class="ot">add ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> (<span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span>)</span></code></pre></div>
457+<p><span class="fragment">Тип <code>-&gt;</code> – право-ассоциативный</span></p>
458+<div class="sourceCode" id="cb72"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb72-1"><a href="#cb72-1"></a><span class="ot">add ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span></span></code></pre></div>
459+<div class="sourceCode" id="cb73"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb73-1"><a href="#cb73-1"></a>add a b <span class="ot">=</span> a <span class="op">+</span> b</span></code></pre></div>
460+<div class="sourceCode" id="cb74"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb74-1"><a href="#cb74-1"></a>add <span class="ot">=</span> \a b <span class="ot">-&gt;</span> a <span class="op">+</span> b</span></code></pre></div>
461+</section>
462+<section class="slide level1">
463+
464+<p>Любая функция берет строго один аргумент.</p>
465+<p>Функция нескольких аргументов все равно берет строго одтн аргумент и возвращает функцию, которая берет следйющий.</p>
466+<p><em>(И из-за того, что применение функции лево-ассоциативно, вызов таких не трубует особого синтаксиса.)</em></p>
467+</section>
468+<section class="slide level1">
469+
470+<h3 id="currying">Currying</h3>
471+<div class="sourceCode" id="cb75"><pre class="sourceCode haskell fragment"><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">-&gt;</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span></span>
472+<span id="cb75-2"><a href="#cb75-2"></a>add a b <span class="ot">=</span> a <span class="op">+</span> b</span></code></pre></div>
473+<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">add8 ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span></span></code></pre></div>
474+<div class="sourceCode" id="cb77"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb77-1"><a href="#cb77-1"></a><span class="ot">add ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> (<span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span>)</span></code></pre></div>
475+<div class="sourceCode" id="cb78"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb78-1"><a href="#cb78-1"></a>add8 <span class="ot">=</span> add <span class="dv">8</span></span></code></pre></div>
476+<div class="sourceCode" id="cb79"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb79-1"><a href="#cb79-1"></a>add8 <span class="dv">3</span></span>
477+<span id="cb79-2"><a href="#cb79-2"></a><span class="co">-- 11</span></span></code></pre></div>
478+</section>
479+<section class="slide level1">
480+
481+<h3 id="funny-fact">Funny fact</h3>
482+<p><span class="fragment">Оператор (например <code>+</code>) – функция, название которой не содержит буквы и цифры.</span></p>
483+<div class="sourceCode" id="cb80"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb80-1"><a href="#cb80-1"></a>x <span class="op">+&amp;+</span> y <span class="ot">=</span> x <span class="op">+</span> y</span></code></pre></div>
484+<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="dv">8</span> <span class="op">+&amp;+</span> <span class="dv">9</span></span>
485+<span id="cb81-2"><a href="#cb81-2"></a><span class="co">-- 17</span></span></code></pre></div>
486+</section>
487+<section class="slide level1">
488+
489+<h3 id="funny-fact-2">Funny fact 2</h3>
490+<p><span class="fragment">Оператор можно превратить в функцию, окружив его скобками.</span></p>
491+<div class="sourceCode" id="cb82"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb82-1"><a href="#cb82-1"></a><span class="ot">add ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span></span>
492+<span id="cb82-2"><a href="#cb82-2"></a>add x y <span class="ot">=</span> x <span class="op">+</span> y</span></code></pre></div>
493+<div class="sourceCode" id="cb83"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb83-1"><a href="#cb83-1"></a>add <span class="ot">=</span> (<span class="op">+&amp;+</span>)</span></code></pre></div>
494+<div class="sourceCode" id="cb84"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb84-1"><a href="#cb84-1"></a>add <span class="ot">=</span> (<span class="op">+</span>)</span></code></pre></div>
495+</section>
496+<section class="slide level1">
497+
498+<h3 id="funny-fact-3">Funny fact 3</h3>
499+<p><span class="fragment">Функцию можно превратить в оператор, окружив ее обратными кавычками.</span></p>
500+<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="ot">add ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">Int</span></span>
501+<span id="cb85-2"><a href="#cb85-2"></a>add x y <span class="ot">=</span> x <span class="op">+</span> y</span></code></pre></div>
502+<div class="sourceCode" id="cb86"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb86-1"><a href="#cb86-1"></a>add <span class="dv">8</span> <span class="dv">9</span></span>
503+<span id="cb86-2"><a href="#cb86-2"></a><span class="co">-- 17</span></span></code></pre></div>
504+<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="dv">8</span> <span class="ot">`add`</span> <span class="dv">9</span></span>
505+<span id="cb87-2"><a href="#cb87-2"></a><span class="co">-- 17</span></span></code></pre></div>
506+</section>
507+<section id="список" class="slide level1">
508+<h1>Список</h1>
509+</section>
510+<section class="slide level1">
511+
512+<h3 id="односвязный-список">Односвязный список</h3>
513+<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="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>
514+<div class="sourceCode" id="cb89"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb89-1"><a href="#cb89-1"></a><span class="dt">Cons</span><span class="ot"> ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">IntList</span> <span class="ot">-&gt;</span> <span class="dt">IntList</span></span>
515+<span id="cb89-2"><a href="#cb89-2"></a><span class="dt">Nil</span><span class="ot"> ::</span> <span class="dt">IntList</span></span></code></pre></div>
516+<div class="sourceCode" id="cb90"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb90-1"><a href="#cb90-1"></a><span class="ot">nums ::</span> <span class="dt">IntList</span></span>
517+<span id="cb90-2"><a href="#cb90-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>
518+<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="fu">sum</span><span class="ot"> ::</span> <span class="dt">IntList</span> <span class="ot">-&gt;</span> <span class="dt">Int</span></span></code></pre></div>
519+<div class="sourceCode" id="cb92"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb92-1"><a href="#cb92-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>
520+<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="fu">sum</span> <span class="dt">Nil</span> <span class="ot">=</span> <span class="dv">0</span></span>
521+<span id="cb93-2"><a href="#cb93-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>
522+<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="fu">sum</span> nums</span>
523+<span id="cb94-2"><a href="#cb94-2"></a><span class="co">-- 6</span></span></code></pre></div>
524+</section>
525+<section class="slide level1">
526+
527+<div class="sourceCode" id="cb95"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb95-1"><a href="#cb95-1"></a><span class="fu">take</span><span class="ot"> ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">IntList</span> <span class="ot">-&gt;</span> <span class="dt">IntList</span></span></code></pre></div>
528+<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="fu">take</span> _ <span class="dt">Nil</span> <span class="ot">=</span> <span class="dt">Nil</span></span>
529+<span id="cb96-2"><a href="#cb96-2"></a><span class="fu">take</span> <span class="dv">0</span> _ <span class="ot">=</span> <span class="dt">Nil</span></span>
530+<span id="cb96-3"><a href="#cb96-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>
531+<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="ot">nums ::</span> <span class="dt">IntList</span></span>
532+<span id="cb97-2"><a href="#cb97-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>
533+<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">take</span> <span class="dv">2</span> nums</span>
534+<span id="cb98-2"><a href="#cb98-2"></a><span class="co">-- Cons 1 (Cons 2 Nil)</span></span>
535+<span id="cb98-3"><a href="#cb98-3"></a><span class="fu">take</span> <span class="dv">1029</span> nums</span>
536+<span id="cb98-4"><a href="#cb98-4"></a><span class="co">-- Cons 1 (Cons 2 (Cons 3 Nil))</span></span>
537+<span id="cb98-5"><a href="#cb98-5"></a><span class="fu">take</span> <span class="dv">0</span> nums</span>
538+<span id="cb98-6"><a href="#cb98-6"></a><span class="co">-- Nil</span></span></code></pre></div>
539+</section>
540+<section class="slide level1">
541+
542+<div class="sourceCode" id="cb99"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb99-1"><a href="#cb99-1"></a><span class="fu">repeat</span><span class="ot"> ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> <span class="dt">IntList</span></span></code></pre></div>
543+<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">repeat</span> n <span class="ot">=</span> <span class="dt">Cons</span> n (<span class="fu">repeat</span> n)</span></code></pre></div>
544+<div class="sourceCode" id="cb101"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb101-1"><a href="#cb101-1"></a><span class="fu">repeat</span> <span class="dv">8</span></span>
545+<span id="cb101-2"><a href="#cb101-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>
546+<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="dv">3</span> <span class="op">.</span> <span class="fu">repeat</span>) <span class="dv">8</span></span>
547+<span id="cb102-2"><a href="#cb102-2"></a><span class="co">-- Cons 8 (Cons 8 (Cons 8 Nil))</span></span></code></pre></div>
548+<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="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>
549+<span id="cb103-2"><a href="#cb103-2"></a><span class="co">-- 24</span></span></code></pre></div>
550+</section>
551+<section class="slide level1">
552+
553+<table width="100%">
554+<tr>
555+<td>
556+Наша самодеятельность
557+</td>
558+<td>
559+В стандартной библиотеке
560+</td>
561+</tr>
562+<tr class="fragment">
563+<td>
564+<div class="sourceCode" id="cb104"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb104-1"><a href="#cb104-1"></a> <span class="dt">IntList</span></span></code></pre></div>
565+</td>
566+<td>
567+<div class="sourceCode" id="cb105"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb105-1"><a href="#cb105-1"></a> [<span class="dt">Int</span>]</span></code></pre></div>
568+</td>
569+</tr>
570+<tr class="fragment">
571+<td>
572+<div class="sourceCode" id="cb106"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb106-1"><a href="#cb106-1"></a> <span class="dt">IntList</span></span></code></pre></div>
573+</td>
574+<td>
575+<div class="sourceCode" id="cb107"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb107-1"><a href="#cb107-1"></a> [<span class="dt">Int</span>]</span></code></pre></div>
576+</td>
577+</tr>
578+<tr class="fragment">
579+<td>
580+<div class="sourceCode" id="cb108"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb108-1"><a href="#cb108-1"></a> <span class="dt">Nil</span></span></code></pre></div>
581+</td>
582+<td>
583+<div class="sourceCode" id="cb109"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb109-1"><a href="#cb109-1"></a> []</span></code></pre></div>
584+</td>
585+</tr>
586+<tr class="fragment">
587+<td>
588+<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">Cons</span></span></code></pre></div>
589+</td>
590+<td>
591+<div class="sourceCode" id="cb111"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb111-1"><a href="#cb111-1"></a> <span class="op">:</span></span></code></pre></div>
592+</td>
593+</tr>
594+<tr class="fragment">
595+<td>
596+<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">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>
597+</td>
598+<td>
599+<div class="sourceCode" id="cb113"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb113-1"><a href="#cb113-1"></a> <span class="dv">3</span> <span class="op">:</span> <span class="dv">4</span> <span class="op">:</span> []</span></code></pre></div>
600+<div class="sourceCode" id="cb114"><pre class="sourceCode fragment haskell"><code class="sourceCode haskell"><span id="cb114-1"><a href="#cb114-1"></a> [<span class="dv">3</span>, <span class="dv">4</span>]</span></code></pre></div>
601+</td>
602+</tr>
603+</table>
604+</section>
605+<section class="slide level1">
606+
607+<p><code>repeat</code>, <code>sum</code> и <code>take</code> тоже есть в стандартной библиотеке.</p>
608+</section>
609+<section id="quicksort" class="slide level1">
610+<h1>QuickSort</h1>
611+</section>
612+<section class="slide level1">
613+
614+<div class="sourceCode" id="cb115"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb115-1"><a href="#cb115-1"></a><span class="ot">quicksort ::</span> [<span class="dt">Int</span>] <span class="ot">-&gt;</span> [<span class="dt">Int</span>]</span></code></pre></div>
615+<div class="sourceCode" id="cb116"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb116-1"><a href="#cb116-1"></a>quicksort (x<span class="op">:</span>xs) <span class="ot">=</span></span>
616+<span id="cb116-2"><a href="#cb116-2"></a> quicksort smaller <span class="op">++</span> [x] <span class="op">++</span> quicksort larger</span>
617+<span id="cb116-3"><a href="#cb116-3"></a> <span class="kw">where</span></span>
618+<span id="cb116-4"><a href="#cb116-4"></a> smaller <span class="ot">=</span> <span class="fu">filter</span> (<span class="op">&lt;</span> x) xs</span>
619+<span id="cb116-5"><a href="#cb116-5"></a> larger <span class="ot">=</span> <span class="fu">filter</span> (<span class="op">&gt;=</span> x) xs</span></code></pre></div>
620+</section>
621+<section class="slide level1">
622+
623+<div class="sourceCode" id="cb117"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb117-1"><a href="#cb117-1"></a><span class="fu">filter</span><span class="ot"> ::</span> (<span class="dt">Bool</span> <span class="ot">-&gt;</span> <span class="dt">Int</span>) <span class="ot">-&gt;</span> [<span class="dt">Int</span>] <span class="ot">-&gt;</span> [<span class="dt">Int</span>]</span></code></pre></div>
624+<div class="sourceCode" id="cb118"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb118-1"><a href="#cb118-1"></a><span class="fu">filter</span> f (x<span class="op">:</span>xs) <span class="ot">=</span></span>
625+<span id="cb118-2"><a href="#cb118-2"></a> <span class="kw">if</span> f x</span>
626+<span id="cb118-3"><a href="#cb118-3"></a> <span class="kw">then</span> <span class="fu">filter</span> f xs</span>
627+<span id="cb118-4"><a href="#cb118-4"></a> <span class="kw">else</span> x<span class="op">:</span>(<span class="fu">filter</span> f xs)</span></code></pre></div>
628+<div class="sourceCode" id="cb119"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb119-1"><a href="#cb119-1"></a><span class="fu">filter</span> _ [] <span class="ot">=</span> []</span>
629+<span id="cb119-2"><a href="#cb119-2"></a><span class="fu">filter</span> f (x<span class="op">:</span>xs) <span class="ot">=</span></span>
630+<span id="cb119-3"><a href="#cb119-3"></a> <span class="kw">if</span> f x</span>
631+<span id="cb119-4"><a href="#cb119-4"></a> <span class="kw">then</span> <span class="fu">filter</span> f xs</span>
632+<span id="cb119-5"><a href="#cb119-5"></a> <span class="kw">else</span> x<span class="op">:</span>(<span class="fu">filter</span> f xs)</span></code></pre></div>
633+</section>
634+<section class="slide level1">
635+
636+<div class="sourceCode" id="cb120"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb120-1"><a href="#cb120-1"></a><span class="ot">quicksort ::</span> [<span class="dt">Int</span>] <span class="ot">-&gt;</span> [<span class="dt">Int</span>]</span>
637+<span id="cb120-2"><a href="#cb120-2"></a>quicksort (x<span class="op">:</span>xs) <span class="ot">=</span></span>
638+<span id="cb120-3"><a href="#cb120-3"></a> quicksort smaller <span class="op">++</span> [x] <span class="op">++</span> quicksort larger</span>
639+<span id="cb120-4"><a href="#cb120-4"></a> <span class="kw">where</span></span>
640+<span id="cb120-5"><a href="#cb120-5"></a> smaller <span class="ot">=</span> <span class="fu">filter</span> (<span class="op">&lt;</span> x) xs</span>
641+<span id="cb120-6"><a href="#cb120-6"></a> larger <span class="ot">=</span> <span class="fu">filter</span> (<span class="op">&gt;=</span> x) xs</span>
642+<span id="cb120-7"><a href="#cb120-7"></a> <span class="fu">filter</span> _ [] <span class="ot">=</span> []</span>
643+<span id="cb120-8"><a href="#cb120-8"></a> <span class="fu">filter</span> f (x<span class="op">:</span>xs) <span class="ot">=</span></span>
644+<span id="cb120-9"><a href="#cb120-9"></a> <span class="kw">if</span> f x</span>
645+<span id="cb120-10"><a href="#cb120-10"></a> <span class="kw">then</span> <span class="fu">filter</span> f xs</span>
646+<span id="cb120-11"><a href="#cb120-11"></a> <span class="kw">else</span> x<span class="op">:</span>(<span class="fu">filter</span> f xs)</span></code></pre></div>
647+</section>
648+<section class="slide level1">
649+
650+<div class="sourceCode" id="cb121"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb121-1"><a href="#cb121-1"></a><span class="ot">quicksort ::</span> [<span class="dt">Int</span>] <span class="ot">-&gt;</span> [<span class="dt">Int</span>]</span>
651+<span id="cb121-2"><a href="#cb121-2"></a>quicksort [] <span class="ot">=</span> []</span>
652+<span id="cb121-3"><a href="#cb121-3"></a>quicksort (x<span class="op">:</span>xs) <span class="ot">=</span></span>
653+<span id="cb121-4"><a href="#cb121-4"></a> quicksort smaller <span class="op">++</span> [x] <span class="op">++</span> quicksort larger</span>
654+<span id="cb121-5"><a href="#cb121-5"></a> <span class="kw">where</span></span>
655+<span id="cb121-6"><a href="#cb121-6"></a> smaller <span class="ot">=</span> <span class="fu">filter</span> (<span class="op">&lt;</span> x) xs</span>
656+<span id="cb121-7"><a href="#cb121-7"></a> larger <span class="ot">=</span> <span class="fu">filter</span> (<span class="op">&gt;=</span> x) xs</span>
657+<span id="cb121-8"><a href="#cb121-8"></a> <span class="fu">filter</span> _ [] <span class="ot">=</span> []</span>
658+<span id="cb121-9"><a href="#cb121-9"></a> <span class="fu">filter</span> f (x<span class="op">:</span>xs) <span class="ot">=</span></span>
659+<span id="cb121-10"><a href="#cb121-10"></a> <span class="kw">if</span> f x</span>
660+<span id="cb121-11"><a href="#cb121-11"></a> <span class="kw">then</span> <span class="fu">filter</span> f xs</span>
661+<span id="cb121-12"><a href="#cb121-12"></a> <span class="kw">else</span> x<span class="op">:</span>(<span class="fu">filter</span> f xs)</span></code></pre></div>
662+<div class="sourceCode" id="cb122"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb122-1"><a href="#cb122-1"></a>quicksort [<span class="dv">2</span>, <span class="dv">1</span>, <span class="dv">3</span>, <span class="dv">4</span>]</span>
663+<span id="cb122-2"><a href="#cb122-2"></a><span class="co">-- [1, 2, 3, 4]</span></span></code></pre></div>
664+</section>
665+<section class="slide level1">
666+
667+<p><code>filter</code> тоже есть в стандартной библиотеке.</p>
668+</section>
669+<section id="где-и-как-смотреть-стандартную-библиотеку" class="slide level1">
670+<h1>Где и как смотреть “стандартную библиотеку”</h1>
671+</section>
672+<section class="slide level1">
673+
674+<ol type="1">
675+<li class="fragment"><p><a href="https://hackage.haskell.org/package/base">Hackage</a></p>
676+<p>(Там вам нужен только пакет <code>base</code>. Ссылка ведет прямо на него.) Еще если там нажать <code>s</code>, то будет поиск.</p></li>
677+<li class="fragment"><p><a href="https://hoogle.haskell.org">Hoogle</a></p>
678+<p>Это поиск по типам. Например: <code>Int -&gt; [Int] -&gt; [Int]</code> (Тут вам опять же нужен только пакет <code>base</code>. Нужно чтобы справа было "package:base".) –&gt;</p></li>
679+</ol>
680+</section>
713681 </div>
714682 </div>
715683
716− <script src="./js/reveal.js"></script>
684+ <script src="reveal.js/js/reveal.js"></script>
717685
718686 <script>
719− // More info about config & dependencies:
720− // - https://github.com/hakimel/reveal.js#configuration
721− // - https://github.com/hakimel/reveal.js#dependencies
722− Reveal.initialize({
723−
724− // Displaнес presentation control arrows
725− controls: true,
726−
727− // Help the user learn the controls by providing hints, for example by
728− // bouncing the down arrow when they first encounter a vertical slide
729− controlsTutorial: true,
730−
731− // Determines where controls appear, "edges" or "bottom-right"
732− controlsLayout: 'bottom-right',
733−
734− // Visibility rule for backwards navigation arrows; "faded", "hidden"
735− // or "visible"
736− controlsBackArrows: 'faded',
737−
738− // Display a presentation progress bar
739− progress: true,
740−
741− // Display the page number of the current slide
742− slideNumber: false,
743−
744− // Add the current slide number to the URL hash so that reloading the
745− // page/copying the URL will return you to the same slide
746− hash: true,
747−
748− // Push each slide change to the browser history. Implies `hash: true`
749− history: false,
750−
751− // Enable keyboard shortcuts for navigation
752− keyboard: true,
753−
754− // Enable the slide overview mode
755− overview: true,
756−
757− // Vertical centering of slides
758− center: true,
759−
760− // Enables touch navigation on devices with touch input
761− touch: true,
762−
763− // Loop the presentation
764− loop: false,
765−
766− // Change the presentation direction to be RTL
767− rtl: false,
768−
769− // See https://github.com/hakimel/reveal.js/#navigation-mode
770− navigationMode: 'linear',
771−
772− // Randomizes the order of slides each time the presentation loads
773− shuffle: false,
774−
775− // Turns fragments on and off globally
776− fragments: true,
777−
778− // Flags whether to include the current fragment in the URL,
779− // so that reloading brings you to the same fragment position
780− fragmentInURL: true,
781−
782− // Flags if the presentation is running in an embedded mode,
783− // i.e. contained within a limited portion of the screen
784− embedded: false,
785−
786− // Flags if we should show a help overlay when the questionmark
787− // key is pressed
788− help: true,
789−
790− // Flags if speaker notes should be visible to all viewers
791− showNotes: false,
792−
793− // Global override for autoplaying embedded media (video/audio/iframe)
794− // - null: Media will only autoplay if data-autoplay is present
795− // - true: All media will autoplay, regardless of individual setting
796− // - false: No media will autoplay, regardless of individual setting
797− autoPlayMedia: null,
798−
799− // Global override for preloading lazy-loaded iframes
800− // - null: Iframes with data-src AND data-preload will be loaded when within
801− // the viewDistance, iframes with only data-src will be loaded when visible
802− // - true: All iframes with data-src will be loaded when within the viewDistance
803− // - false: All iframes with data-src will be loaded only when visible
804− preloadIframes: null,
805−
806− // Number of milliseconds between automatically proceeding to the
807− // next slide, disabled when set to 0, this value can be overwritten
808− // by using a data-autoslide attribute on your slides
809− autoSlide: 0,
810−
811− // Stop auto-sliding after user input
812− autoSlideStoppable: true,
813−
814− // Use this method for navigation when auto-sliding
815− autoSlideMethod: Reveal.navigateNext,
816−
817− // Specify the average time in seconds that you think you will spend
818− // presenting each slide. This is used to show a pacing timer in the
819− // speaker view
820− defaultTiming: 120,
821−
822− // Enable slide navigation via mouse wheel
823− mouseWheel: false,
824−
825− // Hide cursor if inactive
826− hideInactiveCursor: true,
827−
828− // Time before the cursor is hidden (in ms)
829− hideCursorTime: 5000,
830−
831− // Hides the address bar on mobile devices
832− hideAddressBar: true,
833−
834− // Opens links in an iframe preview overlay
835− // Add `data-preview-link` and `data-preview-link="false"` to customise each link
836− // individually
837− previewLinks: false,
838−
839− // Transition style
840− transition: 'slide', // none/fade/slide/convex/concave/zoom
841−
842− // Transition speed
843− transitionSpeed: 'default', // default/fast/slow
844−
845− // Transition style for full page slide backgrounds
846− backgroundTransition: 'fade', // none/fade/slide/convex/concave/zoom
847−
848− // Number of slides away from the current that are visible
849− viewDistance: 3,
850−
851− // Parallax background image
852− parallaxBackgroundImage: '', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'"
853−
854− // Parallax background size
855− parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px"
856−
857− // Number of pixels to move the parallax background per slide
858− // - Calculated automatically unless specified
859− // - Set to 0 to disable movement along an axis
860− parallaxBackgroundHorizontal: null,
861− parallaxBackgroundVertical: null,
862−
863− // The display mode that will be used to show slides
864− display: 'block',
865−
866− pdfSeparateFragments: false,
867−
868− defaultTiming: null,
869−
870− markdown: {
871− smartypants: true
872− },
873−
874−
875− dependencies: [
876− { src: './plugin/markdown/marked.js' },
877− { src: './plugin/markdown/markdown.js' },
878− { src: './plugin/zoom-js/zoom.js', async: true },
879− { src: './plugin/notes/notes.js', async: true },
880− { src: './plugin/highlight/highlight.js', async: true }
881− ]
882−
883− });
884− </script>
885−</body>
886687
688+ // Full list of configuration options available at:
689+ // https://github.com/hakimel/reveal.js#configuration
690+ Reveal.initialize({
691+ // Push each slide change to the browser history
692+ history: true,
693+
694+ // Optional reveal.js plugins
695+ dependencies: [
696+ { src: 'reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } },
697+ { src: 'reveal.js/plugin/zoom-js/zoom.js', async: true },
698+ { src: 'reveal.js/plugin/notes/notes.js', async: true }
699+ ]
700+ });
701+ </script>
702+ </body>
887703</html>
1.mdnew file+974
@@ -0,0 +1,974 @@
1+---
2+theme: superblack
3+author: Ilya Kostyuchenko
4+---
5+
6+# Функциональное программирование
7+
8+
9+:::{.notes}
10+Функциональное программирование это не про использование map filter
11+reduce. Функциональное программирование это вообще ортогонально к ооп.
12+ИМХО проблема с ООП -- наследование (которое тоже ортогонально к ООП)
13+-- нет разграничения между абстракцией и реализацией. и вообще
14+обзывание это функциональным программированием -- не совсем правильно.
15+то, что мы сейчас будем пытаться сделать -- сделать код более
16+переиспользуемым. сделать наши данные максимально тупыми =>
17+переиспользуемыми. пытаться комбинировать слишком умные куски -- не
18+получится -- слишком сложно. мы хотим сделать простые куски, которые
19+просто комбинировать и еще чтобы компилятор проверял эти наши комбинации
20+на валидность.
21+:::
22+
23+---
24+
25+Функциональное программирование:
26+
27+> функции -- это тоже данные.
28+
29+`Int -> Bool` (функция) -- ровно такие же данные как и `Int`. Их также
30+можно складывать в структуры, передавать как аргументы и т. п.
31+
32+---
33+
34+# нотация
35+
36+---
37+
38+<table width="100%">
39+ <tr>
40+ <td>
41+ ```java
42+ int x;
43+ ```
44+ </td>
45+ <td>
46+ ```haskell
47+ x :: Int
48+ ```
49+ </td>
50+ </tr>
51+ <tr class="fragment">
52+ <td>
53+ ```java
54+ int f(int x)
55+ ```
56+ </td>
57+ <td>
58+ ```haskell
59+ f :: Int -> Int
60+ ```
61+ </td>
62+ </tr>
63+ <tr class="fragment">
64+ <td>
65+ ```java
66+ static <T> T f(T x)
67+ ```
68+ </td>
69+ <td>
70+ ```haskell
71+ f :: a -> a
72+ ```
73+ </td>
74+ </tr>
75+</table>
76+
77+---
78+
79+<table width="100%">
80+ <tr>
81+ <td>
82+ ```java
83+ static <T> T f(T x)
84+ ```
85+ </td>
86+ <td>
87+ ```haskell
88+ f :: a -> a
89+ ```
90+ </td>
91+ </tr>
92+ <tr>
93+ <td class="fragment">
94+ ```java
95+ f(x);
96+ ```
97+ </td>
98+ <td class="fragment">
99+ ```haskell
100+ f x
101+ ```
102+ </td>
103+ </tr>
104+ <tr class="fragment">
105+ <td>
106+ ```java
107+ f(x, y);
108+ ```
109+ </td>
110+ <td>
111+ ```{.fragment .haskell}
112+ f x y
113+ ```
114+
115+ ```{.fragment .haskell}
116+ f x y = (f x) y
117+ ```
118+ </td>
119+ </td>
120+ </tr>
121+</table>
122+
123+:::{.notes}
124+Left-associative
125+Currying
126+:::
127+
128+---
129+
130+<table width="100%">
131+ <tr>
132+ <td>
133+ ```java
134+ static <T> T f(T x)
135+ static <T> T g(T x)
136+ ```
137+ </td>
138+ <td>
139+ ```haskell
140+ f :: a -> a
141+ g :: a -> a
142+ ```
143+ </td>
144+ </tr>
145+ <tr>
146+ <td class="fragment">
147+ ```java
148+ f(g(x));
149+ g(f(x));
150+ ```
151+ </td>
152+ <td class="fragment">
153+ ```haskell
154+ f (g x)
155+ g (f x)
156+ ```
157+ </td>
158+ </tr>
159+</table>
160+
161+---
162+
163+# Композиция
164+
165+---
166+
167+```haskell
168+f :: a -> a
169+g :: a -> a
170+```
171+
172+``` {.fragment .haskell}
173+f (g x)
174+```
175+
176+``` {.fragment .haskell}
177+(f . g) x == f (g x)
178+```
179+
180+``` {.fragment .haskell}
181+h = f . g
182+h x == f (g x)
183+```
184+
185+---
186+
187+```haskell
188+f :: a -> a
189+g :: a -> a
190+```
191+
192+```haskell
193+h :: a -> a
194+h = f . g
195+```
196+
197+### моноид {#моноид .fragment}
198+
199+:::{.notes}
200+моноид -- у тебя есть две штуки одного типа и ты можешь получить еще
201+одну штуку такого же типа. Это очень простой способ рождения сложности
202+из простоты причем тип h выводится из определения. Нам его указывать не
203+надо. если у нас изначальные маленькие кусочки хорошо описаны, то
204+порожденные большие кусочки будут автоматически хорошо описанными.
205+:::
206+
207+---
208+
209+## Моноид
210+
211+[Бинарная асоциативная операция]{.fragment}
212+
213+```{.fragment .haskell}
214+(.) :: (a -> a) -> (a -> a) -> (a -> a)
215+```
216+
217+[Нейтральный элемент]{.fragment}
218+
219+```{.fragment .haskell}
220+id :: a -> a
221+id x = x
222+```
223+
224+---
225+
226+# Haskell
227+
228+---
229+
230+### Чисто функционаьлный
231+
232+Все что функция может сделать -- посмотреть на свои аргументы это
233+вернуть значение.
234+
235+:::{.notes}
236+Нельзя просто произвольно распечатать строку в консоль, нельзя просто
237+произвольно отправить запрос на бд, нельзя просто произвольно изменить
238+глобальную переменную.
239+:::
240+
241+---
242+
243+### Referential transparency
244+
245+##### (Любую константу можно заменить на само значение)
246+
247+```{.java .fragment}
248+int x = 8;
249+int y = x++;
250+System.out.println(y + " might be the same as " + y);
251+```
252+
253+```{.java .fragment}
254+int x = 8;
255+System.out.println(x++ + " might be the same as " + x++);
256+```
257+
258+:::notes
259+Сильно упрощает рефакторинг и понимание кода.
260+:::
261+
262+---
263+
264+### Нет переменных, циклов и условных переходов
265+
266+[Зато есть константы и нормальная рекурсия (А переходов вообще нет)]{.fragment}
267+
268+---
269+
270+### Очень ленивый
271+
272+```{.haskell .fragment}
273+xs = [4, 1, 3, 2]
274+xs' = sort xs
275+print xs
276+```
277+
278+:::fragment
279+`xs'` не нужен чтобы распечатать `xs`, поэтому сортироваться ничто
280+не будет. (Зачем делать то, что можно не делать)
281+:::
282+
283+---
284+
285+Если хотите быстро и просто потыкаться, тут есть интерктивная штука:
286+
287+[haskell.org](https://www.haskell.org)
288+
289+---
290+
291+# Синтаксис
292+
293+---
294+
295+# Функции
296+
297+---
298+
299+```{ .haskell }
300+add2 :: Int -> Int
301+add2 x = x + 2
302+````
303+
304+Все функции и константы всегда обозначаются словами с маленькой буквы
305+без пробелов.
306+
307+(Константы это просто функции с нулем аргументов.)
308+
309+---
310+
311+## Pattern mathcing
312+
313+```haskell
314+fixBuz :: Int -> String
315+divide8 3 = "Fiz"
316+divide8 5 = "Buz"
317+divide8 15 = "FizBuz"
318+divide8 _ = "Some other number"
319+```
320+
321+Так матчить можно произвольные структуры произвольного уровня
322+вложенности.
323+
324+`_` -- специальное название константы, которое говорит
325+что вам все равно что в ней лежит.
326+
327+:::notes
328+функции объявляются в несколькро строк. Первая -- обьявленик типа
329+функции, а последубщие -- реализация. В общем случае тип можно не
330+указывать, но указывать тип у высказыванй на самом верхнем уровне (не
331+вложенные) считается хорошим тоном и улучшает выведение типов и ошибки
332+компиляции. У функции может быть несколько реализаций: какая из них
333+вызовется зависит от значений передаваемых аргументов. матчинг
334+произхводится сверху вниз. если в аргемантах написано слово с маленькой
335+буквы, то значение аргумента биндится на эту константу.
336+:::
337+
338+---
339+
340+## Структуры
341+
342+---
343+
344+```haskell
345+data Foo = Bar
346+foo :: Bar
347+foo = Bar
348+```
349+
350+`Foo` -- тип структуры. `Bar` -- конструктор структуры.
351+
352+Тут у `Foo` всего одно значение `Bar`.
353+
354+---
355+
356+## Произведение типов
357+
358+##### (обычные поля структур)
359+
360+:::notes
361+После констрктора можно укзать существующие типы, которые в нем
362+храняться.
363+:::
364+
365+```haskell
366+data PersonType = Person String Int
367+```
368+
369+```{.haskell .fragment}
370+vasya :: PersonType
371+vasya = Person "Vasya" 8
372+-- тип можно не укзывать
373+petya = Person "Petya" 5
374+```
375+
376+```{.haskell .fragment}
377+getName :: PersonType -> String
378+getName (Person name _) = name
379+```
380+
381+```{.haskell .fragment}
382+greetPerson :: PersonType -> String
383+greetPerson p = "Hello, " ++ getName p
384+```
385+
386+```{.haskell .fragment}
387+greetPerson petya
388+-- "Hello, Petya"
389+```
390+
391+---
392+
393+## Еще немного функций
394+
395+```{ .haskell .fragment }
396+greetPerson :: PersonType -> String
397+greetPerson p = "Hello, " ++ getName p
398+```
399+
400+```{.fragment .haskell }
401+greetPerson :: PersonType -> String
402+greetPerson p = "Hello, " ++ name
403+ where
404+ name = getName p
405+```
406+
407+```{.fragment .haskell }
408+greetPerson :: PersonType -> String
409+greetPerson p = "Hello, " ++ name
410+ where
411+ getName' (Person name _) = name
412+ name = getName' p
413+```
414+
415+---
416+
417+```{ .haskell }
418+data PersonType = Person String Int
419+
420+getName :: PersonType -> String
421+getName (Person name _) = name
422+```
423+
424+```{.fragment .haskell }
425+greetName :: String -> String
426+greetName name = "Hello, " ++ name
427+```
428+
429+```{.fragment .haskell }
430+greetPerson :: PersonType -> String
431+greetPerson p = greetName (getName p)
432+```
433+
434+```{.fragment .haskell }
435+greetPerson :: PersonType -> String
436+greetPerson = greetName . getName
437+```
438+
439+```{.fragment .haskell }
440+greetPerson petya
441+-- "Hello, Petya"
442+```
443+
444+```{.fragment .haskell }
445+(greetName . getName) petya
446+-- "Hello, Petya"
447+```
448+
449+---
450+
451+## Суммы типов
452+
453+:::notes
454+Функции нескольких аргументов -- странный синтаксис -- потом расскажу. А пока используем тюпли!
455+:::
456+
457+```{ .fragment .haskell }
458+data Bool = False | True
459+```
460+
461+```{ .fragment .haskell }
462+x :: Bool
463+x = True
464+y = False
465+```
466+
467+```{ .fragment .haskell }
468+ifThenElse :: (Bool, a, a) -> a
469+```
470+
471+```{ .fragment .haskell }
472+ifThenElse (True, a, _) = a
473+ifThenElse (False, _, b) = b
474+```
475+
476+```{ .fragment .haskell }
477+ifThenElse (True, "Hello", "World")
478+-- "Hello"
479+```
480+
481+```{ .fragment .haskell }
482+ifThenElse (False, "Hello", "World")
483+-- "World"
484+```
485+
486+---
487+
488+```{ .fragment .haskell }
489+data CircleType = Circle Double Double Double
490+data RectangleType = Rectangle Double Double Double Double
491+```
492+
493+```{ .fragment .haskell }
494+data Shape =
495+ CircleShape CircleType | RectangleShape RectangleType
496+```
497+
498+```{ .fragment .haskell }
499+surface :: Shape -> Double
500+```
501+
502+```{ .fragment .haskell }
503+surface (CircleShape (Circle _ _ r)) =
504+ pi * r ^ 2
505+```
506+
507+```{ .fragment .haskell }
508+surface (RectangleShape (Rectangle x1 y1 x2 y2)) =
509+ (abs (x2 - x1)) * (abs (y2 - y1))
510+```
511+
512+```{ .fragment .haskell }
513+shape = CircleShape (Circle 0 0 2)
514+surface shape
515+-- 12.566370614359172
516+```
517+
518+```{ .fragment .haskell }
519+otherShape = RectangleShape (Rectangle 1 2 3 4)
520+surface otherShape
521+-- 4.0
522+```
523+
524+---
525+
526+# И еще немного функций
527+
528+---
529+
530+## Лямбда-выражения
531+
532+```{ .haskell .fragment }
533+add8 :: Int -> Int
534+```
535+
536+```{ .haskell .fragment }
537+add8 x = x + 8
538+```
539+
540+```{ .haskell .fragment }
541+add8 = \x -> x + 8
542+```
543+
544+[λ -- `\` (λ печатать тяжело)]{.fragment}
545+
546+```{ .haskell .fragment }
547+foo :: (Int -> Int) -> Int
548+```
549+
550+```{ .haskell .fragment }
551+foo add8
552+```
553+
554+```{ .haskell .fragment }
555+foo (\x -> x + 8)
556+```
557+
558+---
559+
560+### Давайте придумаем синтаксис для функции нескольких аргументов!
561+
562+---
563+
564+```{ .haskell }
565+x, y :: Int
566+x = 42
567+y = 69
568+```
569+
570+```{ .haskell .fragment }
571+xPlusY :: Int
572+xPlusY = add x y
573+```
574+
575+[Применение функции -- лево-ассоциативно]{.fragment}
576+
577+```{ .haskell .fragment }
578+xPlusY = (add x) y
579+```
580+
581+```{ .haskell .fragment }
582+xPlusY = f y
583+f = add x
584+```
585+
586+```{ .haskell .fragment }
587+f :: Int -> Int
588+```
589+
590+```{ .haskell .fragment }
591+add :: Int -> (Int -> Int)
592+```
593+
594+---
595+
596+```{ .haskell }
597+add :: Int -> (Int -> Int)
598+```
599+
600+[Тип `->` -- право-ассоциативный]{.fragment}
601+
602+```{ .haskell .fragment }
603+add :: Int -> Int -> Int
604+```
605+
606+```{ .haskell .fragment }
607+add a b = a + b
608+```
609+
610+```{ .haskell .fragment }
611+add = \a b -> a + b
612+```
613+
614+---
615+
616+Любая функция берет строго один аргумент.
617+
618+Функция нескольких аргументов все равно берет строго одтн аргумент и
619+возвращает функцию, которая берет следйющий.
620+
621+*(И из-за того, что применение функции лево-ассоциативно, вызов таких не
622+трубует особого синтаксиса.)*
623+
624+---
625+
626+### Currying
627+
628+```{ .haskell .fragment }
629+add :: Int -> Int -> Int
630+add a b = a + b
631+```
632+
633+```{ .haskell .fragment }
634+add8 :: Int -> Int
635+```
636+
637+```{ .haskell .fragment }
638+add :: Int -> (Int -> Int)
639+```
640+
641+```{ .haskell .fragment }
642+add8 = add 8
643+```
644+
645+```{ .haskell .fragment }
646+add8 3
647+-- 11
648+```
649+
650+---
651+
652+### Funny fact
653+
654+[Оператор (например `+`) -- функция, название которой не содержит буквы и цифры.]{.fragment}
655+
656+```{ .haskell .fragment }
657+x +&+ y = x + y
658+```
659+
660+```{ .haskell .fragment }
661+8 +&+ 9
662+-- 17
663+```
664+
665+---
666+
667+### Funny fact 2
668+
669+[Оператор можно превратить в функцию, окружив его скобками.]{.fragment}
670+
671+```{ .haskell .fragment }
672+add :: Int -> Int -> Int
673+add x y = x + y
674+```
675+
676+```{ .haskell .fragment }
677+add = (+&+)
678+```
679+
680+```{ .haskell .fragment }
681+add = (+)
682+```
683+
684+---
685+
686+### Funny fact 3
687+
688+[Функцию можно превратить в оператор, окружив ее обратными кавычками.]{.fragment}
689+
690+
691+```{ .haskell .fragment }
692+add :: Int -> Int -> Int
693+add x y = x + y
694+```
695+
696+```{ .haskell .fragment }
697+add 8 9
698+-- 17
699+```
700+
701+```{ .haskell .fragment }
702+8 `add` 9
703+-- 17
704+```
705+
706+---
707+
708+# Список
709+
710+---
711+
712+### Односвязный список
713+
714+```{ .haskell .fragment }
715+data IntList = Cons Int IntList | Nil
716+```
717+
718+```{ .haskell .fragment }
719+Cons :: Int -> IntList -> IntList
720+Nil :: IntList
721+```
722+
723+```{ .haskell .fragment }
724+nums :: IntList
725+nums = 1 `Cons` (2 `Cons` (3 `Cons` Nil))
726+```
727+
728+```{ .haskell .fragment }
729+sum :: IntList -> Int
730+```
731+
732+```{ .haskell .fragment }
733+sum (Cons x xs) = x + sum xs
734+```
735+
736+```{ .haskell .fragment }
737+sum Nil = 0
738+sum (Cons x xs) = x + sum xs
739+```
740+
741+```{ .haskell .fragment }
742+sum nums
743+-- 6
744+```
745+
746+---
747+
748+```{ .haskell }
749+take :: Int -> IntList -> IntList
750+```
751+
752+```{ .haskell .fragment }
753+take _ Nil = Nil
754+take 0 _ = Nil
755+take n (Cons x xs) = Cons x (take (n - 1) xs)
756+```
757+
758+```{ .haskell .fragment }
759+nums :: IntList
760+nums = 1 `Cons` (2 `Cons` (3 `Cons` Nil))
761+```
762+
763+```{ .haskell .fragment }
764+take 2 nums
765+-- Cons 1 (Cons 2 Nil)
766+take 1029 nums
767+-- Cons 1 (Cons 2 (Cons 3 Nil))
768+take 0 nums
769+-- Nil
770+```
771+
772+---
773+
774+```{ .haskell }
775+repeat :: Int -> IntList
776+```
777+
778+```{ .haskell .fragment }
779+repeat n = Cons n (repeat n)
780+```
781+
782+```{ .haskell .fragment }
783+repeat 8
784+-- Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (...
785+```
786+
787+```{ .haskell .fragment }
788+(take 3 . repeat) 8
789+-- Cons 8 (Cons 8 (Cons 8 Nil))
790+```
791+
792+```{ .haskell .fragment }
793+(sum . take 3 . repeat) 8
794+-- 24
795+```
796+
797+---
798+
799+<table width="100%">
800+ <tr>
801+ <td>
802+ Наша самодеятельность
803+ </td>
804+ <td>
805+ В стандартной библиотеке
806+ </td>
807+ </tr>
808+ <tr class="fragment">
809+ <td>
810+ ```haskell
811+ IntList
812+ ```
813+ </td>
814+ <td>
815+ ```haskell
816+ [Int]
817+ ```
818+ </td>
819+ </tr>
820+ <tr class="fragment">
821+ <td>
822+ ```haskell
823+ IntList
824+ ```
825+ </td>
826+ <td>
827+ ```haskell
828+ [Int]
829+ ```
830+ </td>
831+ </tr>
832+ <tr class="fragment">
833+ <td>
834+ ```haskell
835+ Nil
836+ ```
837+ </td>
838+ <td>
839+ ```haskell
840+ []
841+ ```
842+ </td>
843+ </tr>
844+ <tr class="fragment">
845+ <td>
846+ ```haskell
847+ Cons
848+ ```
849+ </td>
850+ <td>
851+ ```haskell
852+ :
853+ ```
854+ </td>
855+ </tr>
856+ <tr class="fragment">
857+ <td>
858+ ```haskell
859+ Cons 3 (Cons 4 Nil)
860+ ```
861+ </td>
862+ <td>
863+ ``` {.fragment .haskell }
864+ 3 : 4 : []
865+ ```
866+
867+ ``` {.fragment .haskell }
868+ [3, 4]
869+```
870+ </td>
871+ </tr>
872+</table>
873+
874+---
875+
876+`repeat`, `sum` и `take` тоже есть в стандартной библиотеке.
877+
878+---
879+
880+# QuickSort
881+
882+---
883+
884+```{ .haskell }
885+quicksort :: [Int] -> [Int]
886+```
887+
888+```{ .haskell .fragment}
889+quicksort (x:xs) =
890+ quicksort smaller ++ [x] ++ quicksort larger
891+ where
892+ smaller = filter (< x) xs
893+ larger = filter (>= x) xs
894+```
895+
896+---
897+
898+```{ .haskell }
899+filter :: (Bool -> Int) -> [Int] -> [Int]
900+```
901+
902+```{ .haskell .fragment}
903+filter f (x:xs) =
904+ if f x
905+ then filter f xs
906+ else x:(filter f xs)
907+```
908+
909+```{ .haskell .fragment}
910+filter _ [] = []
911+filter f (x:xs) =
912+ if f x
913+ then filter f xs
914+ else x:(filter f xs)
915+```
916+
917+---
918+
919+```{ .haskell }
920+quicksort :: [Int] -> [Int]
921+quicksort (x:xs) =
922+ quicksort smaller ++ [x] ++ quicksort larger
923+ where
924+ smaller = filter (< x) xs
925+ larger = filter (>= x) xs
926+ filter _ [] = []
927+ filter f (x:xs) =
928+ if f x
929+ then filter f xs
930+ else x:(filter f xs)
931+```
932+
933+---
934+
935+```{ .haskell }
936+quicksort :: [Int] -> [Int]
937+quicksort [] = []
938+quicksort (x:xs) =
939+ quicksort smaller ++ [x] ++ quicksort larger
940+ where
941+ smaller = filter (< x) xs
942+ larger = filter (>= x) xs
943+ filter _ [] = []
944+ filter f (x:xs) =
945+ if f x
946+ then filter f xs
947+ else x:(filter f xs)
948+```
949+
950+```{ .haskell .fragment}
951+quicksort [2, 1, 3, 4]
952+-- [1, 2, 3, 4]
953+```
954+
955+---
956+
957+`filter` тоже есть в стандартной библиотеке.
958+
959+---
960+
961+# Где и как смотреть "стандартную библиотеку"
962+
963+---
964+
965+1. [Hackage](https://hackage.haskell.org/package/base)
966+
967+ (Там вам нужен только пакет `base`. Ссылка ведет прямо на него.)
968+ Еще если там нажать `s`, то будет поиск.
969+
970+2. [Hoogle](https://hoogle.haskell.org)
971+
972+ Это поиск по типам. Например: `Int -> [Int] -> [Int]` (Тут
973+ вам опять же нужен только пакет `base`. Нужно чтобы справа было
974+ \"package:base\".) -->
1_old.htmlnew file+887
@@ -0,0 +1,887 @@
1+<!doctype html>
2+<html>
3+
4+<head>
5+ <meta charset="utf-8">
6+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
7+
8+ <link rel="stylesheet" href="css/reset.css">
9+ <link rel="stylesheet" href="css/reveal.css">
10+ <link rel="stylesheet" href="css/theme/superblack.css">
11+
12+ <!-- Theme used for syntax highlighting of code -->
13+ <link rel="stylesheet" href="lib/css/monokai.css">
14+
15+ <!-- Printing and PDF exports -->
16+ <script>
17+ var link = document.createElement('link');
18+ link.rel = 'stylesheet';
19+ link.type = 'text/css';
20+ link.href = window.location.search.match(/print-pdf/gi) ? 'css/print/pdf.css' : 'css/print/paper.css';
21+ document.getElementsByTagName('head')[0].appendChild(link);
22+ </script>
23+</head>
24+
25+<body>
26+ <div class="reveal">
27+ <div class="slides">
28+ <section>
29+ <h2>Функциональное программирование</h2>
30+ <aside class="notes" data-markdown>
31+ Функциональное программирование это не про использование map filter reduce.
32+
33+ Функциональное программирование это вообще ортогонально к ооп.
34+
35+ ИМХО проблема с ООП -- наследование (которое тоже ортогонально к ООП) -- нет разграничения между абстракцией и
36+ реализацией.
37+
38+ и вообще обзывание это функциональным программированием -- не совсем правильно.
39+
40+ то, что мы сейчас будем пытаться сделать -- сделать код более переиспользуемым.
41+
42+ сделать наши данные максимально тупыми => переиспользуемыми.
43+
44+ пытаться комбинировать слишком умные куски -- не получится -- слишком сложно.
45+
46+ мы хотим сделать простые куски, которые просто комбинировать и еще чтобы компилятор проверял эти наши
47+ комбинации на валидность.
48+ </aside>
49+ </section>
50+ <section data-markdown>
51+ Функциональное программирование:
52+ > функции -- это тоже данные.
53+
54+ `Int -> Bool` (функция) -- ровно такие же данные как и `Int`. Их также можно складывать в структуры,
55+ передавать как аргументы и т. п.
56+ </section>
57+
58+ <section>
59+ <section>
60+ <h1>нотация</h1>
61+ </section>
62+ <section>
63+ <table width="100%">
64+ <tr>
65+ <td>
66+ <pre>
67+ <code class="java">int x;</code>
68+ </pre>
69+ </td>
70+ <td>
71+ <pre>
72+ <code class="haskell">x :: Int</code>
73+ </pre>
74+ </td>
75+ </tr>
76+ <tr class="fragment">
77+ <td>
78+ <pre>
79+ <code class="java">int f(int x)</code>
80+ </pre>
81+ </td>
82+ <td>
83+ <pre>
84+ <code class="haskell">f :: Int -> Int</code>
85+ </pre>
86+ </td>
87+ </tr>
88+ <tr class="fragment">
89+ <td>
90+ <pre>
91+ <code class="java">static &lt;T&gt; T f(T x)</code>
92+ </pre>
93+
94+ </td>
95+ <td>
96+ <pre>
97+ <code class="haskell">f :: a -> a</code>
98+ </pre>
99+ </td>
100+ </tr>
101+ </table>
102+ </section>
103+ <section>
104+ <table width="100%">
105+ <tr>
106+ <td>
107+ <pre>
108+ <code class="java">static &lt;T&gt; T f(T x)</code>
109+ </pre>
110+ </td>
111+ <td>
112+ <pre>
113+ <code class="haskell">f :: a -> a</code>
114+ </pre>
115+ </td>
116+ </tr>
117+ <tr>
118+ <td class="fragment">
119+ <pre>
120+ <code class="java">f(x);</code>
121+ </pre>
122+ </td>
123+ <td class="fragment">
124+ <pre>
125+ <code class="haskell">f x</code>
126+ </pre>
127+ </td>
128+ </tr>
129+ <tr class="fragment">
130+ <td>
131+ <pre>
132+ <code class="java">f(x, y);</code>
133+ </pre>
134+ </td>
135+ <td>
136+ <pre>
137+ <code class="haskell">f x y</code>
138+ </pre>
139+ <pre class="fragment">
140+ <code class="haskell">f x y = (f x) y</code>
141+ </pre>
142+ <aside class="notes">
143+ Left-associative
144+ Currying
145+ </aside>
146+ </td>
147+ </td>
148+ </tr>
149+ </table>
150+ </section>
151+ <section>
152+ <table width="100%">
153+ <tr>
154+ <td>
155+ <pre>
156+ <code class="java">static &lt;T&gt; T f(T x)
157+static &lt;T&gt; T g(T x)</code>
158+ </pre>
159+ </td>
160+ <td>
161+ <pre>
162+ <code class="haskell">f :: a -> a
163+g :: a -> a</code>
164+ </pre>
165+ </td>
166+ </tr>
167+ <tr class="fragment">
168+ <td>
169+ <pre>
170+ <code class="java">f(g(x));
171+g(f(x));</code>
172+ </pre>
173+ </td>
174+ <td class="fragment">
175+ <pre>
176+ <code class="haskell">f (g x)
177+g (f x)</code>
178+ </pre>
179+ </td>
180+ </tr>
181+ </table>
182+ </section>
183+ </section>
184+ <section>
185+ <section>
186+ <h1>
187+ Композиция
188+ </h1>
189+ </section>
190+ <section>
191+ <pre><code class="haskell">f :: a -> a
192+g :: a -> a</code></pre>
193+ <pre class="fragment"><code class="haskell">f (g x)</code></pre>
194+ <pre class="fragment"><code class="haskell">(f . g) x == f (g x)</code></pre>
195+ <pre class="fragment"><code class="haskell">h = f . g
196+h x == f (g x)</code></pre>
197+ </section>
198+ <section>
199+ <pre><code class="haskell">f :: a -> a
200+g :: a -> a
201+
202+h :: a -> a
203+h = f . g</code></pre>
204+
205+ <h3 class="fragment">моноид</h3>
206+
207+ <aside class="notes" data-markdown>
208+ моноид -- у тебя есть две штуки одного типа и ты можешь получить еще одну
209+ штуку такого же
210+ типа.
211+
212+ Это очень простой способ рождения сложности из простоты
213+
214+ причем тип h выводится из определения. Нам его указывать не надо.
215+
216+ если у нас изначальные маленькие кусочки хорошо описаны, то порожденные большие кусочки будут автоматически
217+ хорошо описанными.
218+ </aside>
219+ </section>
220+ <section>
221+ <h3>
222+ Моноид
223+ </h3>
224+
225+ <p class="fragment">
226+ Бинарная асоциативная операция
227+ </p>
228+
229+ <pre><code class="haskell fragment">(.) :: (a -> a) -> (a -> a) -> (a -> a)</code></pre>
230+
231+ <p class="fragment">
232+ Нейтральный элемент
233+ </p>
234+
235+ <pre><code class="haskell fragment">id :: a -> a
236+id x = x</code></pre>
237+ </section>
238+ </section>
239+ </section>
240+ <section>
241+ <section>
242+ <h2>Haskell</h2>
243+ </section>
244+ <section>
245+ <h3>Чисто функционаьлный</h3>
246+ <p class="fragment" data-markdown>Все что функция может сделать -- посмотреть на свои аргументы это вернуть
247+ значение.</p>
248+ <aside class="notes" data-markdown>Нельзя просто произвольно распечатать строку в консоль, нельзя просто
249+ произвольно
250+ отправить запрос на бд, нельзя просто произвольно изменить глобальную переменную.</aside>
251+ </section>
252+ <section>
253+ <h3>Referential transparency</h3>
254+ <h5>(Любую константу можно заменить на само значение)</h5>
255+ <pre><code class="java fragment">int x = 8;
256+int y = x++;
257+System.out.println(y + " might be the same as " + y);</code></pre>
258+ <pre><code class="java fragment">int x = 8;
259+System.out.println(x++ + " might be the same as " + x++);</code></pre>
260+
261+ <aside class="notes" data-markdown>Сильно упрощает рефакторинг и понимание кода.</aside>
262+ </section>
263+ <section>
264+ <h3>Нет переменных, циклов и условных переходов</h3>
265+
266+ <p class="fragment" data-markdown>
267+ Зато есть константы и нормальная рекурсия
268+
269+ (А переходов вообще нет)
270+ </p>
271+ </section>
272+ <section>
273+ <h3>Очень ленивый</h3>
274+
275+ <pre><code class="haskell fragment">xs = [4, 1, 3, 2]
276+xs' = sort xs
277+print xs</code></pre>
278+
279+ <p class="fragment" data-markdown>
280+ `xs'` не нужен чтобы распечатать `xs`, поэтому сортироваться ничто не будет.
281+
282+ (Зачем делать то, что можно не делать)
283+ </p>
284+ </section>
285+ <section>
286+ <p>Если хотите быстро и просто потыкаться, тут есть интерктивная штука:</p>
287+ <a href="https://www.haskell.org">haskell.org</a>
288+ </section>
289+ </section>
290+ <section>
291+ <h2>Синтаксис</h2>
292+ </section>
293+ <section>
294+ <section>
295+ <h2>Функции</h2>
296+ </section>
297+ <section>
298+ <pre><code class="haskell">add2 :: Int -> Int
299+add2 x = x + 2</code></pre>
300+ <p>Все функции и константы всегда обозначаются словами с маленькой буквы без пробелов.</p>
301+ <p>(Константы это просто функции с нулем аргументов.)</p>
302+ </section>
303+ <section>
304+ <h3>Pattern mathcing</h3>
305+ <pre><code class="haskell">fixBuz :: Int -> String
306+divide8 3 = "Fiz"
307+divide8 5 = "Buz"
308+divide8 15 = "FizBuz"
309+divide8 _ = "Some other number"</code></pre>
310+
311+ <p data-markdown>
312+ Так матчить можно произвольные структуры произвольного уровня вложенности.
313+
314+ `_` -- специальное название константы, которое говорит что вам все равно что в ней лежит.
315+ </p>
316+ <aside class="notes" data-markdown>
317+ функции объявляются в несколькро строк. Первая -- обьявленик типа функции,
318+ а последубщие -- реализация. В общем случае тип можно не указывать, но указывать тип у высказыванй на самом
319+ верхнем уровне (не вложенные) считается хорошим тоном и улучшает выведение типов и ошибки компиляции.
320+
321+ У функции может быть несколько реализаций: какая из них вызовется зависит от значений передаваемых
322+ аргументов. матчинг произхводится сверху вниз.
323+
324+ если в аргемантах написано слово с маленькой буквы, то значение аргумента биндится на эту константу.
325+ </aside>
326+ </section>
327+ </section>
328+ <section>
329+ <section>
330+ <h2>Структуры</h2>
331+ </section>
332+ <section>
333+ <pre><code class="haskell">data Foo = Bar
334+foo :: Bar
335+foo = Bar</code></pre>
336+
337+ <p data-markdown>
338+ `Foo` -- тип структуры. `Bar` -- конструктор структуры.
339+
340+ Тут у `Foo` всего одно значение `Bar`.
341+ </p>
342+ </section>
343+ <section>
344+ <h3>Произведение типов</h3>
345+ <h5>(обычные поля структур)</h5>
346+ <aside class="notes" data-markdown>
347+ После констрктора можно укзать существующие типы, которые в нем храняться.
348+ </aside>
349+
350+ <pre><code class="haskell">data PersonType = Person String Int</code></pre>
351+ <pre><code class="haskell fragment">vasya :: PersonType
352+vasya = Person "Vasya" 8
353+-- тип можно не укзывать
354+petya = Person "Petya" 5</code></pre>
355+ <pre><code class="haskell fragment">getName :: PersonType -> String
356+getName (Person name _) = name</code></pre>
357+ <pre><code class="haskell fragment">greetPerson :: PersonType -> String
358+greetPerson p = "Hello, " ++ getName p</code></pre>
359+ <pre><code class="haskell fragment">greetPerson petya
360+-- "Hello, Petya"</code></pre>
361+ </section>
362+ <section>
363+ <h3>Еще немного функций</h3>
364+ <pre><code class="haskell fragment">greetPerson :: PersonType -> String
365+greetPerson p = "Hello, " ++ getName p</code></pre>
366+
367+ <pre><code class="haskell fragment">greetPerson :: PersonType -> String
368+greetPerson p = "Hello, " ++ name
369+ where
370+ name = getName p</code></pre>
371+ <pre><code class="haskell fragment">greetPerson :: PersonType -> String
372+greetPerson p = "Hello, " ++ name
373+ where
374+ getName' (Person name _) = name
375+ name = getName' p</code></pre>
376+ </section>
377+ <section>
378+ <pre><code class="haskell">data PersonType = Person String Int
379+
380+getName :: PersonType -> String
381+getName (Person name _) = name</code></pre>
382+ <pre><code class="haskell fragment">greetName :: String -> String
383+greetName name = "Hello, " ++ name</code></pre>
384+ <pre><code class="haskell fragment">greetPerson :: PersonType -> String
385+greetPerson p = greetName (getName p)</code></pre>
386+ <pre><code class="haskell fragment">greetPerson :: PersonType -> String
387+greetPerson = greetName . getName</code></pre>
388+ <pre><code class="haskell fragment">greetPerson petya
389+-- "Hello, Petya"</code></pre>
390+ <pre><code class="haskell fragment">(greetName . getName) petya
391+-- "Hello, Petya"</code></pre>
392+ </section>
393+ <section>
394+ <h3>Суммы типов</h3>
395+ <aside class="notes" data-markdown>
396+ Функции нескольких аргументов -- странный синтаксис -- потом расскажу.
397+ </aside>
398+
399+ <pre><code class="haskell fragment">data Bool = False | True</code></pre>
400+ <pre><code class="haskell fragment">x :: Bool
401+x = True
402+y = False</code></pre>
403+
404+ <pre><code class="haskell fragment">ifThenElse :: (Bool, a, a) -> a</code></pre>
405+ <pre><code class="haskell fragment">ifThenElse (True, a, _) = a
406+ifThenElse (False, _, b) = b</code></pre>
407+ <pre><code class="haskell fragment">ifThenElse (True, "Hello", "World")
408+-- "Hello"</code></pre>
409+
410+ <pre><code class="haskell fragment">ifThenElse (False, "Hello", "World")
411+-- "World"</code></pre>
412+
413+ </section>
414+ <section>
415+ <pre><code class="haskell">data CircleType = Circle Double Double Double
416+data RectangleType = Rectangle Double Double Double Double
417+</code></pre>
418+ <pre><code class="haskell fragment">data Shape =
419+ CircleShape CircleType | RectangleShape RectangleType</code></pre>
420+ <pre><code class="haskell fragment">surface :: Shape -> Double</code></pre>
421+ <pre><code class="haskell fragment">surface (CircleShape (Circle _ _ r)) =
422+ pi * r ^ 2</code></pre>
423+ <pre><code class="haskell fragment">surface (RectangleShape (Rectangle x1 y1 x2 y2)) =
424+ (abs (x2 - x1)) * (abs (y2 - y1))</code></pre>
425+ <pre><code class="haskell fragment">shape = CircleShape (Circle 0 0 2)
426+surface shape
427+-- 12.566370614359172
428+</code></pre>
429+ <pre><code class="haskell fragment">otherShape = RectangleShape (Rectangle 1 2 3 4)
430+surface otherShape
431+-- 4.0
432+</code></pre>
433+ </section>
434+ </section>
435+ <section>
436+ <section>
437+ <h2>И еще немного функций</h2>
438+ </section>
439+ <section>
440+ <h3>Лямбда-выражения</h3>
441+
442+ <pre><code class="haskell fragment">add8 :: Int -> Int</code></pre>
443+ <pre><code class="haskell fragment">add8 x = x + 8</code></pre>
444+ <pre><code class="haskell fragment">add8 = \x -> x + 8</code></pre>
445+ <p data-markdown class="fragment">
446+ λ -- `\`
447+
448+ (λ печатать тяжело)</p>
449+
450+ <pre><code class="haskell fragment">foo :: (Int -> Int) -> Int</code></pre>
451+ <pre><code class="haskell fragment">foo add8</code></pre>
452+ <pre><code class="haskell fragment">foo (\x -> x + 8)</code></pre>
453+ </section>
454+ <section>
455+ <h3>Давайте придумаем синтаксис для функции нескольких аргументов!</h3>
456+ </section>
457+ <section>
458+ <pre><code class="haskell">x, y :: Int
459+x = 42
460+y = 69
461+</code></pre>
462+
463+ <pre><code class="haskell fragment">xPlusY :: Int
464+xPlusY = add x y</code></pre>
465+ <p class="fragment" data-markdown>Применение функции -- лево-ассоциативно</p>
466+ <pre><code class="haskell fragment">xPlusY = (add x) y</code></pre>
467+ <pre><code class="haskell fragment">xPlusY = f y
468+f = add x</code></pre>
469+ <pre><code class="haskell fragment">f :: Int -> Int</code></pre>
470+ <pre><code class="haskell fragment">add :: Int -> (Int -> Int)</code></pre>
471+ </section>
472+ <section>
473+ <pre><code class="haskell">add :: Int -> (Int -> Int)</code></pre>
474+ <p class="fragment" data-markdown>Тип `->` -- право-ассоциативный</p>
475+
476+ <pre><code class="haskell fragment">add :: Int -> Int -> Int</code></pre>
477+ <pre><code class="haskell fragment">add a b = a + b</code></pre>
478+ <pre><code class="haskell fragment">add = \a b -> a + b</code></pre>
479+ </section>
480+ <section>
481+ <p>Любая функция берет строго один аргумент.</p>
482+
483+ <p>Функция нескольких аргументов все равно берет строго одтн аргумент и возвращает функцию, которая берет
484+ следйющий.
485+ </p>
486+
487+ <p>
488+ <em>
489+ (И из-за того, что применение функции лево-ассоциативно, вызов таких не трубует особого
490+ синтаксиса.)
491+ </em>
492+ </p>
493+ </section>
494+ <section>
495+ <h3>Currying</h3>
496+ <pre><code class="haskell fragment">add :: Int -> Int -> Int
497+add a b = a + b</code></pre>
498+
499+ <pre><code class="haskell fragment">add8 :: Int -> Int</code></pre>
500+ <pre><code class="haskell fragment">add :: Int -> (Int -> Int)</code></pre>
501+ <pre><code class="haskell fragment">add8 = add 8</code></pre>
502+ <pre><code class="haskell fragment">add8 3
503+-- 11</code></pre>
504+ </section>
505+ <section>
506+ <h3>Funny fact</h3>
507+
508+ <p class="fragment" data-markdown>Оператор (например `+`) -- функция, название которой не содержит буквы и
509+ цифры.</p>
510+ <pre><code class="haskell fragment">x +&+ y = x + y</code></pre>
511+ <pre><code class="haskell fragment">8 +&+ 9
512+-- 17</code></pre>
513+
514+ </section>
515+ <section>
516+ <h3>Funny fact 2</h3>
517+
518+ <p class="fragment" data-markdown>Оператор можно превратить в функцию, окружив его скобками.</p>
519+ <pre><code class="haskell fragment">add :: Int -> Int -> Int
520+add x y = x + y</code></pre>
521+ <pre><code class="haskell fragment">add = (+&+)</code></pre>
522+ <pre><code class="haskell fragment">add = (+)</code></pre>
523+
524+ </section>
525+ <section>
526+ <h3>Funny fact 3</h3>
527+
528+ <p class="fragment" data-markdown>Функцию можно превратить в оператор, окружив ее обратными кавычками.</p>
529+ <pre><code class="haskell fragment">add :: Int -> Int -> Int
530+add x y = x + y</code></pre>
531+ <pre><code class="haskell fragment">add 8 9
532+-- 17</code></pre>
533+ <pre><code class="haskell fragment">8 `add` 9
534+-- 17</code></pre>
535+ </section>
536+ </section>
537+ </section>
538+ <section>
539+ <section>
540+ <h2>Список</h2>
541+ </section>
542+ <section>
543+ <h3>Односвязный список</h3>
544+ <pre><code class="haskell fragment">data IntList = Cons Int IntList | Nil</code></pre>
545+ <pre><code class="haskell fragment">nums :: IntList
546+nums = 1 `Cons` (2 `Cons` (3 `Cons` Nil))</code></pre>
547+ <pre><code class="haskell fragment">sum :: IntList -> Int</code></pre>
548+ <pre><code class="haskell fragment">sum (Cons x xs) = x + sum xs</code></pre>
549+ <pre><code class="haskell fragment">sum Nil = 0
550+sum (Cons x xs) = x + sum xs</code></pre>
551+ <pre><code class="haskell fragment">sum nums
552+-- 6</code></pre>
553+
554+ </section>
555+ <section>
556+ <pre><code class="haskell">take :: Int -> IntList -> IntList</code></pre>
557+ <pre><code class="haskell fragment">take _ Nil = Nil
558+take 0 _ = Nil
559+take n (Cons x xs) = Cons x (take (n - 1) xs)</code></pre>
560+ <pre><code class="haskell fragment">nums :: IntList
561+nums = 1 `Cons` (2 `Cons` (3 `Cons` Nil))</code></pre>
562+ <pre><code class="haskell fragment">take 2 nums
563+-- Cons 1 (Cons 2 Nil)
564+take 1029 nums
565+-- Cons 1 (Cons 2 (Cons 3 Nil))
566+take 0 nums
567+-- Nil</code></pre>
568+
569+ </section>
570+ <section>
571+ <pre><code class="haskell">repeat :: Int -> IntList</code></pre>
572+ <pre><code class="haskell fragment">repeat n = n : (repeat n)</code></pre>
573+ <pre><code class="haskell fragment">repeat 8
574+-- Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (Cons 8 (...</code></pre>
575+ <pre><code class="haskell fragment">(take 3 . repeat) 8
576+-- Cons 8 (Cons 8 (Cons 8 Nil))</code></pre>
577+ <pre><code class="haskell fragment">(sum . take 3 . repeat) 8
578+-- 24</code></pre>
579+ </section>
580+ <section>
581+ <table>
582+ <tr>
583+ <td>Наша самодеятельность</td>
584+ <td>В стандартной библиотеке</td>
585+ </tr>
586+ <tr class="fragment">
587+ <td>
588+ <pre><code class="haskell">IntList</code></pre>
589+ </td>
590+ <td>
591+ <pre><code class="haskell">[Int]</code></pre>
592+ </td>
593+ </tr>
594+ <tr class="fragment">
595+ <td>
596+ <pre><code class="haskell">Nil</code></pre>
597+ </td>
598+ <td>
599+ <pre><code class="haskell">[]</code></pre>
600+ </td>
601+ </tr>
602+ <tr class="fragment">
603+ <td>
604+ <pre><code class="haskell">Cons</code></pre>
605+ </td>
606+ <td>
607+ <pre><code class="haskell">:</code></pre>
608+ </td>
609+ </tr>
610+ <tr class="fragment">
611+ <td>
612+ <pre><code class="haskell">Cons 3 (Cons 4 Nil)</code></pre>
613+ </td>
614+ <td>
615+ <pre class="fragment"><code class="haskell">3 : 4 : []</code></pre>
616+ <pre class="fragment"><code class="haskell">[3, 4]</code></pre>
617+ </td>
618+ </tr>
619+ </table>
620+ </section>
621+ <section>
622+ <p data-markdown>`repeat`, `sum` и `take` тоже есть в стандартной библиотеке.</p>
623+ </section>
624+ </section>
625+ <section>
626+ <section>
627+ <h2>QuickSort</h2>
628+ </section>
629+ <section>
630+ <pre><code class="haskell">quicksort :: [Int] -> [Int]</code></pre>
631+
632+ <pre><code class="haskell fragment">quicksort (x:xs) =
633+ quicksort smaller ++ [x] ++ quicksort larger
634+ where
635+ smaller = filter (< x) xs
636+ larger = filter (>= x) xs</code></pre>
637+ </section>
638+ <section>
639+ <pre><code class="haskell">filter :: (Bool -> Int) -> [Int] -> [Int]</code></pre>
640+ <pre><code class="haskell fragment">filter f (x:xs) =
641+ if f x
642+ then filter f xs
643+ else x:(filter f xs)</code></pre>
644+ <pre><code class="haskell fragment">filter _ [] = []
645+filter f (x:xs) =
646+ if f x
647+ then filter f xs
648+ else x:(filter f xs)</code></pre>
649+ </section>
650+ <section>
651+ <pre><code class="haskell">quicksort :: [Int] -> [Int]
652+quicksort (x:xs) =
653+ quicksort smaller ++ [x] ++ quicksort larger
654+ where
655+ smaller = filter (< x) xs
656+ larger = filter (>= x) xs
657+ filter _ [] = []
658+ filter f (x:xs) =
659+ if f x
660+ then filter f xs
661+ else x:(filter f xs)</code></pre>
662+ </section>
663+ <section>
664+ <pre><code class="haskell">quicksort :: [Int] -> [Int]
665+quicksort [] = []
666+quicksort (x:xs) =
667+ quicksort smaller ++ [x] ++ quicksort larger
668+ where
669+ smaller = filter (< x) xs
670+ larger = filter (>= x) xs
671+ filter _ [] = []
672+ filter f (x:xs) =
673+ if f x
674+ then filter f xs
675+ else x:(filter f xs)</code></pre>
676+ <pre><code class="haskell fragment">quicksort [2, 1, 3, 4]
677+-- [1, 2, 3, 4]</code></pre>
678+ </section>
679+ <section>
680+ <p data-markdown>`filter` тоже есть в стандартной библиотеке.</p>
681+ </section>
682+ </section>
683+ <section>
684+ <section>
685+ <h2>Где и как смотреть "стандартную библиотеку"</h2>
686+ </section>
687+ <section>
688+ <ol>
689+ <li>
690+ <a href="https://hackage.haskell.org/package/base">Hackage</a>
691+
692+ <p data-markdown>
693+ (Там вам нужен только пакет `base`. Ссылка ведет прямо на него.)
694+
695+ Еще если там нажать `s`, то будет поиск.
696+ </p>
697+ </li>
698+ <li class="fragment">
699+ <a href="https://hoogle.haskell.org">Hoogle</a>
700+
701+ <p data-markdown>
702+ Это поиск по типам.
703+
704+ Например: `Int -> [Int] -> [Int]`
705+
706+ (Тут вам опять же нужен только пакет `base`. Нужно чтобы справа было "package:base".)
707+
708+ </p>
709+ </li>
710+ </ol>
711+ </section>
712+ </section>
713+ </div>
714+ </div>
715+
716+ <script src="./js/reveal.js"></script>
717+
718+ <script>
719+ // More info about config & dependencies:
720+ // - https://github.com/hakimel/reveal.js#configuration
721+ // - https://github.com/hakimel/reveal.js#dependencies
722+ Reveal.initialize({
723+
724+ // Displaнес presentation control arrows
725+ controls: true,
726+
727+ // Help the user learn the controls by providing hints, for example by
728+ // bouncing the down arrow when they first encounter a vertical slide
729+ controlsTutorial: true,
730+
731+ // Determines where controls appear, "edges" or "bottom-right"
732+ controlsLayout: 'bottom-right',
733+
734+ // Visibility rule for backwards navigation arrows; "faded", "hidden"
735+ // or "visible"
736+ controlsBackArrows: 'faded',
737+
738+ // Display a presentation progress bar
739+ progress: true,
740+
741+ // Display the page number of the current slide
742+ slideNumber: false,
743+
744+ // Add the current slide number to the URL hash so that reloading the
745+ // page/copying the URL will return you to the same slide
746+ hash: true,
747+
748+ // Push each slide change to the browser history. Implies `hash: true`
749+ history: false,
750+
751+ // Enable keyboard shortcuts for navigation
752+ keyboard: true,
753+
754+ // Enable the slide overview mode
755+ overview: true,
756+
757+ // Vertical centering of slides
758+ center: true,
759+
760+ // Enables touch navigation on devices with touch input
761+ touch: true,
762+
763+ // Loop the presentation
764+ loop: false,
765+
766+ // Change the presentation direction to be RTL
767+ rtl: false,
768+
769+ // See https://github.com/hakimel/reveal.js/#navigation-mode
770+ navigationMode: 'linear',
771+
772+ // Randomizes the order of slides each time the presentation loads
773+ shuffle: false,
774+
775+ // Turns fragments on and off globally
776+ fragments: true,
777+
778+ // Flags whether to include the current fragment in the URL,
779+ // so that reloading brings you to the same fragment position
780+ fragmentInURL: true,
781+
782+ // Flags if the presentation is running in an embedded mode,
783+ // i.e. contained within a limited portion of the screen
784+ embedded: false,
785+
786+ // Flags if we should show a help overlay when the questionmark
787+ // key is pressed
788+ help: true,
789+
790+ // Flags if speaker notes should be visible to all viewers
791+ showNotes: false,
792+
793+ // Global override for autoplaying embedded media (video/audio/iframe)
794+ // - null: Media will only autoplay if data-autoplay is present
795+ // - true: All media will autoplay, regardless of individual setting
796+ // - false: No media will autoplay, regardless of individual setting
797+ autoPlayMedia: null,
798+
799+ // Global override for preloading lazy-loaded iframes
800+ // - null: Iframes with data-src AND data-preload will be loaded when within
801+ // the viewDistance, iframes with only data-src will be loaded when visible
802+ // - true: All iframes with data-src will be loaded when within the viewDistance
803+ // - false: All iframes with data-src will be loaded only when visible
804+ preloadIframes: null,
805+
806+ // Number of milliseconds between automatically proceeding to the
807+ // next slide, disabled when set to 0, this value can be overwritten
808+ // by using a data-autoslide attribute on your slides
809+ autoSlide: 0,
810+
811+ // Stop auto-sliding after user input
812+ autoSlideStoppable: true,
813+
814+ // Use this method for navigation when auto-sliding
815+ autoSlideMethod: Reveal.navigateNext,
816+
817+ // Specify the average time in seconds that you think you will spend
818+ // presenting each slide. This is used to show a pacing timer in the
819+ // speaker view
820+ defaultTiming: 120,
821+
822+ // Enable slide navigation via mouse wheel
823+ mouseWheel: false,
824+
825+ // Hide cursor if inactive
826+ hideInactiveCursor: true,
827+
828+ // Time before the cursor is hidden (in ms)
829+ hideCursorTime: 5000,
830+
831+ // Hides the address bar on mobile devices
832+ hideAddressBar: true,
833+
834+ // Opens links in an iframe preview overlay
835+ // Add `data-preview-link` and `data-preview-link="false"` to customise each link
836+ // individually
837+ previewLinks: false,
838+
839+ // Transition style
840+ transition: 'slide', // none/fade/slide/convex/concave/zoom
841+
842+ // Transition speed
843+ transitionSpeed: 'default', // default/fast/slow
844+
845+ // Transition style for full page slide backgrounds
846+ backgroundTransition: 'fade', // none/fade/slide/convex/concave/zoom
847+
848+ // Number of slides away from the current that are visible
849+ viewDistance: 3,
850+
851+ // Parallax background image
852+ parallaxBackgroundImage: '', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'"
853+
854+ // Parallax background size
855+ parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px"
856+
857+ // Number of pixels to move the parallax background per slide
858+ // - Calculated automatically unless specified
859+ // - Set to 0 to disable movement along an axis
860+ parallaxBackgroundHorizontal: null,
861+ parallaxBackgroundVertical: null,
862+
863+ // The display mode that will be used to show slides
864+ display: 'block',
865+
866+ pdfSeparateFragments: false,
867+
868+ defaultTiming: null,
869+
870+ markdown: {
871+ smartypants: true
872+ },
873+
874+
875+ dependencies: [
876+ { src: './plugin/markdown/marked.js' },
877+ { src: './plugin/markdown/markdown.js' },
878+ { src: './plugin/zoom-js/zoom.js', async: true },
879+ { src: './plugin/notes/notes.js', async: true },
880+ { src: './plugin/highlight/highlight.js', async: true }
881+ ]
882+
883+ });
884+ </script>
885+</body>
886+
887+</html>
build.shnew file+7
@@ -0,0 +1,7 @@
1+#!/bin/sh
2+
3+for file in *.md
4+do
5+ base=$(basename $file .md)
6+ pandoc -i $file -t revealjs -s --highlight-style=breezeDark --include-in-header=style.html >"$base.html"
7+done
bower.json → reveal.js/bower.jsonrenamed

The content is the same.

css/print/paper.css → reveal.js/css/print/paper.cssrenamed

The content is the same.

css/print/pdf.css → reveal.js/css/print/pdf.cssrenamed

The content is the same.

css/reset.css → reveal.js/css/reset.cssrenamed

The content is the same.

css/reveal.css → reveal.js/css/reveal.cssrenamed+131−286
@@ -39,22 +39,18 @@ body {
3939 opacity: 1;
4040 visibility: inherit; }
4141 .reveal .slides section .fragment.grow.visible {
42− -webkit-transform: scale(1.3);
43− transform: scale(1.3); }
42+ transform: scale(1.3); }
4443
4544.reveal .slides section .fragment.shrink {
4645 opacity: 1;
4746 visibility: inherit; }
4847 .reveal .slides section .fragment.shrink.visible {
49− -webkit-transform: scale(0.7);
50− transform: scale(0.7); }
48+ transform: scale(0.7); }
5149
5250.reveal .slides section .fragment.zoom-in {
53− -webkit-transform: scale(0.1);
54− transform: scale(0.1); }
51+ transform: scale(0.1); }
5552 .reveal .slides section .fragment.zoom-in.visible {
56− -webkit-transform: none;
57− transform: none; }
53+ transform: none; }
5854
5955.reveal .slides section .fragment.fade-out {
6056 opacity: 1;
@@ -77,32 +73,24 @@ body {
7773 text-decoration: line-through; }
7874
7975.reveal .slides section .fragment.fade-up {
80− -webkit-transform: translate(0, 20%);
81− transform: translate(0, 20%); }
76+ transform: translate(0, 40px); }
8277 .reveal .slides section .fragment.fade-up.visible {
83− -webkit-transform: translate(0, 0);
84− transform: translate(0, 0); }
78+ transform: translate(0, 0); }
8579
8680.reveal .slides section .fragment.fade-down {
87− -webkit-transform: translate(0, -20%);
88− transform: translate(0, -20%); }
81+ transform: translate(0, -40px); }
8982 .reveal .slides section .fragment.fade-down.visible {
90− -webkit-transform: translate(0, 0);
91− transform: translate(0, 0); }
83+ transform: translate(0, 0); }
9284
9385.reveal .slides section .fragment.fade-right {
94− -webkit-transform: translate(-20%, 0);
95− transform: translate(-20%, 0); }
86+ transform: translate(-40px, 0); }
9687 .reveal .slides section .fragment.fade-right.visible {
97− -webkit-transform: translate(0, 0);
98− transform: translate(0, 0); }
88+ transform: translate(0, 0); }
9989
10090.reveal .slides section .fragment.fade-left {
101− -webkit-transform: translate(20%, 0);
102− transform: translate(20%, 0); }
91+ transform: translate(40px, 0); }
10392 .reveal .slides section .fragment.fade-left.visible {
104− -webkit-transform: translate(0, 0);
105− transform: translate(0, 0); }
93+ transform: translate(0, 0); }
10694
10795.reveal .slides section .fragment.fade-in-then-out,
10896.reveal .slides section .fragment.current-visible {
@@ -177,48 +165,21 @@ body {
177165/*********************************************
178166 * CONTROLS
179167 *********************************************/
180−@-webkit-keyframes bounce-right {
181− 0%, 10%, 25%, 40%, 50% {
182− -webkit-transform: translateX(0);
183− transform: translateX(0); }
184− 20% {
185− -webkit-transform: translateX(10px);
186− transform: translateX(10px); }
187− 30% {
188− -webkit-transform: translateX(-5px);
189− transform: translateX(-5px); } }
190168@keyframes bounce-right {
191169 0%, 10%, 25%, 40%, 50% {
192− -webkit-transform: translateX(0);
193− transform: translateX(0); }
194− 20% {
195− -webkit-transform: translateX(10px);
196− transform: translateX(10px); }
197− 30% {
198− -webkit-transform: translateX(-5px);
199− transform: translateX(-5px); } }
200−
201−@-webkit-keyframes bounce-down {
202− 0%, 10%, 25%, 40%, 50% {
203− -webkit-transform: translateY(0);
204− transform: translateY(0); }
170+ transform: translateX(0); }
205171 20% {
206− -webkit-transform: translateY(10px);
207− transform: translateY(10px); }
172+ transform: translateX(10px); }
208173 30% {
209− -webkit-transform: translateY(-5px);
210− transform: translateY(-5px); } }
174+ transform: translateX(-5px); } }
211175
212176@keyframes bounce-down {
213177 0%, 10%, 25%, 40%, 50% {
214− -webkit-transform: translateY(0);
215− transform: translateY(0); }
178+ transform: translateY(0); }
216179 20% {
217− -webkit-transform: translateY(10px);
218− transform: translateY(10px); }
180+ transform: translateY(10px); }
219181 30% {
220− -webkit-transform: translateY(-5px);
221− transform: translateY(-5px); } }
182+ transform: translateY(-5px); } }
222183
223184.reveal .controls {
224185 display: none;
@@ -239,9 +200,7 @@ body {
239200 outline: 0;
240201 cursor: pointer;
241202 color: currentColor;
242− -webkit-transform: scale(0.9999);
243− transform: scale(0.9999);
244− transition: color 0.2s ease, opacity 0.2s ease, -webkit-transform 0.2s ease;
203+ transform: scale(0.9999);
245204 transition: color 0.2s ease, opacity 0.2s ease, transform 0.2s ease;
246205 z-index: 2;
247206 pointer-events: auto;
@@ -261,67 +220,51 @@ body {
261220 border-radius: 0.25em;
262221 background-color: currentColor;
263222 transition: all 0.15s ease, background-color 0.8s ease;
264− -webkit-transform-origin: 0.2em 50%;
265− transform-origin: 0.2em 50%;
223+ transform-origin: 0.2em 50%;
266224 will-change: transform; }
267225 .reveal .controls .controls-arrow {
268226 position: relative;
269227 width: 3.6em;
270228 height: 3.6em; }
271229 .reveal .controls .controls-arrow:before {
272− -webkit-transform: translateX(0.5em) translateY(1.55em) rotate(45deg);
273− transform: translateX(0.5em) translateY(1.55em) rotate(45deg); }
230+ transform: translateX(0.5em) translateY(1.55em) rotate(45deg); }
274231 .reveal .controls .controls-arrow:after {
275− -webkit-transform: translateX(0.5em) translateY(1.55em) rotate(-45deg);
276− transform: translateX(0.5em) translateY(1.55em) rotate(-45deg); }
232+ transform: translateX(0.5em) translateY(1.55em) rotate(-45deg); }
277233 .reveal .controls .controls-arrow:hover:before {
278− -webkit-transform: translateX(0.5em) translateY(1.55em) rotate(40deg);
279− transform: translateX(0.5em) translateY(1.55em) rotate(40deg); }
234+ transform: translateX(0.5em) translateY(1.55em) rotate(40deg); }
280235 .reveal .controls .controls-arrow:hover:after {
281− -webkit-transform: translateX(0.5em) translateY(1.55em) rotate(-40deg);
282− transform: translateX(0.5em) translateY(1.55em) rotate(-40deg); }
236+ transform: translateX(0.5em) translateY(1.55em) rotate(-40deg); }
283237 .reveal .controls .controls-arrow:active:before {
284− -webkit-transform: translateX(0.5em) translateY(1.55em) rotate(36deg);
285− transform: translateX(0.5em) translateY(1.55em) rotate(36deg); }
238+ transform: translateX(0.5em) translateY(1.55em) rotate(36deg); }
286239 .reveal .controls .controls-arrow:active:after {
287− -webkit-transform: translateX(0.5em) translateY(1.55em) rotate(-36deg);
288− transform: translateX(0.5em) translateY(1.55em) rotate(-36deg); }
240+ transform: translateX(0.5em) translateY(1.55em) rotate(-36deg); }
289241 .reveal .controls .navigate-left {
290242 right: 6.4em;
291243 bottom: 3.2em;
292− -webkit-transform: translateX(-10px);
293− transform: translateX(-10px); }
244+ transform: translateX(-10px); }
294245 .reveal .controls .navigate-right {
295246 right: 0;
296247 bottom: 3.2em;
297− -webkit-transform: translateX(10px);
298− transform: translateX(10px); }
248+ transform: translateX(10px); }
299249 .reveal .controls .navigate-right .controls-arrow {
300− -webkit-transform: rotate(180deg);
301− transform: rotate(180deg); }
250+ transform: rotate(180deg); }
302251 .reveal .controls .navigate-right.highlight {
303− -webkit-animation: bounce-right 2s 50 both ease-out;
304− animation: bounce-right 2s 50 both ease-out; }
252+ animation: bounce-right 2s 50 both ease-out; }
305253 .reveal .controls .navigate-up {
306254 right: 3.2em;
307255 bottom: 6.4em;
308− -webkit-transform: translateY(-10px);
309− transform: translateY(-10px); }
256+ transform: translateY(-10px); }
310257 .reveal .controls .navigate-up .controls-arrow {
311− -webkit-transform: rotate(90deg);
312− transform: rotate(90deg); }
258+ transform: rotate(90deg); }
313259 .reveal .controls .navigate-down {
314260 right: 3.2em;
315261 bottom: -1.4em;
316262 padding-bottom: 1.4em;
317− -webkit-transform: translateY(10px);
318− transform: translateY(10px); }
263+ transform: translateY(10px); }
319264 .reveal .controls .navigate-down .controls-arrow {
320− -webkit-transform: rotate(-90deg);
321− transform: rotate(-90deg); }
265+ transform: rotate(-90deg); }
322266 .reveal .controls .navigate-down.highlight {
323− -webkit-animation: bounce-down 2s 50 both ease-out;
324− animation: bounce-down 2s 50 both ease-out; }
267+ animation: bounce-down 2s 50 both ease-out; }
325268 .reveal .controls[data-controls-back-arrows="faded"] .navigate-left.enabled,
326269 .reveal .controls[data-controls-back-arrows="faded"] .navigate-up.enabled {
327270 opacity: 0.3; }
@@ -336,8 +279,7 @@ body {
336279 visibility: visible;
337280 opacity: 0.9;
338281 cursor: pointer;
339− -webkit-transform: none;
340− transform: none; }
282+ transform: none; }
341283 .reveal .controls .enabled.fragmented {
342284 opacity: 0.5; }
343285 .reveal .controls .enabled:hover,
@@ -374,13 +316,11 @@ body {
374316
375317.reveal.no-hover .controls .controls-arrow:hover:before,
376318.reveal.no-hover .controls .controls-arrow:active:before {
377− -webkit-transform: translateX(0.5em) translateY(1.55em) rotate(45deg);
378− transform: translateX(0.5em) translateY(1.55em) rotate(45deg); }
319+ transform: translateX(0.5em) translateY(1.55em) rotate(45deg); }
379320
380321.reveal.no-hover .controls .controls-arrow:hover:after,
381322.reveal.no-hover .controls .controls-arrow:active:after {
382− -webkit-transform: translateX(0.5em) translateY(1.55em) rotate(-45deg);
383− transform: translateX(0.5em) translateY(1.55em) rotate(-45deg); }
323+ transform: translateX(0.5em) translateY(1.55em) rotate(-45deg); }
384324
385325@media screen and (min-width: 500px) {
386326 .reveal .controls[data-controls-layout="edges"] {
@@ -486,14 +426,11 @@ body {
486426 overflow: visible;
487427 z-index: 1;
488428 text-align: center;
489− -webkit-perspective: 600px;
490− perspective: 600px;
491− -webkit-perspective-origin: 50% 40%;
492− perspective-origin: 50% 40%; }
429+ perspective: 600px;
430+ perspective-origin: 50% 40%; }
493431
494432.reveal .slides > section {
495− -webkit-perspective: 600px;
496− perspective: 600px; }
433+ perspective: 600px; }
497434
498435.reveal .slides > section,
499436.reveal .slides > section > section {
@@ -503,9 +440,7 @@ body {
503440 padding: 20px 0px;
504441 pointer-events: auto;
505442 z-index: 10;
506− -webkit-transform-style: flat;
507− transform-style: flat;
508− transition: -webkit-transform-origin 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), -webkit-transform 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), visibility 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
443+ transform-style: flat;
509444 transition: transform-origin 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), transform 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), visibility 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
510445
511446/* Global transition speed settings */
@@ -570,60 +505,50 @@ body {
570505 * Aliased 'linear' for backwards compatibility
571506 *********************************************/
572507.reveal.slide section {
573− -webkit-backface-visibility: hidden;
574− backface-visibility: hidden; }
508+ backface-visibility: hidden; }
575509
576510.reveal .slides > section[data-transition=slide].past,
577511.reveal .slides > section[data-transition~=slide-out].past,
578512.reveal.slide .slides > section:not([data-transition]).past {
579− -webkit-transform: translate(-150%, 0);
580− transform: translate(-150%, 0); }
513+ transform: translate(-150%, 0); }
581514
582515.reveal .slides > section[data-transition=slide].future,
583516.reveal .slides > section[data-transition~=slide-in].future,
584517.reveal.slide .slides > section:not([data-transition]).future {
585− -webkit-transform: translate(150%, 0);
586− transform: translate(150%, 0); }
518+ transform: translate(150%, 0); }
587519
588520.reveal .slides > section > section[data-transition=slide].past,
589521.reveal .slides > section > section[data-transition~=slide-out].past,
590522.reveal.slide .slides > section > section:not([data-transition]).past {
591− -webkit-transform: translate(0, -150%);
592− transform: translate(0, -150%); }
523+ transform: translate(0, -150%); }
593524
594525.reveal .slides > section > section[data-transition=slide].future,
595526.reveal .slides > section > section[data-transition~=slide-in].future,
596527.reveal.slide .slides > section > section:not([data-transition]).future {
597− -webkit-transform: translate(0, 150%);
598− transform: translate(0, 150%); }
528+ transform: translate(0, 150%); }
599529
600530.reveal.linear section {
601− -webkit-backface-visibility: hidden;
602− backface-visibility: hidden; }
531+ backface-visibility: hidden; }
603532
604533.reveal .slides > section[data-transition=linear].past,
605534.reveal .slides > section[data-transition~=linear-out].past,
606535.reveal.linear .slides > section:not([data-transition]).past {
607− -webkit-transform: translate(-150%, 0);
608− transform: translate(-150%, 0); }
536+ transform: translate(-150%, 0); }
609537
610538.reveal .slides > section[data-transition=linear].future,
611539.reveal .slides > section[data-transition~=linear-in].future,
612540.reveal.linear .slides > section:not([data-transition]).future {
613− -webkit-transform: translate(150%, 0);
614− transform: translate(150%, 0); }
541+ transform: translate(150%, 0); }
615542
616543.reveal .slides > section > section[data-transition=linear].past,
617544.reveal .slides > section > section[data-transition~=linear-out].past,
618545.reveal.linear .slides > section > section:not([data-transition]).past {
619− -webkit-transform: translate(0, -150%);
620− transform: translate(0, -150%); }
546+ transform: translate(0, -150%); }
621547
622548.reveal .slides > section > section[data-transition=linear].future,
623549.reveal .slides > section > section[data-transition~=linear-in].future,
624550.reveal.linear .slides > section > section:not([data-transition]).future {
625− -webkit-transform: translate(0, 150%);
626− transform: translate(0, 150%); }
551+ transform: translate(0, 150%); }
627552
628553/*********************************************
629554 * CONVEX TRANSITION
@@ -631,93 +556,78 @@ body {
631556 *********************************************/
632557.reveal .slides section[data-transition=default].stack,
633558.reveal.default .slides section.stack {
634− -webkit-transform-style: preserve-3d;
635− transform-style: preserve-3d; }
559+ transform-style: preserve-3d; }
636560
637561.reveal .slides > section[data-transition=default].past,
638562.reveal .slides > section[data-transition~=default-out].past,
639563.reveal.default .slides > section:not([data-transition]).past {
640− -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
641− transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); }
564+ transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); }
642565
643566.reveal .slides > section[data-transition=default].future,
644567.reveal .slides > section[data-transition~=default-in].future,
645568.reveal.default .slides > section:not([data-transition]).future {
646− -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
647− transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); }
569+ transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); }
648570
649571.reveal .slides > section > section[data-transition=default].past,
650572.reveal .slides > section > section[data-transition~=default-out].past,
651573.reveal.default .slides > section > section:not([data-transition]).past {
652− -webkit-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0);
653− transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); }
574+ transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); }
654575
655576.reveal .slides > section > section[data-transition=default].future,
656577.reveal .slides > section > section[data-transition~=default-in].future,
657578.reveal.default .slides > section > section:not([data-transition]).future {
658− -webkit-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0);
659− transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); }
579+ transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); }
660580
661581.reveal .slides section[data-transition=convex].stack,
662582.reveal.convex .slides section.stack {
663− -webkit-transform-style: preserve-3d;
664− transform-style: preserve-3d; }
583+ transform-style: preserve-3d; }
665584
666585.reveal .slides > section[data-transition=convex].past,
667586.reveal .slides > section[data-transition~=convex-out].past,
668587.reveal.convex .slides > section:not([data-transition]).past {
669− -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
670− transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); }
588+ transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); }
671589
672590.reveal .slides > section[data-transition=convex].future,
673591.reveal .slides > section[data-transition~=convex-in].future,
674592.reveal.convex .slides > section:not([data-transition]).future {
675− -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
676− transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); }
593+ transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); }
677594
678595.reveal .slides > section > section[data-transition=convex].past,
679596.reveal .slides > section > section[data-transition~=convex-out].past,
680597.reveal.convex .slides > section > section:not([data-transition]).past {
681− -webkit-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0);
682− transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); }
598+ transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); }
683599
684600.reveal .slides > section > section[data-transition=convex].future,
685601.reveal .slides > section > section[data-transition~=convex-in].future,
686602.reveal.convex .slides > section > section:not([data-transition]).future {
687− -webkit-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0);
688− transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); }
603+ transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); }
689604
690605/*********************************************
691606 * CONCAVE TRANSITION
692607 *********************************************/
693608.reveal .slides section[data-transition=concave].stack,
694609.reveal.concave .slides section.stack {
695− -webkit-transform-style: preserve-3d;
696− transform-style: preserve-3d; }
610+ transform-style: preserve-3d; }
697611
698612.reveal .slides > section[data-transition=concave].past,
699613.reveal .slides > section[data-transition~=concave-out].past,
700614.reveal.concave .slides > section:not([data-transition]).past {
701− -webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
702− transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); }
615+ transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); }
703616
704617.reveal .slides > section[data-transition=concave].future,
705618.reveal .slides > section[data-transition~=concave-in].future,
706619.reveal.concave .slides > section:not([data-transition]).future {
707− -webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
708− transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); }
620+ transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); }
709621
710622.reveal .slides > section > section[data-transition=concave].past,
711623.reveal .slides > section > section[data-transition~=concave-out].past,
712624.reveal.concave .slides > section > section:not([data-transition]).past {
713− -webkit-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
714− transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); }
625+ transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); }
715626
716627.reveal .slides > section > section[data-transition=concave].future,
717628.reveal .slides > section > section[data-transition~=concave-in].future,
718629.reveal.concave .slides > section > section:not([data-transition]).future {
719− -webkit-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
720− transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); }
630+ transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); }
721631
722632/*********************************************
723633 * ZOOM TRANSITION
@@ -730,27 +640,23 @@ body {
730640.reveal .slides > section[data-transition~=zoom-out].past,
731641.reveal.zoom .slides > section:not([data-transition]).past {
732642 visibility: hidden;
733− -webkit-transform: scale(16);
734− transform: scale(16); }
643+ transform: scale(16); }
735644
736645.reveal .slides > section[data-transition=zoom].future,
737646.reveal .slides > section[data-transition~=zoom-in].future,
738647.reveal.zoom .slides > section:not([data-transition]).future {
739648 visibility: hidden;
740− -webkit-transform: scale(0.2);
741− transform: scale(0.2); }
649+ transform: scale(0.2); }
742650
743651.reveal .slides > section > section[data-transition=zoom].past,
744652.reveal .slides > section > section[data-transition~=zoom-out].past,
745653.reveal.zoom .slides > section > section:not([data-transition]).past {
746− -webkit-transform: scale(16);
747− transform: scale(16); }
654+ transform: scale(16); }
748655
749656.reveal .slides > section > section[data-transition=zoom].future,
750657.reveal .slides > section > section[data-transition~=zoom-in].future,
751658.reveal.zoom .slides > section > section:not([data-transition]).future {
752− -webkit-transform: scale(0.2);
753− transform: scale(0.2); }
659+ transform: scale(0.2); }
754660
755661/*********************************************
756662 * CUBE TRANSITION
@@ -760,17 +666,14 @@ body {
760666 * future version.
761667 *********************************************/
762668.reveal.cube .slides {
763− -webkit-perspective: 1300px;
764− perspective: 1300px; }
669+ perspective: 1300px; }
765670
766671.reveal.cube .slides section {
767672 padding: 30px;
768673 min-height: 700px;
769− -webkit-backface-visibility: hidden;
770− backface-visibility: hidden;
674+ backface-visibility: hidden;
771675 box-sizing: border-box;
772− -webkit-transform-style: preserve-3d;
773− transform-style: preserve-3d; }
676+ transform-style: preserve-3d; }
774677
775678.reveal.center.cube .slides section {
776679 min-height: 0; }
@@ -785,8 +688,7 @@ body {
785688 top: 0;
786689 background: rgba(0, 0, 0, 0.1);
787690 border-radius: 4px;
788− -webkit-transform: translateZ(-20px);
789− transform: translateZ(-20px); }
691+ transform: translateZ(-20px); }
790692
791693.reveal.cube .slides section:not(.stack):after {
792694 content: '';
@@ -800,36 +702,27 @@ body {
800702 z-index: 1;
801703 border-radius: 4px;
802704 box-shadow: 0px 95px 25px rgba(0, 0, 0, 0.2);
803− -webkit-transform: translateZ(-90px) rotateX(65deg);
804− transform: translateZ(-90px) rotateX(65deg); }
705+ transform: translateZ(-90px) rotateX(65deg); }
805706
806707.reveal.cube .slides > section.stack {
807708 padding: 0;
808709 background: none; }
809710
810711.reveal.cube .slides > section.past {
811− -webkit-transform-origin: 100% 0%;
812− transform-origin: 100% 0%;
813− -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg);
814− transform: translate3d(-100%, 0, 0) rotateY(-90deg); }
712+ transform-origin: 100% 0%;
713+ transform: translate3d(-100%, 0, 0) rotateY(-90deg); }
815714
816715.reveal.cube .slides > section.future {
817− -webkit-transform-origin: 0% 0%;
818− transform-origin: 0% 0%;
819− -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg);
820− transform: translate3d(100%, 0, 0) rotateY(90deg); }
716+ transform-origin: 0% 0%;
717+ transform: translate3d(100%, 0, 0) rotateY(90deg); }
821718
822719.reveal.cube .slides > section > section.past {
823− -webkit-transform-origin: 0% 100%;
824− transform-origin: 0% 100%;
825− -webkit-transform: translate3d(0, -100%, 0) rotateX(90deg);
826− transform: translate3d(0, -100%, 0) rotateX(90deg); }
720+ transform-origin: 0% 100%;
721+ transform: translate3d(0, -100%, 0) rotateX(90deg); }
827722
828723.reveal.cube .slides > section > section.future {
829− -webkit-transform-origin: 0% 0%;
830− transform-origin: 0% 0%;
831− -webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg);
832− transform: translate3d(0, 100%, 0) rotateX(-90deg); }
724+ transform-origin: 0% 0%;
725+ transform: translate3d(0, 100%, 0) rotateX(-90deg); }
833726
834727/*********************************************
835728 * PAGE TRANSITION
@@ -839,17 +732,14 @@ body {
839732 * future version.
840733 *********************************************/
841734.reveal.page .slides {
842− -webkit-perspective-origin: 0% 50%;
843− perspective-origin: 0% 50%;
844− -webkit-perspective: 3000px;
845− perspective: 3000px; }
735+ perspective-origin: 0% 50%;
736+ perspective: 3000px; }
846737
847738.reveal.page .slides section {
848739 padding: 30px;
849740 min-height: 700px;
850741 box-sizing: border-box;
851− -webkit-transform-style: preserve-3d;
852− transform-style: preserve-3d; }
742+ transform-style: preserve-3d; }
853743
854744.reveal.page .slides section.past {
855745 z-index: 12; }
@@ -863,8 +753,7 @@ body {
863753 left: 0;
864754 top: 0;
865755 background: rgba(0, 0, 0, 0.1);
866− -webkit-transform: translateZ(-20px);
867− transform: translateZ(-20px); }
756+ transform: translateZ(-20px); }
868757
869758.reveal.page .slides section:not(.stack):after {
870759 content: '';
@@ -885,28 +774,20 @@ body {
885774 background: none; }
886775
887776.reveal.page .slides > section.past {
888− -webkit-transform-origin: 0% 0%;
889− transform-origin: 0% 0%;
890− -webkit-transform: translate3d(-40%, 0, 0) rotateY(-80deg);
891− transform: translate3d(-40%, 0, 0) rotateY(-80deg); }
777+ transform-origin: 0% 0%;
778+ transform: translate3d(-40%, 0, 0) rotateY(-80deg); }
892779
893780.reveal.page .slides > section.future {
894− -webkit-transform-origin: 100% 0%;
895− transform-origin: 100% 0%;
896− -webkit-transform: translate3d(0, 0, 0);
897− transform: translate3d(0, 0, 0); }
781+ transform-origin: 100% 0%;
782+ transform: translate3d(0, 0, 0); }
898783
899784.reveal.page .slides > section > section.past {
900− -webkit-transform-origin: 0% 0%;
901− transform-origin: 0% 0%;
902− -webkit-transform: translate3d(0, -40%, 0) rotateX(80deg);
903− transform: translate3d(0, -40%, 0) rotateX(80deg); }
785+ transform-origin: 0% 0%;
786+ transform: translate3d(0, -40%, 0) rotateX(80deg); }
904787
905788.reveal.page .slides > section > section.future {
906− -webkit-transform-origin: 0% 100%;
907− transform-origin: 0% 100%;
908− -webkit-transform: translate3d(0, 0, 0);
909− transform: translate3d(0, 0, 0); }
789+ transform-origin: 0% 100%;
790+ transform: translate3d(0, 0, 0); }
910791
911792/*********************************************
912793 * FADE TRANSITION
@@ -914,8 +795,7 @@ body {
914795.reveal .slides section[data-transition=fade],
915796.reveal.fade .slides section:not([data-transition]),
916797.reveal.fade .slides > section > section:not([data-transition]) {
917− -webkit-transform: none;
918− transform: none;
798+ transform: none;
919799 transition: opacity 0.5s; }
920800
921801.reveal.fade.overview .slides section,
@@ -927,8 +807,7 @@ body {
927807 *********************************************/
928808.reveal .slides section[data-transition=none],
929809.reveal.none .slides section:not([data-transition]) {
930− -webkit-transform: none;
931− transform: none;
810+ transform: none;
932811 transition: none; }
933812
934813/*********************************************
@@ -997,8 +876,7 @@ body {
997876 left: 0;
998877 margin: 10vh 0;
999878 margin: 70px 0;
1000− -webkit-transform: none;
1001− transform: none; }
879+ transform: none; }
1002880
1003881.reveal .no-transition,
1004882.reveal .no-transition * {
@@ -1013,8 +891,7 @@ body {
1013891 height: 100%;
1014892 top: 0;
1015893 left: 0;
1016− -webkit-perspective: 600px;
1017− perspective: 600px; }
894+ perspective: 600px; }
1018895
1019896.reveal .slide-background {
1020897 display: none;
@@ -1072,78 +949,65 @@ body {
1072949.reveal[data-background-transition=slide] > .backgrounds .slide-background,
1073950.reveal > .backgrounds .slide-background[data-background-transition=slide] {
1074951 opacity: 1;
1075− -webkit-backface-visibility: hidden;
1076− backface-visibility: hidden; }
952+ backface-visibility: hidden; }
1077953
1078954.reveal[data-background-transition=slide] > .backgrounds .slide-background.past,
1079955.reveal > .backgrounds .slide-background.past[data-background-transition=slide] {
1080− -webkit-transform: translate(-100%, 0);
1081− transform: translate(-100%, 0); }
956+ transform: translate(-100%, 0); }
1082957
1083958.reveal[data-background-transition=slide] > .backgrounds .slide-background.future,
1084959.reveal > .backgrounds .slide-background.future[data-background-transition=slide] {
1085− -webkit-transform: translate(100%, 0);
1086− transform: translate(100%, 0); }
960+ transform: translate(100%, 0); }
1087961
1088962.reveal[data-background-transition=slide] > .backgrounds .slide-background > .slide-background.past,
1089963.reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=slide] {
1090− -webkit-transform: translate(0, -100%);
1091− transform: translate(0, -100%); }
964+ transform: translate(0, -100%); }
1092965
1093966.reveal[data-background-transition=slide] > .backgrounds .slide-background > .slide-background.future,
1094967.reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=slide] {
1095− -webkit-transform: translate(0, 100%);
1096− transform: translate(0, 100%); }
968+ transform: translate(0, 100%); }
1097969
1098970/* Convex */
1099971.reveal[data-background-transition=convex] > .backgrounds .slide-background.past,
1100972.reveal > .backgrounds .slide-background.past[data-background-transition=convex] {
1101973 opacity: 0;
1102− -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
1103− transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); }
974+ transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); }
1104975
1105976.reveal[data-background-transition=convex] > .backgrounds .slide-background.future,
1106977.reveal > .backgrounds .slide-background.future[data-background-transition=convex] {
1107978 opacity: 0;
1108− -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
1109− transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); }
979+ transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); }
1110980
1111981.reveal[data-background-transition=convex] > .backgrounds .slide-background > .slide-background.past,
1112982.reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=convex] {
1113983 opacity: 0;
1114− -webkit-transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0);
1115− transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); }
984+ transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); }
1116985
1117986.reveal[data-background-transition=convex] > .backgrounds .slide-background > .slide-background.future,
1118987.reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=convex] {
1119988 opacity: 0;
1120− -webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0);
1121− transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); }
989+ transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); }
1122990
1123991/* Concave */
1124992.reveal[data-background-transition=concave] > .backgrounds .slide-background.past,
1125993.reveal > .backgrounds .slide-background.past[data-background-transition=concave] {
1126994 opacity: 0;
1127− -webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
1128− transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); }
995+ transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); }
1129996
1130997.reveal[data-background-transition=concave] > .backgrounds .slide-background.future,
1131998.reveal > .backgrounds .slide-background.future[data-background-transition=concave] {
1132999 opacity: 0;
1133− -webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
1134− transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); }
1000+ transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); }
11351001
11361002.reveal[data-background-transition=concave] > .backgrounds .slide-background > .slide-background.past,
11371003.reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=concave] {
11381004 opacity: 0;
1139− -webkit-transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0);
1140− transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); }
1005+ transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); }
11411006
11421007.reveal[data-background-transition=concave] > .backgrounds .slide-background > .slide-background.future,
11431008.reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=concave] {
11441009 opacity: 0;
1145− -webkit-transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0);
1146− transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); }
1010+ transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); }
11471011
11481012/* Zoom */
11491013.reveal[data-background-transition=zoom] > .backgrounds .slide-background,
@@ -1154,29 +1018,25 @@ body {
11541018.reveal > .backgrounds .slide-background.past[data-background-transition=zoom] {
11551019 opacity: 0;
11561020 visibility: hidden;
1157− -webkit-transform: scale(16);
1158− transform: scale(16); }
1021+ transform: scale(16); }
11591022
11601023.reveal[data-background-transition=zoom] > .backgrounds .slide-background.future,
11611024.reveal > .backgrounds .slide-background.future[data-background-transition=zoom] {
11621025 opacity: 0;
11631026 visibility: hidden;
1164− -webkit-transform: scale(0.2);
1165− transform: scale(0.2); }
1027+ transform: scale(0.2); }
11661028
11671029.reveal[data-background-transition=zoom] > .backgrounds .slide-background > .slide-background.past,
11681030.reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=zoom] {
11691031 opacity: 0;
11701032 visibility: hidden;
1171− -webkit-transform: scale(16);
1172− transform: scale(16); }
1033+ transform: scale(16); }
11731034
11741035.reveal[data-background-transition=zoom] > .backgrounds .slide-background > .slide-background.future,
11751036.reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=zoom] {
11761037 opacity: 0;
11771038 visibility: hidden;
1178− -webkit-transform: scale(0.2);
1179− transform: scale(0.2); }
1039+ transform: scale(0.2); }
11801040
11811041/* Global transition speed settings */
11821042.reveal[data-transition-speed="fast"] > .backgrounds .slide-background {
@@ -1189,10 +1049,8 @@ body {
11891049 * OVERVIEW
11901050 *********************************************/
11911051.reveal.overview {
1192− -webkit-perspective-origin: 50% 50%;
1193− perspective-origin: 50% 50%;
1194− -webkit-perspective: 700px;
1195− perspective: 700px; }
1052+ perspective-origin: 50% 50%;
1053+ perspective: 700px; }
11961054 .reveal.overview .slides {
11971055 -moz-transform-style: preserve-3d; }
11981056 .reveal.overview .slides section {
@@ -1220,8 +1078,7 @@ body {
12201078 outline: none;
12211079 overflow: visible; }
12221080 .reveal.overview .backgrounds {
1223− -webkit-perspective: inherit;
1224− perspective: inherit;
1081+ perspective: inherit;
12251082 -moz-transform-style: preserve-3d; }
12261083 .reveal.overview .backgrounds .slide-background {
12271084 opacity: 1;
@@ -1347,7 +1204,6 @@ body {
13471204
13481205.reveal > .overlay .viewport {
13491206 position: absolute;
1350− display: -webkit-box;
13511207 display: -ms-flexbox;
13521208 display: flex;
13531209 top: 40px;
@@ -1388,8 +1244,7 @@ body {
13881244.reveal > .overlay.overlay-preview.loaded .spinner {
13891245 opacity: 0;
13901246 visibility: hidden;
1391− -webkit-transform: scale(0.2);
1392− transform: scale(0.2); }
1247+ transform: scale(0.2); }
13931248
13941249.reveal > .overlay.overlay-help .viewport {
13951250 overflow: auto;
@@ -1472,10 +1327,8 @@ body {
14721327 line-height: 1.2;
14731328 overflow: hidden;
14741329 vertical-align: top;
1475− -webkit-perspective: 400px;
1476− perspective: 400px;
1477− -webkit-perspective-origin: 50% 50%;
1478− perspective-origin: 50% 50%; }
1330+ perspective: 400px;
1331+ perspective-origin: 50% 50%; }
14791332
14801333.reveal .roll:hover {
14811334 background: none;
@@ -1487,17 +1340,13 @@ body {
14871340 padding: 0 2px;
14881341 pointer-events: none;
14891342 transition: all 400ms ease;
1490− -webkit-transform-origin: 50% 0%;
1491− transform-origin: 50% 0%;
1492− -webkit-transform-style: preserve-3d;
1493− transform-style: preserve-3d;
1494− -webkit-backface-visibility: hidden;
1495− backface-visibility: hidden; }
1343+ transform-origin: 50% 0%;
1344+ transform-style: preserve-3d;
1345+ backface-visibility: hidden; }
14961346
14971347.reveal .roll:hover span {
14981348 background: rgba(0, 0, 0, 0.5);
1499− -webkit-transform: translate3d(0px, 0px, -45px) rotateX(90deg);
1500− transform: translate3d(0px, 0px, -45px) rotateX(90deg); }
1349+ transform: translate3d(0px, 0px, -45px) rotateX(90deg); }
15011350
15021351.reveal .roll span:after {
15031352 content: attr(data-title);
@@ -1506,12 +1355,9 @@ body {
15061355 left: 0;
15071356 top: 0;
15081357 padding: 0 2px;
1509− -webkit-backface-visibility: hidden;
1510− backface-visibility: hidden;
1511− -webkit-transform-origin: 50% 0%;
1512− transform-origin: 50% 0%;
1513− -webkit-transform: translate3d(0px, 110%, 0px) rotateX(-90deg);
1514− transform: translate3d(0px, 110%, 0px) rotateX(-90deg); }
1358+ backface-visibility: hidden;
1359+ transform-origin: 50% 0%;
1360+ transform: translate3d(0px, 110%, 0px) rotateX(-90deg); }
15151361
15161362/*********************************************
15171363 * SPEAKER NOTES
@@ -1592,8 +1438,7 @@ body {
15921438.zoomed .reveal *,
15931439.zoomed .reveal *:before,
15941440.zoomed .reveal *:after {
1595− -webkit-backface-visibility: visible !important;
1596− backface-visibility: visible !important; }
1441+ backface-visibility: visible !important; }
15971442
15981443.zoomed .reveal .progress,
15991444.zoomed .reveal .controls {
reveal.js/css/reveal.min.cssnew file+7
@@ -0,0 +1,7 @@
1+/*!
2+ * reveal.js
3+ * http://revealjs.com
4+ * MIT licensed
5+ *
6+ * Copyright (C) 2019 Hakim El Hattab, http://hakim.se
7+ */html{width:100%;height:100%;height:100vh;height:calc(var(--vh,1vh) * 100);overflow:hidden}body{height:100%;overflow:hidden;position:relative;line-height:1;margin:0;background-color:#fff;color:#000}.reveal .slides section .fragment{opacity:0;visibility:hidden;transition:all .2s ease}.reveal .slides section .fragment.visible{opacity:1;visibility:inherit}.reveal .slides section .fragment.grow{opacity:1;visibility:inherit}.reveal .slides section .fragment.grow.visible{transform:scale(1.3)}.reveal .slides section .fragment.shrink{opacity:1;visibility:inherit}.reveal .slides section .fragment.shrink.visible{transform:scale(.7)}.reveal .slides section .fragment.zoom-in{transform:scale(.1)}.reveal .slides section .fragment.zoom-in.visible{transform:none}.reveal .slides section .fragment.fade-out{opacity:1;visibility:inherit}.reveal .slides section .fragment.fade-out.visible{opacity:0;visibility:hidden}.reveal .slides section .fragment.semi-fade-out{opacity:1;visibility:inherit}.reveal .slides section .fragment.semi-fade-out.visible{opacity:.5;visibility:inherit}.reveal .slides section .fragment.strike{opacity:1;visibility:inherit}.reveal .slides section .fragment.strike.visible{text-decoration:line-through}.reveal .slides section .fragment.fade-up{transform:translate(0,40px)}.reveal .slides section .fragment.fade-up.visible{transform:translate(0,0)}.reveal .slides section .fragment.fade-down{transform:translate(0,-40px)}.reveal .slides section .fragment.fade-down.visible{transform:translate(0,0)}.reveal .slides section .fragment.fade-right{transform:translate(-40px,0)}.reveal .slides section .fragment.fade-right.visible{transform:translate(0,0)}.reveal .slides section .fragment.fade-left{transform:translate(40px,0)}.reveal .slides section .fragment.fade-left.visible{transform:translate(0,0)}.reveal .slides section .fragment.current-visible,.reveal .slides section .fragment.fade-in-then-out{opacity:0;visibility:hidden}.reveal .slides section .fragment.current-visible.current-fragment,.reveal .slides section .fragment.fade-in-then-out.current-fragment{opacity:1;visibility:inherit}.reveal .slides section .fragment.fade-in-then-semi-out{opacity:0;visibility:hidden}.reveal .slides section .fragment.fade-in-then-semi-out.visible{opacity:.5;visibility:inherit}.reveal .slides section .fragment.fade-in-then-semi-out.current-fragment{opacity:1;visibility:inherit}.reveal .slides section .fragment.highlight-blue,.reveal .slides section .fragment.highlight-current-blue,.reveal .slides section .fragment.highlight-current-green,.reveal .slides section .fragment.highlight-current-red,.reveal .slides section .fragment.highlight-green,.reveal .slides section .fragment.highlight-red{opacity:1;visibility:inherit}.reveal .slides section .fragment.highlight-red.visible{color:#ff2c2d}.reveal .slides section .fragment.highlight-green.visible{color:#17ff2e}.reveal .slides section .fragment.highlight-blue.visible{color:#1b91ff}.reveal .slides section .fragment.highlight-current-red.current-fragment{color:#ff2c2d}.reveal .slides section .fragment.highlight-current-green.current-fragment{color:#17ff2e}.reveal .slides section .fragment.highlight-current-blue.current-fragment{color:#1b91ff}.reveal:after{content:'';font-style:italic}.reveal iframe{z-index:1}.reveal a{position:relative}.reveal .stretch{max-width:none;max-height:none}.reveal pre.stretch code{height:100%;max-height:100%;box-sizing:border-box}@keyframes bounce-right{0%,10%,25%,40%,50%{transform:translateX(0)}20%{transform:translateX(10px)}30%{transform:translateX(-5px)}}@keyframes bounce-down{0%,10%,25%,40%,50%{transform:translateY(0)}20%{transform:translateY(10px)}30%{transform:translateY(-5px)}}.reveal .controls{display:none;position:absolute;top:auto;bottom:12px;right:12px;left:auto;z-index:11;color:#000;pointer-events:none;font-size:10px}.reveal .controls button{position:absolute;padding:0;background-color:transparent;border:0;outline:0;cursor:pointer;color:currentColor;transform:scale(.9999);transition:color .2s ease,opacity .2s ease,transform .2s ease;z-index:2;pointer-events:auto;font-size:inherit;visibility:hidden;opacity:0;-webkit-appearance:none;-webkit-tap-highlight-color:transparent}.reveal .controls .controls-arrow:after,.reveal .controls .controls-arrow:before{content:'';position:absolute;top:0;left:0;width:2.6em;height:.5em;border-radius:.25em;background-color:currentColor;transition:all .15s ease,background-color .8s ease;transform-origin:.2em 50%;will-change:transform}.reveal .controls .controls-arrow{position:relative;width:3.6em;height:3.6em}.reveal .controls .controls-arrow:before{transform:translateX(.5em) translateY(1.55em) rotate(45deg)}.reveal .controls .controls-arrow:after{transform:translateX(.5em) translateY(1.55em) rotate(-45deg)}.reveal .controls .controls-arrow:hover:before{transform:translateX(.5em) translateY(1.55em) rotate(40deg)}.reveal .controls .controls-arrow:hover:after{transform:translateX(.5em) translateY(1.55em) rotate(-40deg)}.reveal .controls .controls-arrow:active:before{transform:translateX(.5em) translateY(1.55em) rotate(36deg)}.reveal .controls .controls-arrow:active:after{transform:translateX(.5em) translateY(1.55em) rotate(-36deg)}.reveal .controls .navigate-left{right:6.4em;bottom:3.2em;transform:translateX(-10px)}.reveal .controls .navigate-right{right:0;bottom:3.2em;transform:translateX(10px)}.reveal .controls .navigate-right .controls-arrow{transform:rotate(180deg)}.reveal .controls .navigate-right.highlight{animation:bounce-right 2s 50 both ease-out}.reveal .controls .navigate-up{right:3.2em;bottom:6.4em;transform:translateY(-10px)}.reveal .controls .navigate-up .controls-arrow{transform:rotate(90deg)}.reveal .controls .navigate-down{right:3.2em;bottom:-1.4em;padding-bottom:1.4em;transform:translateY(10px)}.reveal .controls .navigate-down .controls-arrow{transform:rotate(-90deg)}.reveal .controls .navigate-down.highlight{animation:bounce-down 2s 50 both ease-out}.reveal .controls[data-controls-back-arrows=faded] .navigate-left.enabled,.reveal .controls[data-controls-back-arrows=faded] .navigate-up.enabled{opacity:.3}.reveal .controls[data-controls-back-arrows=faded] .navigate-left.enabled:hover,.reveal .controls[data-controls-back-arrows=faded] .navigate-up.enabled:hover{opacity:1}.reveal .controls[data-controls-back-arrows=hidden] .navigate-left.enabled,.reveal .controls[data-controls-back-arrows=hidden] .navigate-up.enabled{opacity:0;visibility:hidden}.reveal .controls .enabled{visibility:visible;opacity:.9;cursor:pointer;transform:none}.reveal .controls .enabled.fragmented{opacity:.5}.reveal .controls .enabled.fragmented:hover,.reveal .controls .enabled:hover{opacity:1}.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-down,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-up{display:none}.reveal:not(.has-vertical-slides) .controls .navigate-left,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-left{bottom:1.4em;right:5.5em}.reveal:not(.has-vertical-slides) .controls .navigate-right,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-right{bottom:1.4em;right:.5em}.reveal:not(.has-horizontal-slides) .controls .navigate-up{right:1.4em;bottom:5em}.reveal:not(.has-horizontal-slides) .controls .navigate-down{right:1.4em;bottom:.5em}.reveal.has-dark-background .controls{color:#fff}.reveal.has-light-background .controls{color:#000}.reveal.no-hover .controls .controls-arrow:active:before,.reveal.no-hover .controls .controls-arrow:hover:before{transform:translateX(.5em) translateY(1.55em) rotate(45deg)}.reveal.no-hover .controls .controls-arrow:active:after,.reveal.no-hover .controls .controls-arrow:hover:after{transform:translateX(.5em) translateY(1.55em) rotate(-45deg)}@media screen and (min-width:500px){.reveal .controls[data-controls-layout=edges]{top:0;right:0;bottom:0;left:0}.reveal .controls[data-controls-layout=edges] .navigate-down,.reveal .controls[data-controls-layout=edges] .navigate-left,.reveal .controls[data-controls-layout=edges] .navigate-right,.reveal .controls[data-controls-layout=edges] .navigate-up{bottom:auto;right:auto}.reveal .controls[data-controls-layout=edges] .navigate-left{top:50%;left:.8em;margin-top:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-right{top:50%;right:.8em;margin-top:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-up{top:.8em;left:50%;margin-left:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-down{bottom:-.3em;left:50%;margin-left:-1.8em}}.reveal .progress{position:absolute;display:none;height:3px;width:100%;bottom:0;left:0;z-index:10;background-color:rgba(0,0,0,.2);color:#fff}.reveal .progress:after{content:'';display:block;position:absolute;height:10px;width:100%;top:-10px}.reveal .progress span{display:block;height:100%;width:0;background-color:currentColor;transition:width .8s cubic-bezier(.26,.86,.44,.985)}.reveal .slide-number{position:absolute;display:block;right:8px;bottom:8px;z-index:31;font-family:Helvetica,sans-serif;font-size:12px;line-height:1;color:#fff;background-color:rgba(0,0,0,.4);padding:5px}.reveal .slide-number a{color:currentColor}.reveal .slide-number-delimiter{margin:0 3px}.reveal{position:relative;width:100%;height:100%;overflow:hidden;-ms-touch-action:pinch-zoom;touch-action:pinch-zoom}.reveal .slides{position:absolute;width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin:auto;pointer-events:none;overflow:visible;z-index:1;text-align:center;perspective:600px;perspective-origin:50% 40%}.reveal .slides>section{perspective:600px}.reveal .slides>section,.reveal .slides>section>section{display:none;position:absolute;width:100%;padding:20px 0;pointer-events:auto;z-index:10;transform-style:flat;transition:transform-origin .8s cubic-bezier(.26,.86,.44,.985),transform .8s cubic-bezier(.26,.86,.44,.985),visibility .8s cubic-bezier(.26,.86,.44,.985),opacity .8s cubic-bezier(.26,.86,.44,.985)}.reveal[data-transition-speed=fast] .slides section{transition-duration:.4s}.reveal[data-transition-speed=slow] .slides section{transition-duration:1.2s}.reveal .slides section[data-transition-speed=fast]{transition-duration:.4s}.reveal .slides section[data-transition-speed=slow]{transition-duration:1.2s}.reveal .slides>section.stack{padding-top:0;padding-bottom:0;pointer-events:none;height:100%}.reveal .slides>section.present,.reveal .slides>section>section.present{display:block;z-index:11;opacity:1}.reveal .slides>section:empty,.reveal .slides>section>section:empty,.reveal .slides>section>section[data-background-interactive],.reveal .slides>section[data-background-interactive]{pointer-events:none}.reveal.center,.reveal.center .slides,.reveal.center .slides section{min-height:0!important}.reveal .slides>section.future,.reveal .slides>section.past,.reveal .slides>section>section.future,.reveal .slides>section>section.past{pointer-events:none}.reveal.overview .slides>section,.reveal.overview .slides>section>section{pointer-events:auto}.reveal .slides>section.future,.reveal .slides>section.past,.reveal .slides>section>section.future,.reveal .slides>section>section.past{opacity:0}.reveal.slide section{backface-visibility:hidden}.reveal .slides>section[data-transition=slide].past,.reveal .slides>section[data-transition~=slide-out].past,.reveal.slide .slides>section:not([data-transition]).past{transform:translate(-150%,0)}.reveal .slides>section[data-transition=slide].future,.reveal .slides>section[data-transition~=slide-in].future,.reveal.slide .slides>section:not([data-transition]).future{transform:translate(150%,0)}.reveal .slides>section>section[data-transition=slide].past,.reveal .slides>section>section[data-transition~=slide-out].past,.reveal.slide .slides>section>section:not([data-transition]).past{transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=slide].future,.reveal .slides>section>section[data-transition~=slide-in].future,.reveal.slide .slides>section>section:not([data-transition]).future{transform:translate(0,150%)}.reveal.linear section{backface-visibility:hidden}.reveal .slides>section[data-transition=linear].past,.reveal .slides>section[data-transition~=linear-out].past,.reveal.linear .slides>section:not([data-transition]).past{transform:translate(-150%,0)}.reveal .slides>section[data-transition=linear].future,.reveal .slides>section[data-transition~=linear-in].future,.reveal.linear .slides>section:not([data-transition]).future{transform:translate(150%,0)}.reveal .slides>section>section[data-transition=linear].past,.reveal .slides>section>section[data-transition~=linear-out].past,.reveal.linear .slides>section>section:not([data-transition]).past{transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=linear].future,.reveal .slides>section>section[data-transition~=linear-in].future,.reveal.linear .slides>section>section:not([data-transition]).future{transform:translate(0,150%)}.reveal .slides section[data-transition=default].stack,.reveal.default .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=default].past,.reveal .slides>section[data-transition~=default-out].past,.reveal.default .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=default].future,.reveal .slides>section[data-transition~=default-in].future,.reveal.default .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=default].past,.reveal .slides>section>section[data-transition~=default-out].past,.reveal.default .slides>section>section:not([data-transition]).past{transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=default].future,.reveal .slides>section>section[data-transition~=default-in].future,.reveal.default .slides>section>section:not([data-transition]).future{transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides section[data-transition=convex].stack,.reveal.convex .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=convex].past,.reveal .slides>section[data-transition~=convex-out].past,.reveal.convex .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=convex].future,.reveal .slides>section[data-transition~=convex-in].future,.reveal.convex .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=convex].past,.reveal .slides>section>section[data-transition~=convex-out].past,.reveal.convex .slides>section>section:not([data-transition]).past{transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=convex].future,.reveal .slides>section>section[data-transition~=convex-in].future,.reveal.convex .slides>section>section:not([data-transition]).future{transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides section[data-transition=concave].stack,.reveal.concave .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=concave].past,.reveal .slides>section[data-transition~=concave-out].past,.reveal.concave .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=concave].future,.reveal .slides>section[data-transition~=concave-in].future,.reveal.concave .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=concave].past,.reveal .slides>section>section[data-transition~=concave-out].past,.reveal.concave .slides>section>section:not([data-transition]).past{transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0)}.reveal .slides>section>section[data-transition=concave].future,.reveal .slides>section>section[data-transition~=concave-in].future,.reveal.concave .slides>section>section:not([data-transition]).future{transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0)}.reveal .slides section[data-transition=zoom],.reveal.zoom .slides section:not([data-transition]){transition-timing-function:ease}.reveal .slides>section[data-transition=zoom].past,.reveal .slides>section[data-transition~=zoom-out].past,.reveal.zoom .slides>section:not([data-transition]).past{visibility:hidden;transform:scale(16)}.reveal .slides>section[data-transition=zoom].future,.reveal .slides>section[data-transition~=zoom-in].future,.reveal.zoom .slides>section:not([data-transition]).future{visibility:hidden;transform:scale(.2)}.reveal .slides>section>section[data-transition=zoom].past,.reveal .slides>section>section[data-transition~=zoom-out].past,.reveal.zoom .slides>section>section:not([data-transition]).past{transform:scale(16)}.reveal .slides>section>section[data-transition=zoom].future,.reveal .slides>section>section[data-transition~=zoom-in].future,.reveal.zoom .slides>section>section:not([data-transition]).future{transform:scale(.2)}.reveal.cube .slides{perspective:1300px}.reveal.cube .slides section{padding:30px;min-height:700px;backface-visibility:hidden;box-sizing:border-box;transform-style:preserve-3d}.reveal.center.cube .slides section{min-height:0}.reveal.cube .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);border-radius:4px;transform:translateZ(-20px)}.reveal.cube .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0 0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);transform:translateZ(-90px) rotateX(65deg)}.reveal.cube .slides>section.stack{padding:0;background:0 0}.reveal.cube .slides>section.past{transform-origin:100% 0;transform:translate3d(-100%,0,0) rotateY(-90deg)}.reveal.cube .slides>section.future{transform-origin:0 0;transform:translate3d(100%,0,0) rotateY(90deg)}.reveal.cube .slides>section>section.past{transform-origin:0 100%;transform:translate3d(0,-100%,0) rotateX(90deg)}.reveal.cube .slides>section>section.future{transform-origin:0 0;transform:translate3d(0,100%,0) rotateX(-90deg)}.reveal.page .slides{perspective-origin:0 50%;perspective:3000px}.reveal.page .slides section{padding:30px;min-height:700px;box-sizing:border-box;transform-style:preserve-3d}.reveal.page .slides section.past{z-index:12}.reveal.page .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);transform:translateZ(-20px)}.reveal.page .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0 0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX(65deg)}.reveal.page .slides>section.stack{padding:0;background:0 0}.reveal.page .slides>section.past{transform-origin:0 0;transform:translate3d(-40%,0,0) rotateY(-80deg)}.reveal.page .slides>section.future{transform-origin:100% 0;transform:translate3d(0,0,0)}.reveal.page .slides>section>section.past{transform-origin:0 0;transform:translate3d(0,-40%,0) rotateX(80deg)}.reveal.page .slides>section>section.future{transform-origin:0 100%;transform:translate3d(0,0,0)}.reveal .slides section[data-transition=fade],.reveal.fade .slides section:not([data-transition]),.reveal.fade .slides>section>section:not([data-transition]){transform:none;transition:opacity .5s}.reveal.fade.overview .slides section,.reveal.fade.overview .slides>section>section{transition:none}.reveal .slides section[data-transition=none],.reveal.none .slides section:not([data-transition]){transform:none;transition:none}.reveal .pause-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:#000;visibility:hidden;opacity:0;z-index:100;transition:all 1s ease}.reveal .pause-overlay .resume-button{position:absolute;bottom:20px;right:20px;color:#ccc;border-radius:2px;padding:6px 14px;border:2px solid #ccc;font-size:16px;background:0 0;cursor:pointer}.reveal .pause-overlay .resume-button:hover{color:#fff;border-color:#fff}.reveal.paused .pause-overlay{visibility:visible;opacity:1}.no-transforms{overflow-y:auto}.no-transforms .reveal{overflow:visible}.no-transforms .reveal .slides{position:relative;width:80%;max-width:1280px;height:auto;top:0;margin:0 auto;text-align:center}.no-transforms .reveal .controls,.no-transforms .reveal .progress{display:none}.no-transforms .reveal .slides section{display:block;opacity:1;position:relative;height:auto;min-height:0;top:0;left:0;margin:10vh 0;margin:70px 0;transform:none}.reveal .no-transition,.reveal .no-transition *{transition:none!important}.reveal .backgrounds{position:absolute;width:100%;height:100%;top:0;left:0;perspective:600px}.reveal .slide-background{display:none;position:absolute;width:100%;height:100%;opacity:0;visibility:hidden;overflow:hidden;background-color:rgba(0,0,0,0);transition:all .8s cubic-bezier(.26,.86,.44,.985)}.reveal .slide-background-content{position:absolute;width:100%;height:100%;background-position:50% 50%;background-repeat:no-repeat;background-size:cover}.reveal .slide-background.stack{display:block}.reveal .slide-background.present{opacity:1;visibility:visible;z-index:2}.print-pdf .reveal .slide-background{opacity:1!important;visibility:visible!important}.reveal .slide-background video{position:absolute;width:100%;height:100%;max-width:none;max-height:none;top:0;left:0;-o-object-fit:cover;object-fit:cover}.reveal .slide-background[data-background-size=contain] video{-o-object-fit:contain;object-fit:contain}.reveal>.backgrounds .slide-background[data-background-transition=none],.reveal[data-background-transition=none]>.backgrounds .slide-background{transition:none}.reveal>.backgrounds .slide-background[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background{opacity:1;backface-visibility:hidden}.reveal>.backgrounds .slide-background.past[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background.past{transform:translate(-100%,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background.future{transform:translate(100%,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past{transform:translate(0,-100%)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future{transform:translate(0,100%)}.reveal>.backgrounds .slide-background.past[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background.past{opacity:0;transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background.future{opacity:0;transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past{opacity:0;transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future{opacity:0;transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0)}.reveal>.backgrounds .slide-background.past[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background.past{opacity:0;transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background.future{opacity:0;transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past{opacity:0;transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future{opacity:0;transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0)}.reveal>.backgrounds .slide-background[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background{transition-timing-function:ease}.reveal>.backgrounds .slide-background.past[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past{opacity:0;visibility:hidden;transform:scale(16)}.reveal>.backgrounds .slide-background.future[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future{opacity:0;visibility:hidden;transform:scale(.2)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past{opacity:0;visibility:hidden;transform:scale(16)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future{opacity:0;visibility:hidden;transform:scale(.2)}.reveal[data-transition-speed=fast]>.backgrounds .slide-background{transition-duration:.4s}.reveal[data-transition-speed=slow]>.backgrounds .slide-background{transition-duration:1.2s}.reveal.overview{perspective-origin:50% 50%;perspective:700px}.reveal.overview .slides{-moz-transform-style:preserve-3d}.reveal.overview .slides section{height:100%;top:0!important;opacity:1!important;overflow:hidden;visibility:visible!important;cursor:pointer;box-sizing:border-box}.reveal.overview .slides section.present,.reveal.overview .slides section:hover{outline:10px solid rgba(150,150,150,.4);outline-offset:10px}.reveal.overview .slides section .fragment{opacity:1;transition:none}.reveal.overview .slides section:after,.reveal.overview .slides section:before{display:none!important}.reveal.overview .slides>section.stack{padding:0;top:0!important;background:0 0;outline:0;overflow:visible}.reveal.overview .backgrounds{perspective:inherit;-moz-transform-style:preserve-3d}.reveal.overview .backgrounds .slide-background{opacity:1;visibility:visible;outline:10px solid rgba(150,150,150,.1);outline-offset:10px}.reveal.overview .backgrounds .slide-background.stack{overflow:visible}.reveal.overview .slides section,.reveal.overview-deactivating .slides section{transition:none}.reveal.overview .backgrounds .slide-background,.reveal.overview-deactivating .backgrounds .slide-background{transition:none}.reveal.rtl .slides,.reveal.rtl .slides h1,.reveal.rtl .slides h2,.reveal.rtl .slides h3,.reveal.rtl .slides h4,.reveal.rtl .slides h5,.reveal.rtl .slides h6{direction:rtl;font-family:sans-serif}.reveal.rtl code,.reveal.rtl pre{direction:ltr}.reveal.rtl ol,.reveal.rtl ul{text-align:right}.reveal.rtl .progress span{float:right}.reveal.has-parallax-background .backgrounds{transition:all .8s ease}.reveal.has-parallax-background[data-transition-speed=fast] .backgrounds{transition-duration:.4s}.reveal.has-parallax-background[data-transition-speed=slow] .backgrounds{transition-duration:1.2s}.reveal>.overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1000;background:rgba(0,0,0,.9);opacity:0;visibility:hidden;transition:all .3s ease}.reveal>.overlay.visible{opacity:1;visibility:visible}.reveal>.overlay .spinner{position:absolute;display:block;top:50%;left:50%;width:32px;height:32px;margin:-16px 0 0 -16px;z-index:10;background-image:url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);visibility:visible;opacity:.6;transition:all .3s ease}.reveal>.overlay header{position:absolute;left:0;top:0;width:100%;height:40px;z-index:2;border-bottom:1px solid #222}.reveal>.overlay header a{display:inline-block;width:40px;height:40px;line-height:36px;padding:0 10px;float:right;opacity:.6;box-sizing:border-box}.reveal>.overlay header a:hover{opacity:1}.reveal>.overlay header a .icon{display:inline-block;width:20px;height:20px;background-position:50% 50%;background-size:100%;background-repeat:no-repeat}.reveal>.overlay header a.close .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC)}.reveal>.overlay header a.external .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==)}.reveal>.overlay .viewport{position:absolute;display:-ms-flexbox;display:flex;top:40px;right:0;bottom:0;left:0}.reveal>.overlay.overlay-preview .viewport iframe{width:100%;height:100%;max-width:100%;max-height:100%;border:0;opacity:0;visibility:hidden;transition:all .3s ease}.reveal>.overlay.overlay-preview.loaded .viewport iframe{opacity:1;visibility:visible}.reveal>.overlay.overlay-preview.loaded .viewport-inner{position:absolute;z-index:-1;left:0;top:45%;width:100%;text-align:center;letter-spacing:normal}.reveal>.overlay.overlay-preview .x-frame-error{opacity:0;transition:opacity .3s ease .3s}.reveal>.overlay.overlay-preview.loaded .x-frame-error{opacity:1}.reveal>.overlay.overlay-preview.loaded .spinner{opacity:0;visibility:hidden;transform:scale(.2)}.reveal>.overlay.overlay-help .viewport{overflow:auto;color:#fff}.reveal>.overlay.overlay-help .viewport .viewport-inner{width:600px;margin:auto;padding:20px 20px 80px 20px;text-align:center;letter-spacing:normal}.reveal>.overlay.overlay-help .viewport .viewport-inner .title{font-size:20px}.reveal>.overlay.overlay-help .viewport .viewport-inner table{border:1px solid #fff;border-collapse:collapse;font-size:16px}.reveal>.overlay.overlay-help .viewport .viewport-inner table td,.reveal>.overlay.overlay-help .viewport .viewport-inner table th{width:200px;padding:14px;border:1px solid #fff;vertical-align:middle}.reveal>.overlay.overlay-help .viewport .viewport-inner table th{padding-top:20px;padding-bottom:20px}.reveal .playback{position:absolute;left:15px;bottom:20px;z-index:30;cursor:pointer;transition:all .4s ease;-webkit-tap-highlight-color:transparent}.reveal.overview .playback{opacity:0;visibility:hidden}.reveal .hljs table{margin:initial}.reveal .hljs-ln-code,.reveal .hljs-ln-numbers{padding:0;border:0}.reveal .hljs-ln-numbers{opacity:.6;padding-right:.75em;text-align:right;vertical-align:top}.reveal .hljs.has-highlights tr:not(.highlight-line){opacity:.4}.reveal .hljs:not(:first-child).fragment{position:absolute;top:0;left:0;width:100%;box-sizing:border-box}.reveal .roll{display:inline-block;line-height:1.2;overflow:hidden;vertical-align:top;perspective:400px;perspective-origin:50% 50%}.reveal .roll:hover{background:0 0;text-shadow:none}.reveal .roll span{display:block;position:relative;padding:0 2px;pointer-events:none;transition:all .4s ease;transform-origin:50% 0;transform-style:preserve-3d;backface-visibility:hidden}.reveal .roll:hover span{background:rgba(0,0,0,.5);transform:translate3d(0,0,-45px) rotateX(90deg)}.reveal .roll span:after{content:attr(data-title);display:block;position:absolute;left:0;top:0;padding:0 2px;backface-visibility:hidden;transform-origin:50% 0;transform:translate3d(0,110%,0) rotateX(-90deg)}.reveal aside.notes{display:none}.reveal .speaker-notes{display:none;position:absolute;width:33.3333333333%;height:100%;top:0;left:100%;padding:14px 18px 14px 18px;z-index:1;font-size:18px;line-height:1.4;border:1px solid rgba(0,0,0,.05);color:#222;background-color:#f5f5f5;overflow:auto;box-sizing:border-box;text-align:left;font-family:Helvetica,sans-serif;-webkit-overflow-scrolling:touch}.reveal .speaker-notes .notes-placeholder{color:#ccc;font-style:italic}.reveal .speaker-notes:focus{outline:0}.reveal .speaker-notes:before{content:'Speaker notes';display:block;margin-bottom:10px;opacity:.5}.reveal.show-notes{max-width:75%;overflow:visible}.reveal.show-notes .speaker-notes{display:block}@media screen and (min-width:1600px){.reveal .speaker-notes{font-size:20px}}@media screen and (max-width:1024px){.reveal.show-notes{border-left:0;max-width:none;max-height:70%;max-height:70vh;overflow:visible}.reveal.show-notes .speaker-notes{top:100%;left:0;width:100%;height:42.8571428571%;height:30vh;border:0}}@media screen and (max-width:600px){.reveal.show-notes{max-height:60%;max-height:60vh}.reveal.show-notes .speaker-notes{top:100%;height:66.6666666667%;height:40vh}.reveal .speaker-notes{font-size:14px}}.zoomed .reveal *,.zoomed .reveal :after,.zoomed .reveal :before{backface-visibility:visible!important}.zoomed .reveal .controls,.zoomed .reveal .progress{opacity:0}.zoomed .reveal .roll span{background:0 0}.zoomed .reveal .roll span:after{visibility:hidden}
css/reveal.scss → reveal.js/css/reveal.scssrenamed

The content is the same.

css/theme/README.md → reveal.js/css/theme/README.mdrenamed

The content is the same.

css/theme/beige.css → reveal.js/css/theme/beige.cssrenamed

The content is the same.

css/theme/black copy.css → reveal.js/css/theme/black copy.cssrenamed

The content is the same.

css/theme/black.css → reveal.js/css/theme/black.cssrenamed

The content is the same.

css/theme/blood.css → reveal.js/css/theme/blood.cssrenamed

The content is the same.

css/theme/league.css → reveal.js/css/theme/league.cssrenamed

The content is the same.

css/theme/moon.css → reveal.js/css/theme/moon.cssrenamed

The content is the same.

css/theme/night.css → reveal.js/css/theme/night.cssrenamed

The content is the same.

css/theme/serif.css → reveal.js/css/theme/serif.cssrenamed

The content is the same.

css/theme/simple.css → reveal.js/css/theme/simple.cssrenamed

The content is the same.

css/theme/sky.css → reveal.js/css/theme/sky.cssrenamed

The content is the same.

css/theme/solarized.css → reveal.js/css/theme/solarized.cssrenamed

The content is the same.

css/theme/source/beige.scss → reveal.js/css/theme/source/beige.scssrenamed

The content is the same.

css/theme/source/black.scss → reveal.js/css/theme/source/black.scssrenamed

The content is the same.

css/theme/source/blood.scss → reveal.js/css/theme/source/blood.scssrenamed

The content is the same.

css/theme/source/league.scss → reveal.js/css/theme/source/league.scssrenamed

The content is the same.

css/theme/source/moon.scss → reveal.js/css/theme/source/moon.scssrenamed

The content is the same.

css/theme/source/night.scss → reveal.js/css/theme/source/night.scssrenamed

The content is the same.

css/theme/source/serif.scss → reveal.js/css/theme/source/serif.scssrenamed

The content is the same.

css/theme/source/simple.scss → reveal.js/css/theme/source/simple.scssrenamed

The content is the same.

css/theme/source/sky.scss → reveal.js/css/theme/source/sky.scssrenamed

The content is the same.

css/theme/source/solarized.scss → reveal.js/css/theme/source/solarized.scssrenamed

The content is the same.

css/theme/source/superblack.scss → reveal.js/css/theme/source/superblack.scssrenamed+4−4
@@ -35,10 +35,10 @@ $linkColor: #42affa;
3535$linkColorHover: lighten( $linkColor, 15% );
3636$selectionBackgroundColor: lighten( $linkColor, 25% );
3737
38−$heading1Size: 2.5em;
39−$heading2Size: 1.6em;
40−$heading3Size: 1.3em;
41−$heading4Size: 1.0em;
38+$heading1Size: 1.6em;
39+$heading2Size: 1.3em;
40+$heading3Size: 1.0em;
41+$heading4Size: 0.8em;
4242
4343section.has-light-background {
4444 &, h1, h2, h3, h4, h5, h6 {
css/theme/source/white.scss → reveal.js/css/theme/source/white.scssrenamed

The content is the same.

css/theme/superblack.css → reveal.js/css/theme/superblack.cssrenamed+9−4
@@ -56,16 +56,16 @@ body {
5656 word-wrap: break-word; }
5757
5858.reveal h1 {
59− font-size: 2.5em; }
59+ font-size: 1.6em; }
6060
6161.reveal h2 {
62− font-size: 1.6em; }
62+ font-size: 1.3em; }
6363
6464.reveal h3 {
65− font-size: 1.3em; }
65+ font-size: 1em; }
6666
6767.reveal h4 {
68− font-size: 1em; }
68+ font-size: 0.8em; }
6969
7070.reveal h1 {
7171 text-shadow: none; }
@@ -283,3 +283,8 @@ body {
283283 border-width: 2px;
284284 border-style: solid;
285285 border-color: #777; }
286+
287+.sourceCode {
288+ background-color: transparent;
289+ overflow: auto;
290+ margin: 0em; }
css/theme/template/mixins.scss → reveal.js/css/theme/template/mixins.scssrenamed

The content is the same.

css/theme/template/settings.scss → reveal.js/css/theme/template/settings.scssrenamed

The content is the same.

css/theme/template/theme.scss → reveal.js/css/theme/template/theme.scssrenamed

The content is the same.

css/theme/white.css → reveal.js/css/theme/white.cssrenamed

The content is the same.

gruntfile.js → reveal.js/gruntfile.jsrenamed

The content is the same.

js/reveal.js → reveal.js/js/reveal.jsrenamed

The content is the same.

js/reveal.min.js → reveal.js/js/reveal.min.jsrenamed+1−1
@@ -1,5 +1,5 @@
11/*!
2− * reveal.js 3.8.0 (2020-01-19, 21:24)
2+ * reveal.js 3.8.0 (2020-01-31, 21:50)
33 * http://revealjs.com
44 * MIT licensed
55 *
lib/css/monokai.css → reveal.js/lib/css/monokai.cssrenamed

The content is the same.

lib/css/zenburn.css → reveal.js/lib/css/zenburn.cssrenamed

The content is the same.

lib/font/hasklig/Hasklig-Black.eot → reveal.js/lib/font/hasklig/Hasklig-Black.eotrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Black.otf → reveal.js/lib/font/hasklig/Hasklig-Black.otfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Black.ttf → reveal.js/lib/font/hasklig/Hasklig-Black.ttfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Black.woff → reveal.js/lib/font/hasklig/Hasklig-Black.woffrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-BlackIt.eot → reveal.js/lib/font/hasklig/Hasklig-BlackIt.eotrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-BlackIt.otf → reveal.js/lib/font/hasklig/Hasklig-BlackIt.otfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-BlackIt.ttf → reveal.js/lib/font/hasklig/Hasklig-BlackIt.ttfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-BlackIt.woff → reveal.js/lib/font/hasklig/Hasklig-BlackIt.woffrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Bold.eot → reveal.js/lib/font/hasklig/Hasklig-Bold.eotrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Bold.otf → reveal.js/lib/font/hasklig/Hasklig-Bold.otfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Bold.ttf → reveal.js/lib/font/hasklig/Hasklig-Bold.ttfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Bold.woff → reveal.js/lib/font/hasklig/Hasklig-Bold.woffrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-BoldIt.eot → reveal.js/lib/font/hasklig/Hasklig-BoldIt.eotrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-BoldIt.otf → reveal.js/lib/font/hasklig/Hasklig-BoldIt.otfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-BoldIt.ttf → reveal.js/lib/font/hasklig/Hasklig-BoldIt.ttfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-BoldIt.woff → reveal.js/lib/font/hasklig/Hasklig-BoldIt.woffrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-ExtraLight.eot → reveal.js/lib/font/hasklig/Hasklig-ExtraLight.eotrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-ExtraLight.otf → reveal.js/lib/font/hasklig/Hasklig-ExtraLight.otfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-ExtraLight.ttf → reveal.js/lib/font/hasklig/Hasklig-ExtraLight.ttfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-ExtraLight.woff → reveal.js/lib/font/hasklig/Hasklig-ExtraLight.woffrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-ExtraLightIt.eot → reveal.js/lib/font/hasklig/Hasklig-ExtraLightIt.eotrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-ExtraLightIt.otf → reveal.js/lib/font/hasklig/Hasklig-ExtraLightIt.otfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-ExtraLightIt.ttf → reveal.js/lib/font/hasklig/Hasklig-ExtraLightIt.ttfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-ExtraLightIt.woff → reveal.js/lib/font/hasklig/Hasklig-ExtraLightIt.woffrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-It.eot → reveal.js/lib/font/hasklig/Hasklig-It.eotrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-It.otf → reveal.js/lib/font/hasklig/Hasklig-It.otfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-It.ttf → reveal.js/lib/font/hasklig/Hasklig-It.ttfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-It.woff → reveal.js/lib/font/hasklig/Hasklig-It.woffrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Light.eot → reveal.js/lib/font/hasklig/Hasklig-Light.eotrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Light.otf → reveal.js/lib/font/hasklig/Hasklig-Light.otfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Light.ttf → reveal.js/lib/font/hasklig/Hasklig-Light.ttfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Light.woff → reveal.js/lib/font/hasklig/Hasklig-Light.woffrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-LightIt.eot → reveal.js/lib/font/hasklig/Hasklig-LightIt.eotrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-LightIt.otf → reveal.js/lib/font/hasklig/Hasklig-LightIt.otfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-LightIt.ttf → reveal.js/lib/font/hasklig/Hasklig-LightIt.ttfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-LightIt.woff → reveal.js/lib/font/hasklig/Hasklig-LightIt.woffrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Medium.eot → reveal.js/lib/font/hasklig/Hasklig-Medium.eotrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Medium.otf → reveal.js/lib/font/hasklig/Hasklig-Medium.otfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Medium.ttf → reveal.js/lib/font/hasklig/Hasklig-Medium.ttfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Medium.woff → reveal.js/lib/font/hasklig/Hasklig-Medium.woffrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-MediumIt.eot → reveal.js/lib/font/hasklig/Hasklig-MediumIt.eotrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-MediumIt.otf → reveal.js/lib/font/hasklig/Hasklig-MediumIt.otfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-MediumIt.ttf → reveal.js/lib/font/hasklig/Hasklig-MediumIt.ttfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-MediumIt.woff → reveal.js/lib/font/hasklig/Hasklig-MediumIt.woffrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Regular.eot → reveal.js/lib/font/hasklig/Hasklig-Regular.eotrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Regular.otf → reveal.js/lib/font/hasklig/Hasklig-Regular.otfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Regular.ttf → reveal.js/lib/font/hasklig/Hasklig-Regular.ttfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Regular.woff → reveal.js/lib/font/hasklig/Hasklig-Regular.woffrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Semibold.eot → reveal.js/lib/font/hasklig/Hasklig-Semibold.eotrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Semibold.otf → reveal.js/lib/font/hasklig/Hasklig-Semibold.otfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Semibold.ttf → reveal.js/lib/font/hasklig/Hasklig-Semibold.ttfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-Semibold.woff → reveal.js/lib/font/hasklig/Hasklig-Semibold.woffrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-SemiboldIt.eot → reveal.js/lib/font/hasklig/Hasklig-SemiboldIt.eotrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-SemiboldIt.otf → reveal.js/lib/font/hasklig/Hasklig-SemiboldIt.otfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-SemiboldIt.ttf → reveal.js/lib/font/hasklig/Hasklig-SemiboldIt.ttfrenamed

Binary file not shown.

lib/font/hasklig/Hasklig-SemiboldIt.woff → reveal.js/lib/font/hasklig/Hasklig-SemiboldIt.woffrenamed

Binary file not shown.

lib/font/hasklig/hasklig.css → reveal.js/lib/font/hasklig/hasklig.cssrenamed

The content is the same.

lib/font/league-gothic/LICENSE → reveal.js/lib/font/league-gothic/LICENSErenamed

The content is the same.

lib/font/league-gothic/league-gothic.css → reveal.js/lib/font/league-gothic/league-gothic.cssrenamed

The content is the same.

lib/font/league-gothic/league-gothic.eot → reveal.js/lib/font/league-gothic/league-gothic.eotrenamed

Binary file not shown.

lib/font/league-gothic/league-gothic.ttf → reveal.js/lib/font/league-gothic/league-gothic.ttfrenamed

Binary file not shown.

lib/font/league-gothic/league-gothic.woff → reveal.js/lib/font/league-gothic/league-gothic.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/LICENSE → reveal.js/lib/font/source-sans-pro/LICENSErenamed

The content is the same.

lib/font/source-sans-pro/SourceSansPro-Black.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-Black.eotrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-Black.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-Black.ttfrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-Black.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-Black.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-BlackItalic.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-BlackItalic.eotrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-BlackItalic.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-BlackItalic.ttfrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-BlackItalic.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-BlackItalic.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-Bold.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-Bold.eotrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-Bold.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-Bold.ttfrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-Bold.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-Bold.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-BoldItalic.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-BoldItalic.eotrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-BoldItalic.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-BoldItalic.ttfrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-BoldItalic.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-BoldItalic.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-ExtraLight.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-ExtraLight.eotrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-ExtraLight.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-ExtraLight.ttfrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-ExtraLight.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-ExtraLight.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-ExtraLightItalic.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-ExtraLightItalic.eotrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-ExtraLightItalic.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-ExtraLightItalic.ttfrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-ExtraLightItalic.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-ExtraLightItalic.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-Italic.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-Italic.eotrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-Italic.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-Italic.ttfrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-Italic.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-Italic.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-Light.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-Light.eotrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-Light.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-Light.ttfrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-Light.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-Light.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-LightItalic.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-LightItalic.eotrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-LightItalic.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-LightItalic.ttfrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-LightItalic.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-LightItalic.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-Regular.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-Regular.eotrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-Regular.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-Regular.ttfrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-Regular.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-Regular.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-SemiBold.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-SemiBold.eotrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-SemiBold.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-SemiBold.ttfrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-SemiBold.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-SemiBold.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-SemiBoldItalic.eot → reveal.js/lib/font/source-sans-pro/SourceSansPro-SemiBoldItalic.eotrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-SemiBoldItalic.ttf → reveal.js/lib/font/source-sans-pro/SourceSansPro-SemiBoldItalic.ttfrenamed

Binary file not shown.

lib/font/source-sans-pro/SourceSansPro-SemiBoldItalic.woff → reveal.js/lib/font/source-sans-pro/SourceSansPro-SemiBoldItalic.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/source-sans-pro-italic.eot → reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.eotrenamed

Binary file not shown.

lib/font/source-sans-pro/source-sans-pro-italic.ttf → reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.ttfrenamed

Binary file not shown.

lib/font/source-sans-pro/source-sans-pro-italic.woff → reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/source-sans-pro-regular.eot → reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.eotrenamed

Binary file not shown.

lib/font/source-sans-pro/source-sans-pro-regular.ttf → reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.ttfrenamed

Binary file not shown.

lib/font/source-sans-pro/source-sans-pro-regular.woff → reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/source-sans-pro-semibold.eot → reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.eotrenamed

Binary file not shown.

lib/font/source-sans-pro/source-sans-pro-semibold.ttf → reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.ttfrenamed

Binary file not shown.

lib/font/source-sans-pro/source-sans-pro-semibold.woff → reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot → reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eotrenamed

Binary file not shown.

lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf → reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttfrenamed

Binary file not shown.

lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff → reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woffrenamed

Binary file not shown.

lib/font/source-sans-pro/source-sans-pro.css → reveal.js/lib/font/source-sans-pro/source-sans-pro.cssrenamed

The content is the same.

lib/js/html5shiv.js → reveal.js/lib/js/html5shiv.jsrenamed

The content is the same.

lib/js/promise.js → reveal.js/lib/js/promise.jsrenamed

The content is the same.

package-lock.json → reveal.js/package-lock.jsonrenamed

The content is the same.

package.json → reveal.js/package.jsonrenamed

The content is the same.

plugin/highlight/highlight.js → reveal.js/plugin/highlight/highlight.jsrenamed

The content is the same.

plugin/markdown/example.html → reveal.js/plugin/markdown/example.htmlrenamed

The content is the same.

plugin/markdown/example.md → reveal.js/plugin/markdown/example.mdrenamed

The content is the same.

plugin/markdown/markdown.js → reveal.js/plugin/markdown/markdown.jsrenamed

The content is the same.

plugin/markdown/marked.js → reveal.js/plugin/markdown/marked.jsrenamed

The content is the same.

plugin/math/math.js → reveal.js/plugin/math/math.jsrenamed

The content is the same.

plugin/multiplex/client.js → reveal.js/plugin/multiplex/client.jsrenamed

The content is the same.

plugin/multiplex/index.js → reveal.js/plugin/multiplex/index.jsrenamed

The content is the same.

plugin/multiplex/master.js → reveal.js/plugin/multiplex/master.jsrenamed

The content is the same.

plugin/multiplex/package.json → reveal.js/plugin/multiplex/package.jsonrenamed

The content is the same.

plugin/notes-server/client.js → reveal.js/plugin/notes-server/client.jsrenamed

The content is the same.

plugin/notes-server/index.js → reveal.js/plugin/notes-server/index.jsrenamed

The content is the same.

plugin/notes-server/notes.html → reveal.js/plugin/notes-server/notes.htmlrenamed

The content is the same.

plugin/notes/notes.html → reveal.js/plugin/notes/notes.htmlrenamed

The content is the same.

plugin/notes/notes.js → reveal.js/plugin/notes/notes.jsrenamed

The content is the same.

plugin/print-pdf/print-pdf.js → reveal.js/plugin/print-pdf/print-pdf.jsrenamed

The content is the same.

plugin/search/search.js → reveal.js/plugin/search/search.jsrenamed

The content is the same.

plugin/zoom-js/zoom.js → reveal.js/plugin/zoom-js/zoom.jsrenamed

The content is the same.

style.htmlnew file+11
@@ -0,0 +1,11 @@
1+<style>
2+ div.sourceCode {
3+ background-color: transparent;
4+ overflow: auto;
5+ margin: 0em;
6+ }
7+
8+ pre.sourceCode {
9+ margin: 8px auto;
10+ }
11+</style>