Haskell Lite - presentation for DevDay about Haskell language

Alexander Granin
Alexander GraninSoftware Developer, Independent Consultant at Independent Consultant
Haskell
Александр Гранин
graninas@gmail.com
О чем доклад?
● Часть 1. Ликбез по ФП и Haskell
○ Функциональное программирование
○ Язык Haskell. Применимость языка
○ Язык Haskell. Основы
○ Инструменты разработчика
● Часть 2. Haskell: We need to go deeper
○ Обработка данных: NgnTrafficParser
○ XML и Domain Specific Languages
○ Parsec, HaXml, GenXml
● Часть 3. Немного хардкора
○ Монады!!!
Программирование:
● Императивное
● Объектно-ориентированное
● Функциональное
● Логическое
● Декларативное
(println "Hello World!")
printfn "Hello World!"
io:format("Hello, World!~n").
putStrLn "Hello World!"
println("Hello World!")
Функциональное
программирование
?
Функциональное
программирование
● Все есть функция
● ...
● ...
● ...
● ...
● ...
Функциональное
программирование
● Все есть функция
● Рекурсия
● ...
● ...
● ...
● ...
Функциональное
программирование
● Все есть функция
● Рекурсия
● Функции высших
порядков
● ...
● ...
● ...
Функциональное
программирование
a := 1
a := 2
DO NOT CHANGE!
The immutability is with you
● Все есть функция
● Рекурсия
● Функции высших
порядков
● Иммутабельность
данных
● ...
● ...
Функциональное
программирование
● Все есть функция
● Рекурсия
● Функции высших
порядков
● Иммутабельность
данных
● Чистые функции
● ...
Функциональное
программирование
● Все есть функция
● Рекурсия
● Функции высших
порядков
● Иммутабельность
данных
● Чистые функции
● Нет побочных
эффектов
Язык Haskell
?
Язык Haskell
Haskell - это...
● Чистый функциональный,
● строго статически типизированный,
● кроссплатформенный,
● компилируемый язык
● общего назначения
● с ленивой семантикой
● и автоматическим выводом типов.
Краткая история Haskell
● В честь Хаскеля Карри
● GHC: Саймон Пейтон Джонс
● Семейство языков ML
● Прародитель - Miranda
● 1990 год - Haskell 1.0
● 1998 год - Haskell '98
● 2009 год - Haskell 2010
«Доказательство —
это программа, а
доказываемая
формула — это тип
программы»
(c)MiranLipovača
Где Haskell плох:
● Системное программирование
● Real-time системы
● GUI
Где Haskell хорош:
● Надежность кода
● Надежность кода
● Domain Specific Languages
Abstract Syntax
Tree
Code base
Где Haskell хорош:
● Надежность кода
● Domain Specific Languages
● Безопасный параллелизм
Где Haskell хорош:
● Надежность кода
● Domain Specific Languages
● Безопасный параллелизм
● Обработка данных
Телекомы:
TrafficParser
Где Haskell хорош:
● Надежность кода
● Domain Specific Languages
● Безопасный параллелизм
● Обработка данных
● Парсинг
Где Haskell хорош:
Name
Description
Body Type
XML
DSL
Haskell - не мэйнстрим?..
Причины непопулярности
● Pascal, C, C++, Java, C# - в вузах
● Традиционное мировоззрение очень сильно
● Заработать на Haskell очень трудно
● Мифы и стереотипы
"Избегать успеха любой ценой."
Саймон Пейтон Джонс
Язык Haskell: Основы
fib n = case n of
0 -> 0
1 -> 1
n -> fib (n-1) + fib (n-2)
fact n = case n of
0 -> 1
n -> fact (n-1) * n
Функции.
case - аналог switch
Функции,
аргументы -
lowerCamelCase
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
fact 0 = 1
fact n = fact (n-1) * n
Сопоставление с образцом
Функции,
аргументы -
lowerCamelCase
fib :: Word -> Word
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
fact :: Word -> Word
fact 0 = 1
fact n = fact (n-1) * n
Система типов
Функции,
аргументы -
lowerCamelCase
Типы, классы
типов, модули -
UpperCamelCase
fact :: Word -> Word
replicate :: Int -> a -> [a]
map :: (a -> b) -> [a] -> [b]
(+) :: Int -> Int -> Int
add :: Int -> Int -> Int
Система типов
Списки. Кортежи
phonebook :: [(String, String)]
phonebook =
[ ("Bob", "953 777-44-45")
, ("Fred", "919 33-555-11")
, ("Alice", "383 11111111")
, ("Jane", "964 4000004") ]
Списки. Кортежи
type PhoneBook = [(String, String)]
validate :: PhoneBook -> PhoneBook
validate book= map addPrefix book
addPrefix :: (String, String) -> (String, String)
addPrefix (name, phone) = (name, "+7 " ++ phone)
Лямбды - анонимные функции
nums = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]
oddNumbers = filter (n -> odd n) nums
oddNumbers2 = filter odd nums
// C#:
int[] nums = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var oddNumbers = nums.Where(n => n % 2 == 1);
Генераторы списков
(c) Miran Lipovača http://learnyouahaskell.com/
Cоздать список:
1. На множестве от 1 до 100.
2. Только нечетные.
3. Делящиеся на 3 без остатка.
4. Делящиеся на 7 без остатка.
list1 = [21, 63]
list2 = [x | x <- [1..100], odd x,
x `mod` 3 == 0,
x `mod` 7 == 0]
1. x - от 1 до 100, y - от 100 до 200.
2. x - четные, y - нечетные.
3. x + y < 200.
4. |x - y| > 190.
Cоздать список [(x, y)]:
list = [(x, y) | x <- [1..100], even x,
y <- [100..200], odd y,
x + y < 200,
abs (x - y) > 190]
Алгебраические типы данных
data Bool = True
| False
Тип Конструкторы
Алгебраические типы данных
data STree
= Tip
| Branch
{
leftBranch :: STree,
value :: Int,
rightBranch :: STree
}
Сопоставление с образцом
height :: STree -> Int
height Tip = 0
height (Branch lt _ rt) = 1 + max (height lt) (height rt)
5
3 7
1 4
Data.Maybe - аналог Nullable
phonebook :: [(String, String)]
...
printPhone :: String -> [(String, String)] -> IO ()
printPhone name book = case lookup name book of
Nothing -> putStrLn "Name not exist."
Just phone -> putStrLn phone
data Maybe a = Nothing
| Just a
lookup :: Eq a => a -> [(a, b)] -> Maybe b
Инструменты разработки
Haskell Platform
● Компилятор GHC
● Интерпретатор GHCi
● Базовые библиотеки
● Пакетный менеджер
Cabal
● Документирование -
Haddock
● MinGW (Windows) http://www.haskell.org/platform/
Glasgow Haskell Compiler
Компиляция:
ghc --make FizzBuzz.hs
ghc --make -O2 FizzBuzz.hs
ghc --make -O2 -threaded FizzBuzz.hs
Выполнение:
runghc FizzBuzz.hs
REPL - GHCi
(GHC interpreter)
Read
EvalPrint
Loop
REPL - GHCi
(GHC interpreter)
> [1..10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
> (3 + 30)
33
> fizzBuzz
<interactive>:1:1:
No instance for (Show (Int -> String))
arising from a use of 'print'
Possible fix:
add an instance declaration for (Show (Int -> String))
In a stmt of an interactive GHCi command: print it
Hackage - репозиторий библиотек
Библиотеки и программы
● xmonad - тайловый оконный менеджер
● Parsec - комбинаторные парсеры
● HaXmL, HXT - обработка XML
● darcs - система контроля версий
● Yesod - RESTful веб-фреймворк
● QuickCheck - тестирование кода
● House, Kinetic - операционные системы
● Всевозможные эффективные коллекции
● OpenGL, OpenAL, OpenCL биндинги
● ... несколько игр и многое другое
IDE
EclipseFP
Leksah
SublimeHaskell
Want
more?
NGN Traffic Parser
|R200|99999|333333|CR,CS,AM|1|1|3022|222222|333333|||...
|R200|44455|012345|CR,CS,AM|1|1|3022|555555|111111|||...
|R200|45678|543210|CR,CS,AM|1|1|3022|444444|555555|||...
|R200|88888|222222|CR,CS,AM|1|1|3022|666666|777777|||...
file1.txt file2.txt .........
Billing
CMD,
DTS,
SQL
NGN Traffic Parser
Billing
Merge Files
Process data
MS SQL DTS
АТД: Predicate
data Predicate = NotInList [ByteString]
| InList [ByteString]
| Like [ByteString]
| LengthLess Int
type PredicateMap = [(FieldIndex, Predicate)]
predicates =
[ (7, NotInList (map C.pack ["3022", "3012"]))
, (8, Like [C.pack "44", C.pack "45"])
, (9, LengthLess 7) ]
NGN Traffic Parser
checkPredicate :: Predicate -> C.ByteString -> Bool
checkPredicate (NotInList l) str = (not . elem str) l
checkPredicate (InList l) str = elem str l
checkPredicate (LengthLess n) str = (length str) < n
Алгебраический тип данных,
Сопоставление с образцом
replaceSymbols :: String -> String
replaceSymbols s = map (replaceChar '|' ' ')
((map (replaceChar ' ' '*')
(refieldDoubles s)))
Ver. 2.0
ByteString
Ver. 1.0
String
XML и Domain Specific Languages
<?xml version="1.0" encoding="utf-8" ?>
- <PolicySet xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-
PolicySetId="PolicSet-04b0613533354df196715b032388325c" Vers
PolicyCombiningAlgId="urn:oasis:names:tc:xacml:1.0:policy-combin
permit-overrides">
<Description>All active policices</Description>
<Target />
- <Policy PolicyId="a25099f1-d6fd-412e-b827-65fd39f799e1" Versio
<Description>Match file(s) content</Description>
<Target />
Политики безопасности
XML
Тестирование политики
Алгоритмы тестирования:
Безопасность обеспечена?
Нет
Исправляем
дыры
Да
ОК, запускаем!!
Policy.xml
Policy.xml
XML?!. Сложно! Хочу DSL!
Алгоритмы тестирования:
Безопасность обеспечена?
Нет
Исправляем
дыры
Да
ОК, запускаем!!
MyPolicy.dsl
Пример DSL
efm := ExactFileMatching 2 ".test2.db" 0
cat2 : "CAT2" = Category [] NoMatch
cat1 := Category [cat2] NoMatch
cat3 := Category [] NoMatch
cat0 := TopCategory [cat1, cat3] NoMatch
rule := Rule Permit [] | n_of 1 (Evaluate [efm]) [cat0]
policy := Policy DenyOverrides [Audit Deny Medium] [rule]
policySet := PolicySet PermitOverrides [] [policy]
Архитектура DSL <-> XML
Policy.xml
Policy.dsl
Policy AST
HaXmlGenXml
Custom writerParsec
DSL AST
Translator
DSL: AST на ADT
data DslTokenName = DslTokenName String
data DslTokenBody = DslGuardedBody
{ dtbDslAdt :: DslAdt
, dtbDslExpression :: DslExpression }
| DslNonGuardedBody { dtbDslAdt :: DslAdt }
data DslToken = EmptyDslToken
| DslToken
{ dtDslTokenType :: DslTokenType
, dtDslTokenName :: DslTokenName
, dtDslTokenDescr :: DslTokenDescription
, dtDslTokenBody :: DslTokenBody }
Parsec: парсинг DSL
dslToken :: GenParser Char st DslToken
dslToken = do
tName <- dslTokenName
tDescr <- dslTokenDescription
(tBody, tType) <- dslTokenBody
return (DslToken tType tName tDescr tBody)
dslTokenBody :: GenParser Char st
(DslTokenBody, DslTokenType)
dslTokenBody = spaces >> (
try dslGuardedTokenBody
<|> try dslNonGuardedTokenBody
<?> "dslTokenBody")
NonGuardedBody
GuardedBody
Name
Description
Body Type
DslToken
DslTokenBody
Связь с БНФ
lower ::= 'a' | 'b' | ... | 'z'
rest ::= (letters | numbers | '_') + rest | ''
identifier ::= (lower | '_') + rest
tokenName ::= identifier
tokenBody ::= guardedBody | nonGuardedBody
token ::= (tokenType, tokenName, tokenDescr, tokenBody)
identifier :: GenParser Char st String
identifier = do
c <- (lower <|> char '_')
rest <- many (alphaNum <|> char '_')
return (c : rest)
HaXml: парсинг XML
toCondition :: Content i -> Maybe Condition
toCondition e = let
exprCond = head . filterNonTextContent $ children e
expr = fromJust $ recognizeStructure expRecognizers
exprCond
in Just (Condition expr)
-- ............ Здесь много кода
parsePolicy :: String -> PolicySet
parsePolicy content = let
(Document _ _ root _) = xmlParse "error.log" content
in toPolicySet (CElem root noPos)
GenXml: генерация XML
writeDteValue :: DataTypeExt -> Xml Elem
writeDteValue (DteString s) = xtext s
writeDteValue (DteBoolean b) = xtext (map toLower (show b))
writeDteValue (DteInteger i) = xtext (show i)
writeAttributeValue :: AttributeValue -> Xml Elem
writeAttributeValue (AttributeValue dataType val) = let
attrValAttributes = xattr dataTypeN dataType
attrValVals = writeDteValue val
in xelem attributeValueN (attrValAttributes <#> attrValVals)
А теперь - хардкор!!!
lookup :: Eq a => a -> [(a, b)] -> Maybe b
class Eq a where
(==), (/=) :: a -> a -> Bool
instance Eq Char where
c1 == c2 = ... -- compare chars
c1 /= c2 = not (c1 == c2)
instance Eq Int where
i1 == i2 = ... -- compare ints
i1 /= i2 = not (i1 == i2)
Классы типов -
"интерфейсы" на стероидах
data Predicate = NotInList [ByteString]
| InList [ByteString]
| Like [ByteString]
| LengthLess Int
deriving (Eq, Show, Read)
Классы типов -
"интерфейсы" на стероидах
Монада IO:
Безопасный ввод-выод
let rndGen1 = mkStdGen 100
let (val1, rndGen2) = random rndGen1
let (val2, rndGen3) = random rndGen2
Отправной пример:
Random generator
Стратегия связывания, IO
getName :: IO ()
getName = do
putStrLn "What is your name?"
yourName <- getLine
putStr "Hello, "
putStrLn (yourName ++ "!")
let world0 = getWorld
let (val1, world1) = ioAction1 world0
let (val2, world2) = ioAction2 world1
do-нотация
getName :: IO ()
getName = do
putStrLn "What is your name?"
yourName <- getLine
putStr "Hello, "
putStrLn (yourName ++ "!")
getName' =
putStrLn "What is your name?"
>> getLine
>>= yourName -> putStr "Hello, "
>> putStrLn (yourName ++ "!")
Возвращаемое значение
getName :: IO String
getName = do
putStrLn "What is your name?"
yourName <- getLine
putStr "Hello, "
putStrLn (yourName ++ "!")
return yourName
return :: a -> m a
a :: String
m :: IO
Монада State
newtype State s a = State
{
runState :: s -> (a, s)
}
Монада State
myFunc :: State Int Int
myFunc = do
val <- get
put (val - 8)
get
getNumber = evalState myFunc 50
main = print getNumber
Стратегия связывания, State
let state1 = evalState 50
let (val1, state2) = get state1
let ((), state3) = put (val1 - 8) state2
let (val2, state4) = get state3
Monad transformers?
Зачем это надо?
Монада 2Монада 1
Monad transformers?
Зачем это надо?
Монада 2
Монада 1
State + IO
data GS = GS { worldMap :: [Location]
, currentLocation :: Location
, welded :: Bool
, bucketFull :: Bool }
deriving (Show)
newtype GameState a = GameState
{ runGameState :: StateT GS IO a }
State + IO
run :: GameState Result
run = do
t <- get
-- read a command from the user
io . putStr $ "> "
io . hFlush $ stdout
line <- io getLine
result <- case parseCommand line of
Nothing -> write "Invalid command!" >> continue
Just cmd -> do
...........
Named + IO
-- Int-named IO calculations:
intNamedFunc :: NamedT Int IO Int
intNamedFunc = do
name <- getName
return name
testIntNamed :: IO ()
testIntNamed = do
name <- evalNamedT intNamedFunc 1
print name -- You got output: 1
Спасибо за внимание!
Haskell
Александр Гранин
graninas@gmail.com
Haskell
Scala
Clojure
...
Want more?
PLUG
IN!!!
FUNction
It's all Haskell is about
Lambda The Gathering
Lambda Lifter
http://bit.ly/17CyYFj
Haskell Links
http://hackage.haskell.org/packages/hackage.html
Hackage - репозиторий библиотек
Haskell Platform
● Компилятор GHC
● Интерпретатор GHCi
● Базовые библиотеки
● Пакетный менеджер
Cabal
● Документирование -
Haddock
● MinGW (Windows) http://www.haskell.org/platform/
http://habrahabr.
ru/company/selectel/blog/13585
8/
Success Stories
Success Stories
Want
more?
http://www.haskell.org/haskellwiki/Haskell_in_industry
Класс типов Monad
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
Монада Named -
именованные вычисления
data Named n a = Named
{ runNamed :: (n -> a) }
instance Monad (Named n) where
return x = Named (_ -> x)
x >>= f = Named (name -> let
a = runNamed x name
in runNamed (f a) name)
1 of 92

Recommended

Дизайн больших приложений в ФП by
Дизайн больших приложений в ФПДизайн больших приложений в ФП
Дизайн больших приложений в ФПAlexander Granin
761 views61 slides
Для чего мы делали свой акторный фреймворк и что из этого вышло? by
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
9K views70 slides
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов by
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
6.4K views143 slides
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ by
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
813 views42 slides
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“ by
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Platonov Sergey
1.3K views56 slides
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра... by
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
1.2K views48 slides

More Related Content

What's hot

Михаил Матросов, “С++ без new и delete” by
Михаил Матросов, “С++ без new и delete”Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Platonov Sergey
1.7K views33 slides
Функционально декларативный дизайн на C++ by
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Alexander Granin
1K views47 slides
Конкурентные ассоциативные контейнеры by
Конкурентные ассоциативные контейнерыКонкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнерыcorehard_by
341 views26 slides
course js day 2 by
course js day 2course js day 2
course js day 2Georgyi Grigoryev
94 views40 slides
Zagursky by
ZagurskyZagursky
Zagurskykuchinskaya
840 views32 slides
Back to the future: Функциональное программирование вчера и сегодня by
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняAlexander Granin
945 views50 slides

What's hot(19)

Михаил Матросов, “С++ без new и delete” by Platonov Sergey
Михаил Матросов, “С++ без new и delete”Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”
Platonov Sergey1.7K views
Функционально декларативный дизайн на C++ by Alexander Granin
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
Alexander Granin1K views
Конкурентные ассоциативные контейнеры by corehard_by
Конкурентные ассоциативные контейнерыКонкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнеры
corehard_by341 views
Back to the future: Функциональное программирование вчера и сегодня by Alexander Granin
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
Alexander Granin945 views
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers» by Platonov Sergey
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Platonov Sergey1.7K views
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс... by Alexey Paznikov
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
Alexey Paznikov1K views
Haskell by DevDay
HaskellHaskell
Haskell
DevDay673 views
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript by Sergey Platonov
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Sergey Platonov5.9K views
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM by Sergey Platonov
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Sergey Platonov2.8K views
Очередной скучный доклад про логгирование by Python Meetup
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
Python Meetup1.5K views
Андрей Карпов, Приватные байки от разработчиков анализатора кода by Sergey Platonov
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Sergey Platonov838 views
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р... by Alexey Paznikov
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
Alexey Paznikov2.7K views
Евгений Зуев, С++ в России: Стандарт языка и его реализация by Platonov Sergey
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Platonov Sergey2.4K views
Павел Довгалюк, Обратная отладка by Sergey Platonov
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
Sergey Platonov560 views
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот... by Alexey Paznikov
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
Alexey Paznikov774 views
Современный статический анализ кода: что умеет он, чего не умели линтеры by corehard_by
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
corehard_by419 views

Similar to Haskell Lite - presentation for DevDay about Haskell language

Лекция о языке программирования Haskell by
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskellhusniyarova
748 views47 slides
PowerShell by
PowerShellPowerShell
PowerShellGetDev.NET
828 views30 slides
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе" by
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
1.9K views68 slides
Как приручить дракона: введение в LLVM by
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMTech Talks @NSU
351 views44 slides
Low-level C/C++ Optimization by Anrew Axenov (Sphinx) by
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Vadim Kosov
364 views58 slides
Cpp by
CppCpp
CppMax Klyga
423 views58 slides

Similar to Haskell Lite - presentation for DevDay about Haskell language(20)

Лекция о языке программирования Haskell by husniyarova
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskell
husniyarova748 views
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе" by Yandex
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Yandex1.9K views
Как приручить дракона: введение в LLVM by Tech Talks @NSU
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
Tech Talks @NSU351 views
Low-level C/C++ Optimization by Anrew Axenov (Sphinx) by Vadim Kosov
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Vadim Kosov364 views
Низкоуровневая Оптимизация (Андрей Аксенов) by Ontico
Низкоуровневая Оптимизация (Андрей Аксенов)Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)
Ontico3.9K views
Erlang мгновенное просветление by Maxim Sokhatsky
Erlang  мгновенное просветлениеErlang  мгновенное просветление
Erlang мгновенное просветление
Maxim Sokhatsky5.7K views
2013 09 21 языки программирования by Yandex
2013 09 21 языки программирования 2013 09 21 языки программирования
2013 09 21 языки программирования
Yandex3.5K views
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ... by Platonov Sergey
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey5.9K views
Formal verification of C code by Denis Efremov
Formal verification of C codeFormal verification of C code
Formal verification of C code
Denis Efremov75 views
Формальная верификация кода на языке Си by Positive Hack Days
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
Positive Hack Days1.1K views
static - defcon russia 20 by DefconRussia
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
DefconRussia1.2K views
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013) by ScalaNsk
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
ScalaNsk1K views
Принципы работы статического анализатора кода PVS-Studio by Andrey Karpov
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov217 views
Оптимизация трассирования с использованием Expression templates by Platonov Sergey
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
Platonov Sergey538 views
Оптимизация трассирования с использованием Expression templates by Platonov Sergey
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
Platonov Sergey227 views

