SlideShare ist ein Scribd-Unternehmen logo
1 von 25
Downloaden Sie, um offline zu lesen
Введение в функциональное
программирование

ivan.glushkov@gmail.com!
@gliush

31.01.2014
Императивное программирование
✤

Последовательность модификаций состояния!

✤

начальное значение S0 (входные значения)!

✤

конечное значение Sn (конечное значение)!

✤

модификация с помощью команд присваивания!

✤

Sn = f(S0)!

✤

абстрагирование от низкоуровневых деталей
Функциональное программирование
✤

вся программа - одно [матем.] выражение!

✤

выполнение - вычисление значения выражения!

✤

языковые конструкции для облегчения чтения и
написания программ!

✤

абстрактная система для записи алгоритма ->
перевод на императивный язык низкого уровня
Отличительные особенности ФП
✤

не используют “переменные”!

✤

нет оператора присваивания!

✤

нет циклов!

✤

функции - обычные значения!

✤

рекурсия!

✤

могут напрямую соответствовать матем. объектам
Примеры
✤

Всеми любимый пример “факториал”!

✤

Сама функция:

foo n = if n == 0 then 1 else n * foo (n-1)!

✤

Матем. описание:

f(n):

n! n >= 0

n<0
Функции императивных языков

✤

значение зависит не только от аргументов!

✤

результатом могут быть побочные эффекты!

✤

два вызова могут приводить к разному результату!

✤

вывод: это не функции в математическом смысле
Лямбда-исчисление (lambda calculus)
✤

создана в начале 30х годов!

✤

формализация для написания программ!

✤

простая модель для рекурсии и вложенных сред!

✤

лямбда выражения (анонимные функции)!
Введение в лямбда-исчисление:
лямбда-терм
✤

Переменные!

✤

Константы!

✤

Комбинации: применение функции S к аргументу T: (S T). И S и T могут быть произвольными лямбда-термами!

✤

Абстракции произвольного лямбда терма S по переменной x: λ x . S!

✤

Exp = Var | Const | Exp Exp | λ Var . Exp!

✤

Представляется в виде дерева, а не строки. Поэтому любые
договоренности написания - не часть формальной системы.
Введение в лямбда-исчисление:
обзор
✤

Свободные и связанные переменные:

S = (λ x y . x) (λ x . z x) => FV(S) = {z}, BV(S) = {x,y}!

✤

Подстановки

применение λx.S к аргументу T дает S[x := T]!

✤

Каррирование (R -> R -> R) = (R -> (R -> R))

(λ x y . x + y) 1 2 = (λ y . 1 + y) 2 = 1 + 2 = 3
Введение в лямбда-исчисление:
преобразования
✤

Альфа-преобразование: 

λ x . S -> λ y . S [x := y], if y ∉ FV(T)!

✤

Бета-преобразование:

(λ x .S) T -> S [x := T]!

✤

Эта-преобразование: 

λ x . T x -> T, if x ∉ FV(T)!

✤

позволяют переходить к эквивалентному терму!

✤

равенство лямбда-термов!

✤

редукция лямбда-термов, в том числе к “нормальной” форме
Введение в лямбда-исчисление:
пример Bool значений и условий
✤

Bool - тип, представляющий функцию от двух переменных

true ~> λ x y . x

false ~> λ x y . y!

✤

if E then E1 else E2 ~> E E1 E2

Пример:

if true then E1 else E2 

= true E1 E2 

= (λ x y . x) E1 E2 

= λ y . E1 = E1!

✤

not p = if p then false else true

p and q = if p then q else false

p or q = if p then true else q
Введение в лямбда-исчисление:
пример натуральных чисел
✤

Любое натуральное число N - это выполнение функции
suc n раз:

n = suc (suc (suc … (0)) …)!

✤

Достаточно определить

suc

iszero

чтобы поддержать

m + n

m * n

pre n
Введение в лямбда-исчисление:
типизация
✤

