-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathlecture14_final.tex
169 lines (156 loc) · 10.3 KB
/
lecture14_final.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
% !TeX document-id = {fc72019d-d3ba-4743-9e76-a08bcafbe161}
% !TeX TXS-program:compile = txs:///pdflatex/[-shell-escape]
\documentclass[11pt]{beamer}
\input{lecture_preamble.tex}
\title{Лекция 14: что дальше?}
\begin{document}
\begin{frame}[plain]
\maketitle
\end{frame}
\begin{frame}[fragile]
\frametitle{Нерассмотренные части Haskell: стандартные библиотеки}
\begin{itemize}
\item В самом начале упоминалось, что тип \haskinline{String} очень плох для практического использования. Альтернативы в пакетах \hackage{text} и \hackage{bytestring}.
\item Коллекции:
\begin{itemize}
\item \hackage{containers}: \haskinline|Data.Map|, \haskinline|Data.Set|, \haskinline|Data.Sequence|.
\item \hackage{unordered-containers}: \haskinline|Data.Hash{Map/Set}|.
\item Массивы: \hackage{array} и \hackage{vector}.
\end{itemize}
\item Комбинаторы парсеров: \hackage{megaparsec}.
\item Сборка проектов и управление зависимостями: \href{https://cabal.readthedocs.io/en/stable/}{cabal} и \href{https://docs.haskellstack.org/en/stable/}{stack}.
\item Линзы (\hackage{lens}): обобщение геттеров и сеттеров.
\item Альтернативы \haskinline|show| для больших структур: \hackage{pretty-show} и \hackage{prettyprinter}.
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Нерассмотренные части Haskell: язык}
\begin{itemize}
\item \href{https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#type-families}{Семейства типов}.
\item \href{https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#arbitrary-rank-polymorphism}{Типы высших рангов} с \haskinline|forall| \emph{внутри} типа.
\begin{itemize}
\item Важный пример: монада \haskinline|ST|.
\end{itemize}
\item \href{https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#existentially-quantified-data-constructors}{Экзистенциальные типы} (выраженные всё равно через \haskinline|forall|).
\item \href{https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#pattern-synonyms}{Синонимы образцов}.
\item \href{https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#template-haskell}{Template Haskell}: генерация кода во время компиляции.
\begin{itemize}
\item Могли видеть использование в документации QuickCheck/Hedgehog.
\end{itemize}
\item Исключения.
\item Foreign Function Interface для интеграции с C.
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Подходы к эффектам}
\begin{itemize}
\item Многие монады (и аппликативные функторы) можно рассматривать как побочные эффекты.
\begin{itemize}
\item \haskinline|IO|: понятно.
\item \haskinline|State|: чтение и запись в память.
\item \haskinline|[]|: недетерминированность
\item \ldots
\end{itemize}
\pause
\item Как их комбинировать?
\item Композиция монад не обязательно монада.
\pause
\item Трансформеры монад: \hackage{transformers} и \hackage{mtl}
\item Алгебраические эффекты
\item Свободные (free) и \enquote{более свободные} (freer) монады
\item Небольшой обзор: \href{https://ocharles.org.uk/posts/2016-01-26-transformers-free-monads-mtl-laws.html}{Monad transformers, free monads, mtl, laws and a new approach}
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Функциональные структуры данных}
\begin{itemize}
\item Функциональные структуры данных очень отличаются от привычных!
\item Классическая книга: Okasaki, Purely functional data structures
\item \href{https://cstheory.stackexchange.com/questions/1539/whats-new-in-purely-functional-data-structures-since-okasaki}{Список \enquote{после Окасаки} (2010)}. И \href{https://www.reddit.com/r/haskell/comments/a4wk1i/seminal_works_after_purely_functional_data/ebm30ra/}{ещё немного}.
\pause
\item Функциональные структуры, позволяющие доступ к своим старым состояниям, полезны и в императивных языках.
\begin{itemize}
\item А изменяемые "--- в Haskell через \haskinline|IO| или \haskinline|ST|.
\end{itemize}
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Будущее Haskell}
\begin{itemize}
\item \href{https://www.tweag.io/posts/2017-03-13-linear-types.html}{Линейные типы}: значения, которые могут быть использованы только один раз.
\begin{itemize}
\item Меньше сборки мусора.
\item Можно использовать изменяемые структуры данных.
\item Безопасное изменение состояния типа (например, тип файла может включать, открыт ли он).
\end{itemize}
\pause
\item \href{https://serokell.io/blog/2018/12/17/why-dependent-haskell}{Зависимые типы}: типы, параметризованные значениями.
\begin{itemize}
\item Стандартный пример: вектор с размером в типе.
\item Библиотека \hackage{singletons} позволяет эмулировать многие применения зависимых типов.
\end{itemize}
\pause
\item Не совсем будущее: уточнённые типы (refinement types) в Liquid Haskell.
\begin{itemize}
\item \href{https://ruhaskell.org/posts/utils/2016/12/16/liquidhaskell-hello.html}{LiquidHaskell: знакомство} и \href{https://liquid.kosmikus.org/}{Liquid Haskell Tutorial}
\end{itemize}
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Альтернативы Haskell}
\begin{itemize}
\item OCaml: похож на Haskell без ленивости и (пока) классов типов.
\item Erlang: динамический функциональный язык, ориентированный на многозадачность.
\item Варианты Lisp (можно посмотреть Racket).
\pause
\item Для JVM: Scala, Clojure.
\item Для .Net: F\# (почти тот же OCaml).
\pause
\item ФП без сборщика мусора: Rust.
\begin{itemize}
\item Мощная и интересная система типов, описывающая время жизни значений.
\item Очень быстрое развитие.
\item Реальная альтернатива C++ для низкоуровневого программирования.
\end{itemize}
\pause
\item Языки с зависимыми типами: Agda, Idris, Coq.
\pause
\item Языки спецификаций: TLA+, Alloy.
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Области математики, связанные с ФП}
\begin{itemize}
\item Лямбда-исчисление: то, с чего всё началось.
\begin{itemize}
\item И множество его обобщений.
\end{itemize}
\pause
\item Математическая логика в целом
\begin{itemize}
\item Логики высших порядков.
\item Изоморфизм Карри-Ховарда.
\item Формализация математики.
\item И автоматический поиск доказательств.
\item Agda, Idris и Coq сюда же!
\end{itemize}
\pause
\item Теория категорий: источник понятий функтора, монады, естественного преобразования.
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Дополнительное чтение}
\begin{itemize}
\item \href{http://dev.stephendiehl.com/hask/}{What I Wish I Knew When Learning Haskell}
\item \href{https://lexi-lambda.github.io/blog/2018/02/10/an-opinionated-guide-to-haskell-in-2018/}{An opinionated guide to Haskell in 2018}
\item \href{https://realworldocaml.org/}{Real World OCaml: Functional Programming for the Masses} (книга, доступна бесплатно)
\item \href{https://wiki.portal.chalmers.se/agda/pmwiki.php?n=Main.Documentation}{Много ссылок по Agda}
\item \href{http://docs.idris-lang.org/en/latest/tutorial/index.html}{Введение в Idris}
\item \href{https://doc.rust-lang.org/1.30.0/book/2018-edition/index.html}{The Rust Programming Language} (книга, доступна бесплатно)
\item \href{https://github.com/hmemcpy/milewski-ctfp-pdf}{Category Theory for Programmers} (книга, доступна бесплатно)
\item \href{https://www.hillelwayne.com/post/theorem-prover-showdown/}{The Great Theorem Prover Showdown}
\item \href{https://blog.acolyer.org/2014/11/24/use-of-formal-methods-at-amazon-web-services/}{Use of Formal Methods at Amazon Web Services}
\item \href{https://blog.acolyer.org/2015/01/12/how-to-write-a-21st-century-proof/}{How to write a 21st Century Proof}
\end{itemize}
\end{frame}
\end{document}