SlideShare a Scribd company logo
Монады для
Барабанщиков
Антон Холомьёв
(github@anton-k)
Почему так трудно понять монады ?
●
Необычное понятие
●
Синтаксис языка ещё не ясен, но
монады понять нужно
●
Неудобное для новичка
определение монады
●
Из определения неясно, зачем
нужны эти ваши монады
Зачем нужны монады в Haskell ?
def getTwo():
a = getChar()
b = getChar()
return (a, b)
def getOne():
a = getChar()
return (a, a)
Как Haskell видит этот код ?
def getTwo():
return
( getChar()
, getChar() )
def getOne():
return
( getChar()
, getChar() )
Порядок вычисления Haskell
Py Hs
def getTwo():
a = getChar() 1 2
b = getChar() 2 3
return (a, b) 3 1
Py Hs
def getOne():
a = getChar() 1 2
return (a, a) 2 1
Пример противоречий
Py Hs
def dialog():
println('Как вас зовут?') 1
name = getString() 2
println('Привет, ' + name) 3
return () 4 1
Все функции чистые
def getTwo():
a = getChar()
b = getChar()
return (a, b)
def getOne():
a = getChar()
return (a, a)
Почему это не работает в Haskell?
●
Все функции чистые
●
функция строит результат только из
того, что ей передали на входе
●
Результат функции полностью
определяется аргументами
●
Порядок вычисления следует из
функциональных зависимостей
(ленивое вычисление)
Ключевая идея !!!
Монады нужны для задания
порядка вычислений
Если у нас есть оператор порядка
(>>=) :: Expr -> Expr -> Expr
( a = getChar() )
>>= ( return (a, a) )
Если у нас есть оператор порядка
(>>=) :: ???
(getChar() )
>>= (a -> return (a, a) )
IO = Значение + Контекст вычислений
(>>=) :: IO a -> (a -> IO b) -> IO b
( getChar() )
>>= ( a -> return (a, a) )
IO = Значение + Контекст вычислений
(>>=) :: IO a -> (a -> IO b) -> IO b
return :: a -> IO a
( getChar() )
>>= ( a -> return (a, a) )
IO = Значение + Контекст вычислений
data IO a = IO (RealWorld -> (a, RealWorld))
f :: a -> IO b
IO = Значение + Контекст вычислений
Пример с двумя запросами к
пользователю
(>>=) :: IO a -> (a -> IO b) -> IO b
return :: a -> IO a
( getChar() )
>>= ( a -> ( getChar() )
>>= (b -> return (a, b)) )
Зачем нужны монады в Haskell ?
getTwo () =
getChar()
>>= (a -> getChar()
>>= (b -> return (a,b)))
getOne () =
getChar()
>>= (a -> return (a, a))
Do-нотация
getChar ()
>>= (a -> expr(a))
do
a <- getChar()
expr(a)
Do-нотация
getTwo = do
a <- getChar
b <- getChar
return (a, b)
getOne = do
a <- getChar
return (a, a)
Пример противоречий
dialog = do
print "Как вас зовут?"
name <- getString
print ("Привет, " ++ name)
return ()
Do-нотация без аргумента
print "Привет!"
>>= (_ -> expr())
do
print "Привет!"
expr()
Класс Monad
class Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
(>>=) читается как bind
Монада Maybe
data Maybe a = Nothing
| Just a
Композиция частично определённых функций
Монада для Maybe
instance Monad Maybe where
return a = Just a
ma >>= f = case ma of
Nothing -> Nothing
Just a -> f a
Монада List
data [a] = []
| a :: [a]
Композиция многозначных функций
Монада для []
instance Monad [] where
return a = [a]
xs >>= f = concat (map f xs)
Что стоит за оператором >>=
(>>=) :: m a -> (a -> m b) -> m b
(>>=) :: a -> (a -> b) -> b
(=<<) :: (a -> b) -> a -> b :: ($)
(>>=) это ($) для значений в контексте m
с изменённым порядком аргументов
Ключевая идея!
Нет царского пути в геометрию
— Евклид
Узнать больше
●
Monads for drummers
(https://github.com/anton-k/monads-for-drummers )
●
Dan Piponi о Монадах. Перевод на хабре
(http://habrahabr.ru/post/96421/)
●
Антон Холомьёв. Учебник по Haskell (главы 6, 7, 8)
(http://anton-k.github.io/ru-haskell-book/book/toc.html )
●
Philip Wadler. The essence of Functional Programming
●
Simon Peyton Jones. Tackling the awkward squad
(google search)
Благодарю за внимание!
●
github: anton-k
●
email: anton.kholomiov на gmail . com

More Related Content

PDF
Pyton – пробуем функциональный стиль
Python Meetup
 
PPTX
Kotlin
GDG Odessa
 
PPT
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Python Meetup
 
PDF
Красота и изящность стандартной библиотеки Python
Python Meetup
 
PPTX
Функциональное программирование.Списки. Функции высших порядков
Система дистанционного обучения MyDLS
 
PDF
Недостатки Python
Python Meetup
 
PDF
South migration
AyumuKasuga
 
PDF
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
Mail.ru Group
 
Pyton – пробуем функциональный стиль
Python Meetup
 
Kotlin
GDG Odessa
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Python Meetup
 
Красота и изящность стандартной библиотеки Python
Python Meetup
 
Функциональное программирование.Списки. Функции высших порядков
Система дистанционного обучения MyDLS
 
Недостатки Python
Python Meetup
 
South migration
AyumuKasuga
 
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
Mail.ru Group
 

What's hot (20)

PPTX
Java8. Innovations
Nakraynikov Oleg
 
PDF
5.1 Перегрузка операторов
DEVTYPE
 
PPTX
Java 8. Lambdas
Nakraynikov Oleg
 
PDF
2.4 Использование указателей
DEVTYPE
 
PDF
8 встреча — Язык программирования Python (В. Ананьев)
Smolensk Computer Science Club
 
ODP
Charming python sc2-8
Vladislav Ananev
 
PDF
DevConf. Дмитрий Сошников - ECMAScript 6
Dmitry Soshnikov
 
PPTX
Groovy и Grails. Быстро и обо всём
Ruslan Balkin
 
PPTX
Мифы и легенды Java Stream API
CEE-SEC(R)
 
PPTX
C++ осень 2012 лекция 11
Technopark
 
PPTX
Урок 3. Карринг и ленивые вычисления.
Система дистанционного обучения MyDLS
 
PDF
Лекция 4: Стек. Очередь
Mikhail Kurnosov
 
PDF
4.2 Перегрузка
DEVTYPE
 
PDF
Sergii Tsypanov "Performance 1001 Tips"
LogeekNightUkraine
 
PDF
Python dict: прошлое, настоящее, будущее
delimitry
 
PDF
Продолжаем говорить о микрооптимизациях .NET-приложений
Andrey Akinshin
 
PDF
Очень вкусный фрукт Guava
Egor Chernyshev
 
PPTX
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Fedor Lavrentyev
 
PDF
Основы SciPy
Theoretical mechanics department
 
Java8. Innovations
Nakraynikov Oleg
 
5.1 Перегрузка операторов
DEVTYPE
 
Java 8. Lambdas
Nakraynikov Oleg
 
2.4 Использование указателей
DEVTYPE
 
8 встреча — Язык программирования Python (В. Ананьев)
Smolensk Computer Science Club
 
Charming python sc2-8
Vladislav Ananev
 
DevConf. Дмитрий Сошников - ECMAScript 6
Dmitry Soshnikov
 
Groovy и Grails. Быстро и обо всём
Ruslan Balkin
 
Мифы и легенды Java Stream API
CEE-SEC(R)
 
C++ осень 2012 лекция 11
Technopark
 
Урок 3. Карринг и ленивые вычисления.
Система дистанционного обучения MyDLS
 
Лекция 4: Стек. Очередь
Mikhail Kurnosov
 
4.2 Перегрузка
DEVTYPE
 
Sergii Tsypanov "Performance 1001 Tips"
LogeekNightUkraine
 
Python dict: прошлое, настоящее, будущее
delimitry
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Andrey Akinshin
 
Очень вкусный фрукт Guava
Egor Chernyshev
 
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Fedor Lavrentyev
 
Ad

Viewers also liked (20)

PDF
Анонимные записи в Haskell. Никита Волков
Юрий Сыровецкий
 
PDF
Intro to Functional Programming
Hugo Firth
 
PPTX
Category theory, Monads, and Duality in the world of (BIG) Data
greenwop
 
PDF
"Немного о функциональном программирование в JavaScript" Алексей Коваленко
Fwdays
 
PDF
Airbnb tech talk: Levi Weintraub on webkit
naseemh
 
PDF
Who's More Functional: Kotlin, Groovy, Scala, or Java?
Andrey Breslav
 
PDF
Pushing Python: Building a High Throughput, Low Latency System
Kevin Ballard
 
PDF
London React August - GraphQL at The Financial Times - Viktor Charypar
React London Community
 
PDF
CSS/SVG Matrix Transforms
Marc Grabanski
 
PDF
HTML5 Essentials
Marc Grabanski
 
PDF
jQuery Essentials
Marc Grabanski
 
PDF
gevent at TellApart
TellApart
 
PPTX
Functional Programming in JavaScript by Luis Atencio
Luis Atencio
 
PDF
Возможности и проблемы FFI в Haskell. Александр Вершилов
Юрий Сыровецкий
 
PDF
Domain Modeling in a Functional World
Debasish Ghosh
 
PDF
Map, Flatmap and Reduce are Your New Best Friends: Simpler Collections, Concu...
Chris Richardson
 
PPT
Introduction to Functional Programming in JavaScript
tmont
 
PPTX
Introduction to Storm
Chandler Huang
 
PPTX
DNS Security Presentation ISSA
Srikrupa Srivatsan
 
PDF
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013
mumrah
 
Анонимные записи в Haskell. Никита Волков
Юрий Сыровецкий
 
Intro to Functional Programming
Hugo Firth
 
Category theory, Monads, and Duality in the world of (BIG) Data
greenwop
 
"Немного о функциональном программирование в JavaScript" Алексей Коваленко
Fwdays
 
Airbnb tech talk: Levi Weintraub on webkit
naseemh
 
Who's More Functional: Kotlin, Groovy, Scala, or Java?
Andrey Breslav
 
Pushing Python: Building a High Throughput, Low Latency System
Kevin Ballard
 
London React August - GraphQL at The Financial Times - Viktor Charypar
React London Community
 
CSS/SVG Matrix Transforms
Marc Grabanski
 
HTML5 Essentials
Marc Grabanski
 
jQuery Essentials
Marc Grabanski
 
gevent at TellApart
TellApart
 
Functional Programming in JavaScript by Luis Atencio
Luis Atencio
 
Возможности и проблемы FFI в Haskell. Александр Вершилов
Юрий Сыровецкий
 
Domain Modeling in a Functional World
Debasish Ghosh
 
Map, Flatmap and Reduce are Your New Best Friends: Simpler Collections, Concu...
Chris Richardson
 
Introduction to Functional Programming in JavaScript
tmont
 
Introduction to Storm
Chandler Huang
 
DNS Security Presentation ISSA
Srikrupa Srivatsan
 
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013
mumrah
 
Ad

Similar to Монады для барабанщиков. Антон Холомьёв (7)

PDF
Haskell Type System with Dzmitry Ivashnev.
Sergey Tihon
 
PDF
Интерпретирование языков с помощью Free-монад
Zheka Kozlov
 
PPTX
Functional Programing
Max Arshinov
 
PDF
fp intro
Ivan Glushkov
 
PPT
Rgsu04
EvgeniyaOstr
 
PPT
Rgsu04
EvgeniyaOstr
 
PPTX
десант презентация
Андрей Голованов
 
Haskell Type System with Dzmitry Ivashnev.
Sergey Tihon
 
Интерпретирование языков с помощью Free-монад
Zheka Kozlov
 
Functional Programing
Max Arshinov
 
fp intro
Ivan Glushkov
 
Rgsu04
EvgeniyaOstr
 
Rgsu04
EvgeniyaOstr
 
десант презентация
Андрей Голованов
 

Монады для барабанщиков. Антон Холомьёв