дают ясное представление о функции, если знать
область определения и значений!

✤

эффективность (int8, int64) по mem и по cpu!

✤

статическая проверка программ!

✤

модульность и скрытие данных!

✤

позволяют обойти некоторые мат. противоречия
типизация в ЯП
✤

строгая типизация - мягкая типизация

int a[] = {1,2,3,4.0}; /* c - it’s ok */

let a = [1,2,3,4.0] - - haskell - not ok

A = [1,2,3,4,”hello”, [“world”]]. % erlang - it’s ok!

✤

динамическая типизация - статическая типизация!

✤

полиморфизм типов!

✤

автоматический вывод типов
Типизированное лямбда-исчисление
✤

Каждый лямбда-терм имеет тип!

✤

терм S можно применить к терму T, если их типы
правильно соотносятся (сильная типизация):

S :: a -> b

T :: a

S T :: b!

✤

Базовые типы: Int, Bool!

✤

Конструктор типов: Int; Bool; Bool -> Bool; [Bool] -> Bool
Отложенные (ленивые) вычисления
✤

(λ x . x + x + x) (10 + 5):

(10 + 5) + (10 + 5) + (10 + 5) - нормальная редукция

(15 + 15 + 15) - передача по значению!

✤

Передача по значению обычно более эффективна

необходима для гибридных языков!

✤

Вызов по необходимости позволяет исп. ленивые вычисления!

✤

bottom = bottom - - Haskell: никогда не завершится

const1 x = 1
- - нет необходимости проверять аргумент

const1 bottom -> 1

const1 (1/0) -> 1!

✤

Плата: снижение эффективности при сохранении отложенных вычислений
Пример ленивых вычислений
✤

ones = 1 : ones

numsFrom n = n : numsFrom (n+1)

square x = x^2

squres = map square (numsFrom 1)!

✤

take 5 (numsFrom 1) -> [1,2,3,4,5]!

✤

take 5 squares -> [1,4,9,16,25]
real world функции
✤

как в чисто функциональном языке сделать print?!

✤

сравнение функции random:

/* c-like, нет входа, случайный результат */

long random(void); 



- - haskell: generator as input, new generator as output

random :: RandomGen g => g -> (a, g)
Введение в haskell
✤

статическая типизация:

тип объекта фиксируется в момент компиляции!

✤

строгая типизация (imp. статическая типизация):

строго определенные типы для любых операций

присваивание переменной только значения того же типа

не допускается неявное преобразование типов!

✤

чистый язык: детерменированность и отсутствие
побочных эффектов
Синтаксис haskell
✤

идентификаторы: someFunction, foo, foo’, abc123.

Каждому идентификатору можно сопоставить тип!

✤

Знаки операций, приоритеты между ними:

+ , - , * , / , ++!

✤

clause функций

factorial 0 = 1

factorial n = n * factorial (n-1)!

✤

guards

factorial n | n == 0 = 1

| otherwise = n * factorial (n - 1)!

✤

indentation!

✤

backquote:

div 10 5 -> 2

10 `div` 5 -> 2
Введение в haskell 2
✤

элементарные типы: Int, Bool, Char, Float!

✤

Конструкторы типов: кортежи (tuples), списки,

random :: g -> (a,g)

map :: (a->b) -> [a] -> [b]!

✤

алгебраические типы данных (ADT):

data Maybe a = Just a | Nothing!
haskell tools

!

✤

hoogle search!

✤

ghci repl!

✤

ghc compiler extensions
Недостатки

✤

сложность восприятия!

✤

gc mem!

✤

gc cpu
списки как пример простоты

“ядра языка” haskell
✤

Поддержка - на уровне библиотек.!

✤

Работа со списками

[]

[1,2,3]

1:[2,3]

[1,2] ++ [3]

(1:(2:(3:([]))))!

✤

map :: (a -> b) -> [a] -> [b]

foldl :: (a -> b -> a) -> a -> [b] -> a

head :: [a] -> a