More from Alexander Granin

Concurrent applications with free monads and stm by
Concurrent applications with free monads and stmConcurrent applications with free monads and stm
Concurrent applications with free monads and stmAlexander Granin
208 views55 slides
Hierarchical free monads and software design in fp by
Hierarchical free monads and software design in fpHierarchical free monads and software design in fp
Hierarchical free monads and software design in fpAlexander Granin
161 views59 slides
Final tagless vs free monad by
Final tagless vs free monadFinal tagless vs free monad
Final tagless vs free monadAlexander Granin
158 views74 slides
Monadic parsers in C++ by
Monadic parsers in C++Monadic parsers in C++
Monadic parsers in C++Alexander Granin
579 views58 slides
The present and the future of functional programming in c++ by
The present and the future of functional programming in c++The present and the future of functional programming in c++
The present and the future of functional programming in c++Alexander Granin
343 views125 slides
О разработке десктопных приложений / About desktop development by
О разработке десктопных приложений / About desktop developmentО разработке десктопных приложений / About desktop development
О разработке десктопных приложений / About desktop developmentAlexander Granin
437 views22 slides

More from Alexander Granin(20)

Concurrent applications with free monads and stm by Alexander Granin
Concurrent applications with free monads and stmConcurrent applications with free monads and stm
Concurrent applications with free monads and stm
Alexander Granin208 views
Hierarchical free monads and software design in fp by Alexander Granin
Hierarchical free monads and software design in fpHierarchical free monads and software design in fp
Hierarchical free monads and software design in fp
Alexander Granin161 views
The present and the future of functional programming in c++ by Alexander Granin
The present and the future of functional programming in c++The present and the future of functional programming in c++
The present and the future of functional programming in c++
Alexander Granin343 views
О разработке десктопных приложений / About desktop development by Alexander Granin
О разработке десктопных приложений / About desktop developmentО разработке десктопных приложений / About desktop development
О разработке десктопных приложений / About desktop development
Alexander Granin437 views
Принципы и практики разработки ПО 2 / Principles and practices of software de... by Alexander Granin
Принципы и практики разработки ПО 2 / Principles and practices of software de...Принципы и практики разработки ПО 2 / Principles and practices of software de...
Принципы и практики разработки ПО 2 / Principles and practices of software de...
Alexander Granin133 views
Принципы и практики разработки ПО / Principles and practices of software deve... by Alexander Granin
Принципы и практики разработки ПО / Principles and practices of software deve...Принципы и практики разработки ПО / Principles and practices of software deve...
Принципы и практики разработки ПО / Principles and practices of software deve...
Alexander Granin140 views
Закон Деметры / Demetra's law by Alexander Granin
Закон Деметры / Demetra's lawЗакон Деметры / Demetra's law
Закон Деметры / Demetra's law
Alexander Granin149 views
GitHub - зеркало разработчика by Alexander Granin
GitHub - зеркало разработчикаGitHub - зеркало разработчика
GitHub - зеркало разработчика
Alexander Granin958 views
The Present and The Future of Functional Programming in C++ by Alexander Granin
The Present and The Future of Functional Programming in C++The Present and The Future of Functional Programming in C++
The Present and The Future of Functional Programming in C++
Alexander Granin86 views
Functional programming in C++ LambdaNsk by Alexander Granin
Functional programming in C++ LambdaNskFunctional programming in C++ LambdaNsk
Functional programming in C++ LambdaNsk
Alexander Granin464 views
Transition graph using free monads and existentials by Alexander Granin
Transition graph using free monads and existentialsTransition graph using free monads and existentials
Transition graph using free monads and existentials
Alexander Granin473 views
Software transactional memory. pure functional approach by Alexander Granin
Software transactional memory. pure functional approachSoftware transactional memory. pure functional approach
Software transactional memory. pure functional approach
Alexander Granin968 views
Вы не понимаете ФП / You don't understand FP by Alexander Granin
Вы не понимаете ФП / You don't understand FPВы не понимаете ФП / You don't understand FP
Вы не понимаете ФП / You don't understand FP
Alexander Granin144 views
Functional "Life": parallel cellular automata and comonads by Alexander Granin
Functional "Life": parallel cellular automata and comonadsFunctional "Life": parallel cellular automata and comonads
Functional "Life": parallel cellular automata and comonads
Alexander Granin885 views
Functional microscope - Lenses in C++ by Alexander Granin
Functional microscope - Lenses in C++Functional microscope - Lenses in C++
Functional microscope - Lenses in C++
Alexander Granin1.7K views
Линзы - комбинаторная манипуляция данными by Alexander Granin
Линзы - комбинаторная манипуляция даннымиЛинзы - комбинаторная манипуляция данными
Линзы - комбинаторная манипуляция данными
Alexander Granin389 views
Линзы - комбинаторная манипуляция данными (Dev2Dev) by Alexander Granin
Линзы - комбинаторная манипуляция данными (Dev2Dev)Линзы - комбинаторная манипуляция данными (Dev2Dev)
Линзы - комбинаторная манипуляция данными (Dev2Dev)
Alexander Granin483 views

Haskell Lite - presentation for DevDay about Haskell language