SlideShare uma empresa Scribd logo
1 de 64
Baixar para ler offline
Haskell Type System
Ивашнёв Дмитрий
email: 0xff0x666@gmail.com
jabber: xffox@headcounter.org
25 апреля 2014 г.
Парадигма
• Функциональный язык (functional)
• Чисто функциональный язык (purely functional)
• Язык с ленивой моделью вычислений (lazy)
• Язык со статической типизацией (static typing)
• Язык со строгой типизацией (strong typing)
Функциональный язык (functional)
fact(n) =
1 if n = 0
n × fact(n − 1) otherwise
Функциональный язык (functional)
module Fact
where
fact 0 = 1
fact n = n*fact (n -1)
Чисто функциональный язык (purely
functional)
Представьте что все const
Чисто функциональный язык (purely
functional)
f (x) = ax2
+ bx + c
Решить для x при f (x) = 0
∆ = b2
− 4ac
x1,2 =
−b ±
√
∆
2a
Чисто функциональный язык (purely
functional)
module Discriminant
where
solveQuadratic a b c =
let d = b*b - 4*a*c
in if d < 0 then []
else if d == 0 then [-b/(2*a)]
else [-b + (sqrt d)/(2*a), -b - (sqrt d)/(2*a)]
Чисто функциональный язык (purely
functional)
d = b * b - 4 * a * c
Списки (lists)
• [] - пустой список
• [1, 2, 42] - список с тремя элементами
• [[], [1], [1, 2], [1, 2, 42]] - список списков
Списки (lists)
• [1, 2 .. 5] = [1, 2, 3, 4, 5]
• [1, 2 .. ]
• [1 .. ]
Списки (lists)
Добавление в список
42:[]
[42]
8:[42]
[8 ,42]
Списки (lists)
Сложность операций
length - O(n)
Проверка на пустой список: null
Не используйте length ls == 0
Привет C++ и .empty() из STL
Функции первого порядка
Функции могут передаваться в качестве параметров функций
odd 1
True
filter odd [1, 2, 3]
[1, 3]
Язык с ленивой моделью вычислений
(lazy)
filter odd [1, 2, 3, 4, 5]
filter odd [1, 2 .. 5]
[1, 3, 5]
Язык с ленивой моделью вычислений
(lazy)
filter odd [1 ..]
take 3 (filter odd [1 ..])
[1, 3, 5]
Язык со статической типизацией (static
typing)
Проверка типов на этапе компиляции
Язык со строгой типизацией (strong
typing)
Явные приведения между всеми типами
Int, Float, ...
С чего начать
http://www.haskell.org/
Компилятор
http://www.haskell.org/ghc/
Математическая нотация
Множества A и B
Функция F
F : A → B
Нотация типов в Haskell
Переменные типов: a и b
В данном случае на типы не накладывается никаких
ограничений
Функция f
f :: a -> b
Примеры
Переменные типов: a, b и c
Функция f
f :: a -> b -> c
Списки
f :: a -> [a]
Функции первого порядка
filter :: (a -> Bool) -> [a] -> [a]
map :: (a -> b) -> [a] -> [b]
foldr :: (a -> b -> b) -> b -> [a] -> b
Логика типов
Определение тела функции по ее типу
f :: a -> a
Логика типов
Определение тела функции по ее типу
f :: a -> a
Возможное решение
f a = a
f = id
id 42
42
Логика типов
Какие возможны реализации?
f :: a -> [a]
Выведение типов
Для функции fact
module Fact
where
fact 0 = 1
fact n = n*fact (n -1)
получим тип
fact :: (Eq a, Num a) => a -> a
Выведение типов
Все типы функций могут быть выведены автоматически на
этапе компиляции
Явное указание типа может помочь в отладке
Скомпилировалось – работает (joke)
Выведение типов
C++11 добавляет выведение типа переменных – auto
auto value = 42;
auto value = 1 + 2;
auto value = f(42);
C++14 добавляет выведение типа, возвращаемого функцией –
auto
auto foobar(int value)
{
return value + 1;
}
Алгебраические типы данных (Algebraic
Data Types)
Наиболее общий составной тип, представляющий собой
тип-сумму из типов-произведений (wikipedia)
Тип с одним параметром
Множество A
Переменная типа a
data Name a = Constructor a
Тип с несколькими параметрами
Множества T, A и B
Переменные типа a и b
data Name a b = Constructor a b
тип-произведение
T = A × B
Тип с несколькими конструкторами
Множества T и A
Переменная типа a
data Name a = ContructorF a | ContructorS a
тип-сумма
Af = {(x, 1) : x ∈ A}
As = {(x, 2) : x ∈ A}
T = Af ∪ As
Все вместе
Множества T, A, B
Переменные типа a и b
data Name a b = ContructorF a b | ContructorS a
сумма произведений
Af = {(x, 1) : x ∈ A × B}
As = {(x, 2) : x ∈ A}
T = Af ∪ As
Дизъюнктное объединение (Disjoint
union)
i∈I
{(x, i) : x ∈ Ai }
Зачем
• Формальное обощение: enum, struct, union
• Сопоставление параметров функций по шаблону
Параметры функций
data State a b = First a | Second b | Third a b
handle (First s) v = Second (f s)
handle (Second s) v = First s
handle (Third s t) v = Third s (f t v)
enum
data Bool = True | False
data Color = Red | Green | Blue
enum Bool
{
TRUE ,
FALSE
};
struct
data State a b = St a b
struct State
{
int a;
int b;
};
union
data State a b = First a b | Second a
union State
{
struct
{
int a;
int b;
} first;
struct
{
int a;
} second;
};
Рекурсивные типы данных
Бинарное дерево
module Tree
where
data Tree a = Leaf | Node (Tree a) a (Tree a)
sumTree Leaf = 0
sumTree (Node left v right) = sumTree left + v + sumTree right
import Tree
main =
putStrLn $ show (sumTree (Node (Node (Leaf) 2 (Node (Leaf) 3 (Leaf))) 1 (
Leaf)))
6
Списки
List a = [] | (:) a (List a)
Полиморфизм
Позволяет строить суждения о типах зная только класс этих
типов
Класс описывает функции, реализуемые типом
Typeclasses
Моноид - множество с заданной на нем ассоциативной
бинарной операцией и нейтральным элементом.
(a · b) · c = a · (b · c)
a · e = a
Пример: целые числа с операцией умножения.
Что насчет чисел с плавающей запятой?
Typeclasses
module Monoid
where
class Monoid a where
binop :: a -> a -> a
identity :: a
twice :: Monoid a => a -> a
twice a = binop a a
Typeclasses
“In fact, trolls traditionally count like this: one, two, three . . .
many, and people assume this means they can have no grasp of
higher numbers.” – Men at Arms, Terry Pratchett
Typeclasses
module TrollNum(TrollNum (..) , plus , binop , identity)
where
import Monoid
data TrollNum = Zero | One | Two | Three | Many
deriving Show
plus :: TrollNum -> TrollNum -> TrollNum
plus a b = fromNum (toNum a + toNum b)
instance Monoid TrollNum where
binop = plus
identity = Zero
toNum Zero = 0
toNum One = 1
toNum Two = 2
toNum Three = 3
toNum Many = 4
fromNum 0 = Zero
fromNum 1 = One
fromNum 2 = Two
fromNum 3 = Three
fromNum _ = Many
Typeclasses
import Monoid
import TrollNum
main = putStrLn $ show $ twice Two
Many
Операторы
Среднее арифметическое
module Ops
where
(-|-) a b = (a + b)/2
Pointfree style
Функции f (x), g(x) и z(x)
z(x) = f (g(x))
z = f . g
(.) :: (b -> c) -> (a -> b) -> a -> c
Pointfree style
Функция, прибавляющая 1 к переданному значению
addOne v = v + 1
addOne v = (+) v 1
addOne v = (+) 1 v
addOne = (+) 1
((+) 1) :: Num a => a -> a
Pointfree style
Найти длину самого длинного слова в строке
module LongestWord
where
longestWord = (foldr max 0) . (map length) . words
Привет map-reduce
Понятие
Это абстракция линейной цепочки связанных вычислений. Её
основное назначение - инкапсуляция функций с побочным
эффектом от чистых функций, а точнее их выполнений от
вычислений (wikipedia).
Info
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
fail :: String -> m a
Общий шаблон
• Тип с одним параметром m
• Получение значения (bind):
функция (»=) :: m a -> (a -> m b) -> m b
• Инъекция значения (inject):
функция return :: a -> m a
Monad
IO
Как возможно IO в системе без побочных эффектов?
IO monad
Снова факториал
Хвостовая рекурсия
module XFact
where
xfact n = xfact ’ 1 n
where
xfact ’ v 0 = v
xfact ’ v n = xfact ’ (v*n) (n-1)
Выведение типов
Модульная арифметика
module ModInt
where
newtype ModInt = ModInt {
fromModInt :: Int
}
deriving (Show)
instance Num ModInt where
(+) (ModInt a) (ModInt b) = ModInt ((a + b) ‘mod ‘ 23)
(*) (ModInt a) (ModInt b) = ModInt ((a * b) ‘mod ‘ 23)
abs (ModInt a) = ModInt (abs a)
signum (ModInt a) = ModInt (signum a)
fromInteger v = ModInt (fromInteger v ‘mod ‘ 23)
import ModInt
pow a 0 = 1
pow a b = a * pow a (b-1)
main = putStrLn $ show $ fromModInt $ pow 2 5
9
DSL
import Fuzz
import DumbFuzzer
authRequest = "AUTH" ‘wait ‘ authResponses
getRequest = "GET" ‘wait ‘ getResponses
authResponses = ("AUTHED" |-> getRequest) // (other (report 0))
getResponses = ("200␣OK" |-> report 1) // ("418␣I’m␣a␣teapot" |-> report 42) //
(other (report 0))
main = do
r <- fuzz DumbFuzzer authRequest
putStrLn $ show r
Fuzz I
module Fuzz(wait , report , (|->), (//) , other , fuzz , Fuzzer (..))
where
data Response r = Response (Msg , Request r) | Other (Request r)
data Request r = Send Msg [Response r] | Report r
report :: r -> Request r
report r = Report r
wait :: Msg -> [Response r] -> Request r
wait message reactions = Send message reactions
other :: Request r -> [Response r]
other response = [Other response]
(|->) :: Msg -> Request r -> [Response r]
(|->) message action = [Response (message , action)]
(//) :: [Response r] -> [Response r] -> [Response r]
(//) a b = a ++ b
fuzz :: Fuzzer f => f -> Request r -> IO r
fuzz f (Send msg responses) = do
r <- send f msg
next f r responses
fuzz f (Report r) = return r
class Fuzzer f where
send :: f -> Msg -> IO Msg
Fuzz II
next f _ [Other request] = fuzz f request
next f resp (( Other request):rs) = next f resp (rs ++ [Other request ])
next f resp (( Response (msg , request)):rs) | resp == msg = fuzz f request
| otherwise = next f resp rs
type Msg = String
Fuzzer
module DumbFuzzer
where
import Fuzz
data DumbFuzzer = DumbFuzzer
instance Fuzzer DumbFuzzer where
send _ m = do
putStrLn m
getLine
Литература
• Real World Haskell by Bryan O’Sullivan, John Goerzen, and
Don Stewart
• The Haskell Road to Logic, Math and Programming by Kees
Doets and Jan van Eijck
• Parallel and Concurrent Programming in Haskell by Simon
Marlow
• Haskell Beats C Using Generalized Stream Fusion by Geoffrey
Mainland, Roman Leshchinskiy, and Simon Peyton Jones
(paper)

Mais conteúdo relacionado

Mais procurados

Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовMikhail Kurnosov
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...pgdayrussia
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадZheka Kozlov
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаMikhail Kurnosov
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Монады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон ХоломьёвМонады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон ХоломьёвЮрий Сыровецкий
 
Переменные в языке Delphi
Переменные в языке DelphiПеременные в языке Delphi
Переменные в языке DelphiNexa50
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
Why Every Language Needs Its Underscore
Why Every Language Needs Its UnderscoreWhy Every Language Needs Its Underscore
Why Every Language Needs Its UnderscoreAlexander Schepanovski
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Mikhail Kurnosov
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовMikhail Kurnosov
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовMikhail Kurnosov
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Mikhail Kurnosov
 

Mais procurados (20)

Основы NumPy
Основы NumPyОсновы NumPy
Основы NumPy
 
Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмов
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Python: ввод и вывод
Python: ввод и выводPython: ввод и вывод
Python: ввод и вывод
 
Python
PythonPython
Python
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Урок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". КлассыУрок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". Классы
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Монады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон ХоломьёвМонады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон Холомьёв
 
Переменные в языке Delphi
Переменные в языке DelphiПеременные в языке Delphi
Переменные в языке Delphi
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Why Every Language Needs Its Underscore
Why Every Language Needs Its UnderscoreWhy Every Language Needs Its Underscore
Why Every Language Needs Its Underscore
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 

Semelhante a Haskell Type System with Dzmitry Ivashnev.

Functional Programing
Functional ProgramingFunctional Programing
Functional ProgramingMax Arshinov
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотекPyNSK
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Николай Паламарчук "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
 
Евгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в HaskellЕвгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в HaskellFProg
 
Алгебраические типы данных
Алгебраические типы данныхАлгебраические типы данных
Алгебраические типы данныхAlexander Schepanovski
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#akrakovetsky
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)Smolensk Computer Science Club
 
Идиоматичный функциональный код
Идиоматичный функциональный кодИдиоматичный функциональный код
Идиоматичный функциональный кодAlexander Granin
 
Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №10 "Алгоритмические композиции. Завершение" Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №10 "Алгоритмические композиции. Завершение" Technosphere1
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskellhusniyarova
 

Semelhante a Haskell Type System with Dzmitry Ivashnev. (20)

Scala
ScalaScala
Scala
 
Functional Programing
Functional ProgramingFunctional Programing
Functional Programing
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
Евгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в HaskellЕвгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в Haskell
 
Алгебраические типы данных
Алгебраические типы данныхАлгебраические типы данных
Алгебраические типы данных
 
Функциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядковФункциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядков
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Урок 6. Чистое лямбда-исчисление.
Урок 6. Чистое лямбда-исчисление. Урок 6. Чистое лямбда-исчисление.
Урок 6. Чистое лямбда-исчисление.
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
PHP7 - что ожидать?
PHP7 - что ожидать?PHP7 - что ожидать?
PHP7 - что ожидать?
 
Идиоматичный функциональный код
Идиоматичный функциональный кодИдиоматичный функциональный код
Идиоматичный функциональный код
 
Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №10 "Алгоритмические композиции. Завершение" Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №10 "Алгоритмические композиции. Завершение"
 
Java 8. Lambdas
Java 8. LambdasJava 8. Lambdas
Java 8. Lambdas
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskell
 
Discovering Lambdas (Speech)
Discovering Lambdas (Speech)Discovering Lambdas (Speech)
Discovering Lambdas (Speech)
 
Урок 3. Карринг и ленивые вычисления.
Урок 3. Карринг и ленивые вычисления.Урок 3. Карринг и ленивые вычисления.
Урок 3. Карринг и ленивые вычисления.
 

Mais de Sergey Tihon

Natural Language Processing (NLP) with .NET for #dotnetby meetup-29
Natural Language Processing (NLP) with .NET for #dotnetby meetup-29Natural Language Processing (NLP) with .NET for #dotnetby meetup-29
Natural Language Processing (NLP) with .NET for #dotnetby meetup-29Sergey Tihon
 
How to NLProc from .NET
How to NLProc from .NETHow to NLProc from .NET
How to NLProc from .NETSergey Tihon
 
FAKE (F# Make) & Automation
FAKE (F# Make) & AutomationFAKE (F# Make) & Automation
FAKE (F# Make) & AutomationSergey Tihon
 
Printfn hello world
Printfn hello worldPrintfn hello world
Printfn hello worldSergey Tihon
 
Fssf community overview
Fssf community overviewFssf community overview
Fssf community overviewSergey Tihon
 
Declarative authorization in REST services in SharePoint with F# and ServiceS...
Declarative authorization in REST services in SharePoint with F# and ServiceS...Declarative authorization in REST services in SharePoint with F# and ServiceS...
Declarative authorization in REST services in SharePoint with F# and ServiceS...Sergey Tihon
 

Mais de Sergey Tihon (7)

Natural Language Processing (NLP) with .NET for #dotnetby meetup-29
Natural Language Processing (NLP) with .NET for #dotnetby meetup-29Natural Language Processing (NLP) with .NET for #dotnetby meetup-29
Natural Language Processing (NLP) with .NET for #dotnetby meetup-29
 
How to NLProc from .NET
How to NLProc from .NETHow to NLProc from .NET
How to NLProc from .NET
 
F# for Data*
F# for Data*F# for Data*
F# for Data*
 
FAKE (F# Make) & Automation
FAKE (F# Make) & AutomationFAKE (F# Make) & Automation
FAKE (F# Make) & Automation
 
Printfn hello world
Printfn hello worldPrintfn hello world
Printfn hello world
 
Fssf community overview
Fssf community overviewFssf community overview
Fssf community overview
 
Declarative authorization in REST services in SharePoint with F# and ServiceS...
Declarative authorization in REST services in SharePoint with F# and ServiceS...Declarative authorization in REST services in SharePoint with F# and ServiceS...
Declarative authorization in REST services in SharePoint with F# and ServiceS...
 

Haskell Type System with Dzmitry Ivashnev.