tail :: [a] -> [a]

length :: [a] -> Int

null :: [a] -> Bool!

✤

foldl (+) 0 [1,2,3,4]
map (^2) [1,2,3,4]
head [1,2,3,4]
tail [1,2,3,4]

-> 10

-> [1,4,9,16]

-> 1

-> [2,3,4]
Вопросы?

✤

ivan.glushkov@gmail.com!

✤

facebook: gliush!

✤

twitter: @gliush

Weitere ähnliche Inhalte

Was ist angesagt?

практика 4
практика 4практика 4
практика 4
student_kai
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli types
mcroitor
 
22 pascal urok_6
22 pascal urok_622 pascal urok_6
22 pascal urok_6
Ann Eres
 

Was ist angesagt? (20)

Step 2
Step 2Step 2
Step 2
 
Функциональное программирование и Clojure
Функциональное программирование и ClojureФункциональное программирование и Clojure
Функциональное программирование и Clojure
 
практика 4
практика 4практика 4
практика 4
 
Введение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКА
Введение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКАВведение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКА
Введение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКА
 
Swift, основы (в разрезе Enums)
Swift, основы (в разрезе Enums)Swift, основы (в разрезе Enums)
Swift, основы (в разрезе Enums)
 
TeaVM: dead code elimination and devirtualization
TeaVM: dead code elimination and devirtualizationTeaVM: dead code elimination and devirtualization
TeaVM: dead code elimination and devirtualization
 
TMPA-2015: Lexical analysis of dynamically formed string expressions
TMPA-2015: Lexical analysis of dynamically formed string expressionsTMPA-2015: Lexical analysis of dynamically formed string expressions
TMPA-2015: Lexical analysis of dynamically formed string expressions
 
Razbiraemsya s preobrazovaniem_tipov
Razbiraemsya s preobrazovaniem_tipovRazbiraemsya s preobrazovaniem_tipov
Razbiraemsya s preobrazovaniem_tipov
 
Евгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в HaskellЕвгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в Haskell
 
алгоритм
алгоритмалгоритм
алгоритм
 
Типы данных (продолжение). Операторы. Стандартные библиотеки
Типы данных (продолжение). Операторы. Стандартные библиотекиТипы данных (продолжение). Операторы. Стандартные библиотеки
Типы данных (продолжение). Операторы. Стандартные библиотеки
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli types
 
Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графов
 
язык програмирования
язык програмированияязык програмирования
язык програмирования
 
структура программы
структура программыструктура программы
структура программы
 
приближение функций
приближение функцийприближение функций
приближение функций
 
моап 2011 04
моап 2011 04моап 2011 04
моап 2011 04
 
Java8 seminar
Java8 seminarJava8 seminar
Java8 seminar
 
22 pascal urok_6
22 pascal urok_622 pascal urok_6
22 pascal urok_6
 
OOP in JavaScript - Presentation by Eugene Kalosha
OOP in JavaScript - Presentation by Eugene KaloshaOOP in JavaScript - Presentation by Eugene Kalosha
OOP in JavaScript - Presentation by Eugene Kalosha
 

Andere mochten auch

Andere mochten auch (6)

Out for Undergraduate Technology Conference Keynote
Out for Undergraduate Technology Conference KeynoteOut for Undergraduate Technology Conference Keynote
Out for Undergraduate Technology Conference Keynote
 
Learn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionLearn BEM: CSS Naming Convention
Learn BEM: CSS Naming Convention
 
How to Build a Dynamic Social Media Plan
How to Build a Dynamic Social Media PlanHow to Build a Dynamic Social Media Plan
How to Build a Dynamic Social Media Plan
 
SEO: Getting Personal
SEO: Getting PersonalSEO: Getting Personal
SEO: Getting Personal
 
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika AldabaLightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
 
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job? Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
 

Ähnlich wie fp intro

