SlideShare a Scribd company logo
1 of 12
Download to read offline
Haskell это...
Простой синтаксис.
Статическая типизация. Но не навязчивая.
Списки. Программирование без циклов и
переменных.
Списки, Maybe и другие алгебраические типы.
Функциональное программирование, рекурсия,
иммутабельность.
Развитая инфраструктура, REPL.
1
Простой синтаксис.
-- Факториал
factorial 0 = 1
factorial n = n * factorial (n-1)
-- Числа Фибоначи
fib n =
let
fib1 (x1,x2) 0 = x2
fib1 (x1,x2) n = fib1 (x2,x1+x2) (n-1)
in
fib1 (0,1) n
-- Или так
fib n = fib1 (0,1) n
where
fib1 (x1,x2) 0 = x2
fib1 (x1,x2) n = fib1 (x2,x1+x2) (n-1)
-- Hellow, world
main = print "Hello, world!"
2
Ненавязчивая типизация -- вывод типов.
main = print (factorial 17)
-- правильно компилируется
main = print (factorial "17")
-- Ошибка
-- No instance for (Num [Char]) arising from a use
-- Possible fix: add an instance declaration for (N
-- In the expression: factorial "17"
-- In an equation for `it': it = factorial "17"
3
Hoogle. Тип как документация:
4
Списки -- функции для обработки
-- применить функцию ко всем элементам списка
map :: (a -> b) -> [a] -> [b]
-- вычислить агрегатную функцию, сворачивающую два
foldr :: (a -> b -> b) -> b -> [a] -> b
-- аналогично для непустых списков
foldr1 :: (a -> a -> a) -> [a] -> a
-- первый элемент списка
head :: [a] -> a
-- список без первого элемента
tail :: [a] -> [a]
5
Списки
factorial n = product [1..n]
factorial n = foldr (*) 1 [1..n]
sumList l1 l2 = zipWith (+) l1 l2
-- умножение вестора на число
scale v l = map ((*) v) l
-- умножение матриц
mmul x y =
map (l ->
foldr1 sumList (zipWith scale l y)) x
6
Списки -- DIY
-- List a - [a]
-- Nil - []
-- Cons a b - a:b
data List a = Nil | Cons a (List a)
isEmpty Nil = True
isEmpty (Cons h t) = False
headOfList Nil = error "а списочек то пуст"
headOfList (Cons h t) = h
tailOfList Nil = error "а списочек то пуст"
tailOfList (Cons h t) = t
7
Другие стандартные контейнеры
data Maybe a = Nothing | Just a
data Either a b = Left a | Right b
data (,) a b = (,) a b
8
Рекурсия и ленивость
fib = 1:1:(zitWith (+) fib (1:fib))
product (take 10000 fib) -- произведение первых 100
9
Рекурсия и ленивость -- ссылки назад
data Expr = I Int | V String | (:+) Expr Expr
infixr 7 :+
lookupVar var ((name,value):rest)
| var == name = value
| True = lookupVar var rest
evalExprs exprs = result where
result = map vareval exprs
vareval (name, expr) = (name, (eval expr))
eval (I val) = val
eval (V var) = (lookupVar var result)
eval (x :+ y) = (eval x) + (eval y)
10
Парсеры.
-- Как минимум
type Parser result = String -> result
-- Мы можем распарсить не все
type Parser result = String -> (result,String)
-- или вообще не распарсить
type Parser result = String -> Maybe (result,String)
-- ... или не однозначно
type Parser result = String -> [(result,String)]
-- получает любой символ из потока
anyChar :: Parser Char
anyChar (c:r) = [(c,r)]
anyChar [] = []
-- получает только заданный символ
char :: Char -> Parser ()
char c (s:r) | c == s = [((),r)]
char c t = []
11
Парсеры -- комбинаторы.
-- последовательность
(<&>) :: Parser a -> Parser b -> Parser (a,b)
p1 <&> p2 = s ->
[((res1,res2), rest2) |
(res1,rest1) <- p1 s,
(res2,rest2) <- p2 rest1]
-- альтернатива
(<|>) :: Parser a -> Parser a -> Parser a
p1 <|> p2 = s -> (p1 s) ++ (p2 s)
На самом деле все сложнее. Но тонкости учтены
в библиотеке Parseq!
12

More Related Content

What's hot

Podgotovka k egje_po_matematike_zadacha_v8
Podgotovka k egje_po_matematike_zadacha_v8Podgotovka k egje_po_matematike_zadacha_v8
Podgotovka k egje_po_matematike_zadacha_v8Dimon4
 
Открытый урок
Открытый урокОткрытый урок
Открытый урокDbeshenov
 
Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Sergey Tihon
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьMikhail Kurnosov
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадZheka Kozlov
 
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очередиMikhail Kurnosov
 
массивы
массивымассивы
массивыsvetlanamu
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskellhusniyarova
 
Массивы
МассивыМассивы
МассивыDbeshenov
 
4 b stepennye fukcii
4 b stepennye fukcii4 b stepennye fukcii
4 b stepennye fukciiNarvatk
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Mikhail Kurnosov
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотекPyNSK
 
ОПК № 2 – Алгоритмы и структуры данных, язык C
ОПК № 2 – Алгоритмы и структуры данных, язык CОПК № 2 – Алгоритмы и структуры данных, язык C
ОПК № 2 – Алгоритмы и структуры данных, язык CVladimir Parfinenko
 
лабораторная работа №5
лабораторная работа №5лабораторная работа №5
лабораторная работа №5Zhanna Kazakova
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython Meetup
 

What's hot (20)

Podgotovka k egje_po_matematike_zadacha_v8
Podgotovka k egje_po_matematike_zadacha_v8Podgotovka k egje_po_matematike_zadacha_v8
Podgotovka k egje_po_matematike_zadacha_v8
 
Открытый урок
Открытый урокОткрытый урок
Открытый урок
 
PHP7 - что ожидать?
PHP7 - что ожидать?PHP7 - что ожидать?
PHP7 - что ожидать?
 
Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. Очередь
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
 
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очереди
 
массивы
массивымассивы
массивы
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskell
 
Урок 6. Чистое лямбда-исчисление.
Урок 6. Чистое лямбда-исчисление. Урок 6. Чистое лямбда-исчисление.
Урок 6. Чистое лямбда-исчисление.
 
Массивы
МассивыМассивы
Массивы
 
4 b stepennye fukcii
4 b stepennye fukcii4 b stepennye fukcii
4 b stepennye fukcii
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
ОПК № 2 – Алгоритмы и структуры данных, язык C
ОПК № 2 – Алгоритмы и структуры данных, язык CОПК № 2 – Алгоритмы и структуры данных, язык C
ОПК № 2 – Алгоритмы и структуры данных, язык C
 
лабораторная работа №5
лабораторная работа №5лабораторная работа №5
лабораторная работа №5
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Kotlin
KotlinKotlin
Kotlin
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
 
Tarantool_qs
 Tarantool_qs Tarantool_qs
Tarantool_qs
 

Similar to Обработка текста на Haskell - это просто!

производящие функции(продолжение)
производящие функции(продолжение)производящие функции(продолжение)
производящие функции(продолжение)Mariya_Lastochkina
 
Haskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell languageHaskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell languageAlexander Granin
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 6 Элементарные структуры данных часть 4
Лекция 6 Элементарные структуры данных часть 4Лекция 6 Элементарные структуры данных часть 4
Лекция 6 Элементарные структуры данных часть 4simple_people
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки PythonPython Meetup
 
L11: Метод ансамблей
L11: Метод ансамблейL11: Метод ансамблей
L11: Метод ансамблейTechnosphere1
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Fwdays
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#akrakovetsky
 

Similar to Обработка текста на Haskell - это просто! (17)

Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графов
 
Функциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядковФункциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядков
 
Scala
ScalaScala
Scala
 
производящие функции(продолжение)
производящие функции(продолжение)производящие функции(продолжение)
производящие функции(продолжение)
 
Haskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell languageHaskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell language
 
Урок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". КлассыУрок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". Классы
 
Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 6 Элементарные структуры данных часть 4
Лекция 6 Элементарные структуры данных часть 4Лекция 6 Элементарные структуры данных часть 4
Лекция 6 Элементарные структуры данных часть 4
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки Python
 
Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)
 
L11: Метод ансамблей
L11: Метод ансамблейL11: Метод ансамблей
L11: Метод ансамблей
 
функционал
функционалфункционал
функционал
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
 

Обработка текста на Haskell - это просто!

  • 1. Haskell это... Простой синтаксис. Статическая типизация. Но не навязчивая. Списки. Программирование без циклов и переменных. Списки, Maybe и другие алгебраические типы. Функциональное программирование, рекурсия, иммутабельность. Развитая инфраструктура, REPL. 1
  • 2. Простой синтаксис. -- Факториал factorial 0 = 1 factorial n = n * factorial (n-1) -- Числа Фибоначи fib n = let fib1 (x1,x2) 0 = x2 fib1 (x1,x2) n = fib1 (x2,x1+x2) (n-1) in fib1 (0,1) n -- Или так fib n = fib1 (0,1) n where fib1 (x1,x2) 0 = x2 fib1 (x1,x2) n = fib1 (x2,x1+x2) (n-1) -- Hellow, world main = print "Hello, world!" 2
  • 3. Ненавязчивая типизация -- вывод типов. main = print (factorial 17) -- правильно компилируется main = print (factorial "17") -- Ошибка -- No instance for (Num [Char]) arising from a use -- Possible fix: add an instance declaration for (N -- In the expression: factorial "17" -- In an equation for `it': it = factorial "17" 3
  • 4. Hoogle. Тип как документация: 4
  • 5. Списки -- функции для обработки -- применить функцию ко всем элементам списка map :: (a -> b) -> [a] -> [b] -- вычислить агрегатную функцию, сворачивающую два foldr :: (a -> b -> b) -> b -> [a] -> b -- аналогично для непустых списков foldr1 :: (a -> a -> a) -> [a] -> a -- первый элемент списка head :: [a] -> a -- список без первого элемента tail :: [a] -> [a] 5
  • 6. Списки factorial n = product [1..n] factorial n = foldr (*) 1 [1..n] sumList l1 l2 = zipWith (+) l1 l2 -- умножение вестора на число scale v l = map ((*) v) l -- умножение матриц mmul x y = map (l -> foldr1 sumList (zipWith scale l y)) x 6
  • 7. Списки -- DIY -- List a - [a] -- Nil - [] -- Cons a b - a:b data List a = Nil | Cons a (List a) isEmpty Nil = True isEmpty (Cons h t) = False headOfList Nil = error "а списочек то пуст" headOfList (Cons h t) = h tailOfList Nil = error "а списочек то пуст" tailOfList (Cons h t) = t 7
  • 8. Другие стандартные контейнеры data Maybe a = Nothing | Just a data Either a b = Left a | Right b data (,) a b = (,) a b 8
  • 9. Рекурсия и ленивость fib = 1:1:(zitWith (+) fib (1:fib)) product (take 10000 fib) -- произведение первых 100 9
  • 10. Рекурсия и ленивость -- ссылки назад data Expr = I Int | V String | (:+) Expr Expr infixr 7 :+ lookupVar var ((name,value):rest) | var == name = value | True = lookupVar var rest evalExprs exprs = result where result = map vareval exprs vareval (name, expr) = (name, (eval expr)) eval (I val) = val eval (V var) = (lookupVar var result) eval (x :+ y) = (eval x) + (eval y) 10
  • 11. Парсеры. -- Как минимум type Parser result = String -> result -- Мы можем распарсить не все type Parser result = String -> (result,String) -- или вообще не распарсить type Parser result = String -> Maybe (result,String) -- ... или не однозначно type Parser result = String -> [(result,String)] -- получает любой символ из потока anyChar :: Parser Char anyChar (c:r) = [(c,r)] anyChar [] = [] -- получает только заданный символ char :: Char -> Parser () char c (s:r) | c == s = [((),r)] char c t = [] 11
  • 12. Парсеры -- комбинаторы. -- последовательность (<&>) :: Parser a -> Parser b -> Parser (a,b) p1 <&> p2 = s -> [((res1,res2), rest2) | (res1,rest1) <- p1 s, (res2,rest2) <- p2 rest1] -- альтернатива (<|>) :: Parser a -> Parser a -> Parser a p1 <|> p2 = s -> (p1 s) ++ (p2 s) На самом деле все сложнее. Но тонкости учтены в библиотеке Parseq! 12