PetrKerzum (Yandex) @ CodeCamp2011
PetrKerzum (Yandex) @ CodeCamp2011PetrKerzum (Yandex) @ CodeCamp2011
PetrKerzum (Yandex) @ CodeCamp2011
CodeCamp
 
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Nikolay Grebenshikov
 
элементы языка и типы данных
элементы языка и типы данныхэлементы языка и типы данных
элементы языка и типы данных
Елена Ключева
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
01 - Знакомство с Java
01 - Знакомство с Java01 - Знакомство с Java
01 - Знакомство с Java
phearnot
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
corehard_by
 
Типы данных
Типы данныхТипы данных
Типы данных
OlgaDask
 
введение в паскаль
введение в паскальвведение в паскаль
введение в паскаль
isva69
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 

Ähnlich wie fp intro (20)

PetrKerzum (Yandex) @ CodeCamp2011
PetrKerzum (Yandex) @ CodeCamp2011PetrKerzum (Yandex) @ CodeCamp2011
PetrKerzum (Yandex) @ CodeCamp2011
 
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
 
элементы языка и типы данных
элементы языка и типы данныхэлементы языка и типы данных
элементы языка и типы данных
 
Об одном методе автоматической транскрипции
Об одном методе автоматической транскрипцииОб одном методе автоматической транскрипции
Об одном методе автоматической транскрипции
 
Haskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell languageHaskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell language
 
Haskell
HaskellHaskell
Haskell
 
Discovering Lambdas (Speech)
Discovering Lambdas (Speech)Discovering Lambdas (Speech)
Discovering Lambdas (Speech)
 
Functional
FunctionalFunctional
Functional
 
Logacheva
LogachevaLogacheva
Logacheva
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
07 string
07 string07 string
07 string
 
язык работы с КМАС (Yafoll сообщение 1)
язык работы с КМАС (Yafoll сообщение 1)язык работы с КМАС (Yafoll сообщение 1)
язык работы с КМАС (Yafoll сообщение 1)
 
01 - Знакомство с Java
01 - Знакомство с Java01 - Знакомство с Java
01 - Знакомство с Java
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
 
Типы данных
Типы данныхТипы данных
Типы данных
 
введение в паскаль
введение в паскальвведение в паскаль
введение в паскаль
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
введение
введениевведение
введение
 
Scala lecture #4
Scala lecture #4Scala lecture #4
Scala lecture #4
 

Mehr von Ivan Glushkov

Mehr von Ivan Glushkov (8)

Distributed tracing with erlang/elixir
Distributed tracing with erlang/elixirDistributed tracing with erlang/elixir
Distributed tracing with erlang/elixir
 
Kubernetes is not needed to 90 percents of the companies.rus
Kubernetes is not needed to 90 percents of the companies.rusKubernetes is not needed to 90 percents of the companies.rus
Kubernetes is not needed to 90 percents of the companies.rus
 
Mystery Machine Overview
Mystery Machine OverviewMystery Machine Overview
Mystery Machine Overview
 
Raft in details
Raft in detailsRaft in details
Raft in details
 
Hashicorp Nomad
Hashicorp NomadHashicorp Nomad
Hashicorp Nomad
 
Google Dataflow Intro
Google Dataflow IntroGoogle Dataflow Intro
Google Dataflow Intro
 
NewSQL overview, Feb 2015
NewSQL overview, Feb 2015NewSQL overview, Feb 2015
NewSQL overview, Feb 2015
 
Comparing ZooKeeper and Consul
Comparing ZooKeeper and ConsulComparing ZooKeeper and Consul
Comparing ZooKeeper and Consul
 

fp intro

  • 2. Императивное программирование ✤ Последовательность модификаций состояния! ✤ начальное значение S0 (входные значения)! ✤ конечное значение Sn (конечное значение)! ✤ модификация с помощью команд присваивания! ✤ Sn = f(S0)! ✤ абстрагирование от низкоуровневых деталей
  • 3. Функциональное программирование ✤ вся программа - одно [матем.] выражение! ✤ выполнение - вычисление значения выражения! ✤ языковые конструкции для облегчения чтения и написания программ! ✤ абстрактная система для записи алгоритма -> перевод на императивный язык низкого уровня
  • 4. Отличительные особенности ФП ✤ не используют “переменные”! ✤ нет оператора присваивания! ✤ нет циклов! ✤ функции - обычные значения! ✤ рекурсия! ✤ могут напрямую соответствовать матем. объектам
  • 5. Примеры ✤ Всеми любимый пример “факториал”! ✤ Сама функция:
 foo n = if n == 0 then 1 else n * foo (n-1)! ✤ Матем. описание:
 f(n):
 n! n >= 0
 n<0
  • 6. Функции императивных языков ✤ значение зависит не только от аргументов! ✤ результатом могут быть побочные эффекты! ✤ два вызова могут приводить к разному результату! ✤ вывод: это не функции в математическом смысле
  • 7. Лямбда-исчисление (lambda calculus) ✤ создана в начале 30х годов! ✤ формализация для написания программ! ✤ простая модель для рекурсии и вложенных сред! ✤ лямбда выражения (анонимные функции)!
  • 8. Введение в лямбда-исчисление: лямбда-терм ✤ Переменные! ✤ Константы! ✤ Комбинации: применение функции S к аргументу T: (S T). И S и T могут быть произвольными лямбда-термами! ✤ Абстракции произвольного лямбда терма S по переменной x: λ x . S! ✤ Exp = Var | Const | Exp Exp | λ Var . Exp! ✤ Представляется в виде дерева, а не строки. Поэтому любые договоренности написания - не часть формальной системы.
  • 9. Введение в лямбда-исчисление: обзор ✤ Свободные и связанные переменные:
 S = (λ x y . x) (λ x . z x) => FV(S) = {z}, BV(S) = {x,y}! ✤ Подстановки
 применение λx.S к аргументу T дает S[x := T]! ✤ Каррирование (R -> R -> R) = (R -> (R -> R))
 (λ x y . x + y) 1 2 = (λ y . 1 + y) 2 = 1 + 2 = 3
  • 10. Введение в лямбда-исчисление: преобразования ✤ Альфа-преобразование: 
 λ x . S -> λ y . S [x := y], if y ∉ FV(T)! ✤ Бета-преобразование:
 (λ x .S) T -> S [x := T]! ✤ Эта-преобразование: 
 λ x . T x -> T, if x ∉ FV(T)! ✤ позволяют переходить к эквивалентному терму! ✤ равенство лямбда-термов! ✤ редукция лямбда-термов, в том числе к “нормальной” форме
  • 11. Введение в лямбда-исчисление: пример Bool значений и условий ✤ Bool - тип, представляющий функцию от двух переменных
 true ~> λ x y . x
 false ~> λ x y . y! ✤ if E then E1 else E2 ~> E E1 E2
 Пример:
 if true then E1 else E2 
 = true E1 E2 
 = (λ x y . x) E1 E2 
 = λ y . E1 = E1! ✤ not p = if p then false else true
 p and q = if p then q else false
 p or q = if p then true else q
  • 12. Введение в лямбда-исчисление: пример натуральных чисел ✤ Любое натуральное число N - это выполнение функции suc n раз:
 n = suc (suc (suc … (0)) …)! ✤ Достаточно определить
 suc
 iszero
 чтобы поддержать
 m + n
 m * n
 pre n
  • 13. Введение в лямбда-исчисление: типизация ✤ дают ясное представление о функции, если знать область определения и значений! ✤ эффективность (int8, int64) по mem и по cpu! ✤ статическая проверка программ! ✤ модульность и скрытие данных! ✤ позволяют обойти некоторые мат. противоречия
  • 14. типизация в ЯП ✤ строгая типизация - мягкая типизация
 int a[] = {1,2,3,4.0}; /* c - it’s ok */
 let a = [1,2,3,4.0] - - haskell - not ok
 A = [1,2,3,4,”hello”, [“world”]]. % erlang - it’s ok! ✤ динамическая типизация - статическая типизация! ✤ полиморфизм типов! ✤ автоматический вывод типов
  • 15. Типизированное лямбда-исчисление ✤ Каждый лямбда-терм имеет тип! ✤ терм S можно применить к терму T, если их типы правильно соотносятся (сильная типизация):
 S :: a -> b
 T :: a
 S T :: b! ✤ Базовые типы: Int, Bool! ✤ Конструктор типов: Int; Bool; Bool -> Bool; [Bool] -> Bool
  • 16. Отложенные (ленивые) вычисления ✤ (λ x . x + x + x) (10 + 5):
 (10 + 5) + (10 + 5) + (10 + 5) - нормальная редукция
 (15 + 15 + 15) - передача по значению! ✤ Передача по значению обычно более эффективна
 необходима для гибридных языков! ✤ Вызов по необходимости позволяет исп. ленивые вычисления! ✤ bottom = bottom - - Haskell: никогда не завершится
 const1 x = 1 - - нет необходимости проверять аргумент
 const1 bottom -> 1
 const1 (1/0) -> 1! ✤ Плата: снижение эффективности при сохранении отложенных вычислений
  • 17. Пример ленивых вычислений ✤ ones = 1 : ones
 numsFrom n = n : numsFrom (n+1)
 square x = x^2
 squres = map square (numsFrom 1)! ✤ take 5 (numsFrom 1) -> [1,2,3,4,5]! ✤ take 5 squares -> [1,4,9,16,25]
  • 18. real world функции ✤ как в чисто функциональном языке сделать print?! ✤ сравнение функции random:
 /* c-like, нет входа, случайный результат */
 long random(void); 
 
 - - haskell: generator as input, new generator as output
 random :: RandomGen g => g -> (a, g)
  • 19. Введение в haskell ✤ статическая типизация:
 тип объекта фиксируется в момент компиляции! ✤ строгая типизация (imp. статическая типизация):
 строго определенные типы для любых операций
 присваивание переменной только значения того же типа
 не допускается неявное преобразование типов! ✤ чистый язык: детерменированность и отсутствие побочных эффектов
  • 20. Синтаксис haskell ✤ идентификаторы: someFunction, foo, foo’, abc123.
 Каждому идентификатору можно сопоставить тип! ✤ Знаки операций, приоритеты между ними:
 + , - , * , / , ++! ✤ clause функций
 factorial 0 = 1
 factorial n = n * factorial (n-1)! ✤ guards
 factorial n | n == 0 = 1
 | otherwise = n * factorial (n - 1)! ✤ indentation! ✤ backquote:
 div 10 5 -> 2
 10 `div` 5 -> 2
  • 21. Введение в haskell 2 ✤ элементарные типы: Int, Bool, Char, Float! ✤ Конструкторы типов: кортежи (tuples), списки,
 random :: g -> (a,g)
 map :: (a->b) -> [a] -> [b]! ✤ алгебраические типы данных (ADT):
 data Maybe a = Just a | Nothing!
  • 22. haskell tools ! ✤ hoogle search! ✤ ghci repl! ✤ ghc compiler extensions
  • 24. списки как пример простоты
 “ядра языка” haskell ✤ Поддержка - на уровне библиотек.! ✤ Работа со списками
 []
 [1,2,3]
 1:[2,3]
 [1,2] ++ [3]
 (1:(2:(3:([]))))! ✤ map :: (a -> b) -> [a] -> [b]
 foldl :: (a -> b -> a) -> a -> [b] -> a
 head :: [a] -> a
 tail :: [a] -> [a]
 length :: [a] -> Int
 null :: [a] -> Bool! ✤ foldl (+) 0 [1,2,3,4] map (^2) [1,2,3,4] head [1,2,3,4] tail [1,2,3,4] -> 10
 -> [1,4,9,16]
 -> 1
 -> [2,3,4]