SlideShare a Scribd company logo
1 of 55
Download to read offline
Анонимные записи в Haskell
(Anonymous Records in Haskell)
Никита Волков
Введение
Введение
Выучи уже Haskell во имя добра!
http://learnyouahaskell.com/
Терминология
Терминология:
Типы данных и конструкторы значений
Терминология:
Синоним типа
Декларация, которая позволяет присвоить
альтернативное имя существующему типу или
конкретизации полиморфного типа.
Терминология:
Классы типов
Конструкция в системе типов Haskell,
являющая собой основной инструмент для
работы с полиморфизмом.
Терминология:
Классы типов
Java-версия класса типов, который
абстрагируется над чем-то, что может иметь
пустое значение или соединяться с другим
значением своего же типа.
Терминология:
Классы типов
Инстанционализируя данный интерфейс мы
предоставляем поддержку для конкретных
типов данных.
Вот, для примера, моноид для строки:
Терминология:
Классы типов
Моноид для суммирования чисел:
Терминология:
Классы типов
В случае чисел есть и моноид для
перемножения:
Терминология:
Классы типов
Более неожиданный моноид: для вычислений.
Терминология:
Классы типов
Ещё более неожиданный моноид: для
вычислений с результатом. Сам использует
моноид для результата.
Терминология:
Классы типов
Вышеупомянутое нужно лишь для того чтобы иметь
возможность писать полиморфные функции, в
которых мы абстрагируемся от конкретного типа
данных.
Пример: общая функция для объединения списка
элементов в один элемент.
Терминология:
Классы типов
Так как мы уже абстрагировались от всех
логических проблем, применение
объявленного функционала к конкретным
типам – проблема тривиальной компоновки.
Терминология:
Классы типов
Вот так данный класс типов имплементирован
в Haskell:
Терминология:
Классы типов
Так выглядит полиморфная функция:
Обратите внимание, что в данном случае
моноид является не параметром функции, а её
условием.
Иными словами, данная функция требует
наличия нужного нам моноида. Т.е., в отличие
от наших примеров в Java, инстансы классов
типов передаются неявно (подразумеваются).
Терминология:
Запись (Record)
Композитный тип, позволяющий обращаться к
его составляющим по имени. Только и всего.
В случае Java это был бы POJO:
В случае Haskell это синтаксическое
расширение для декларации типов данных:
Как записи работают в Haskell
сейчас
Декларация типа данных с использованием
синтаксиса для записей просто
“рассахаривается” компилятором в объявления
одноимённых функций.
Таким образом, следующий код:
Превращается в
Как записи работают в Haskell
сейчас
Изменение значений записей производится с
использованием специального синтаксиса:
В чём проблема?
В чём проблема?
1. Конфликты имён
В силу того, что поля преобразуются в функции
и перегрузки функций в Haskell нет, нет и
возможности сосуществовать двум записям в
одном модуле, если они используют одни и те
же имена.
Данный код не будет компилироваться:
В чём проблема?
2. Частичность
Генерируемые функции определены не для
всех значений. Из-за этого, несмотря на то, что
следующий код пройдёт компиляцию без
ошибок, он выдаст ошибку только в рантайме:
В чём проблема?
3. Конфликты типов
Одно имя может быть использовано только
для одного типа данных.
Следующий код пройдёт компиляцию:
Этот - нет:
В чём проблема?
4. Избыточность конструктора
На практике записи крайне редко используются
для типов данных со множеством
конструкторов.
Набирание “Person” дважды в следующем коде
явно избыточно:
В чём проблема?
5. Изменение полей
Муторность изменения полей записей внутри
других записей растёт экспоненциально по
отношению к количеству уровней такого
вложения. Чем глубже мы пытаемся
обратиться – тем больше нам приходится
повторяться.
Линза (Lens)
Комбинируемая абстракция, которая решает
проблему изменения полей вложенных
записей.
● “over” - функция-комбинатор, позволяющая применять
функцию к значению поля, на которое ссылается линза
● “birthday” и “year” - линзы, вместе образующие единую
линзу при помощи комбинатора композиции,
обозначаемого точкой.
● “succ” - функция, прибавляющая единицу к числу
Линза (Lens)
Нуждается в шаблонном коде.
Линза (Lens)
Не решает остальных проблем системы
записей:
1. Конфликты имён
2. Частичность
3. Конфликты типов
4. Избыточность конструктора
5. Изменение полей
Решение:
Анонимные записи
В данный момент имплементированы как
препроцессор компилятора. Подробнее здесь:
http://hackage.haskell.org/package/record
Анонимные записи:
Декларации типов
● Отсутствие конфликтов имён. И “Person”, и
“Country” используют поле “name”.
● Нет нужды декларировать записи, что
используется в случае с полем “birthday”.
Анонимные записи:
Декларации типов
Несмотря на то, что анонимные записи являют
собой тип, а не декларацию, они по-прежнему
могут быть использованы для объявления
новых типов без каких-либо накладных
расходов.
Для этого нужно использовать конструкцию
“newtype”:
Анонимные записи:
Декларации типов
Если нужно, анонимные записи можно
использовать и для объявления типов со
множеством конструкторов:
Анонимные записи:
Расход памяти
Следующие типы занимают абсолютно
одинаковое количество памяти, несмотря на
то, что второй основан на анонимной записи:
Анонимные записи:
Расход памяти
То же относится и к строгим записям:
Анонимные записи:
Расход памяти
Следующий тип займёт меньше памяти
благодаря использованию оптимизации по
устранению промежуточных конструкторов во
вложенных типах.
К сожалению, к анонимным записям данная
оптимизация не применима. Стоит отметить,
однако, что “UNPACK” может уменьшать
производительность.
Анонимные записи:
Производительность
В точности такое же, как и у стандартных типов
данных и лучше, чем у типов, использующих
преждеупомянутую прагму “UNPACK”.
Анонимные записи:
Изменение значений полей
Никакого велосипеда. Просто используем
линзы.
Препроцессор предоставляет специальный
сахар для объявления линз, используя символ
“@”. Никаких издержек.
Анонимные записи:
Объявление значений
Всё прямолинейно:
Анонимные записи:
Объявление значений
Для удобства есть ещё и синтаксис частичного
объявления, который генерирует функцию,
возвращающую значение.
Что, как понимают знающие, конечно же,
особенно полезно когда речь заходит об
аппликативных функторах:
Анонимные записи:
Все проблемы решены!
1. Конфликты имён
2. Частичность
3. Конфликты типов
4. Избыточность конструктора
5. Изменение полей
Анонимные записи:
Синтаксис
Никаких конфликтов с существующим
синтаксисом Haskell!
Анонимные записи:
Как они устроены?
Библиотека предоставляет набор
полиморфных типов данных, представляющих
собой строгие и ленивые записи с арностью до
24.
Анонимные записи:
Как они устроены?
Строчные значения на уровне типов
используются для обозначения имён полей.
Так как это значения, а понятие “пространство
имён” в принципе не применимо к значениям,
проблема конфликтов имён отпадает
автоматически.
Анонимные записи:
Как они устроены?
Декларация типа:
Преобразуется препроцессором в:
Обратите внимание на пересортировку полей
по алфавиту...
Анонимные записи:
Как они устроены?
Пересортировка полей позволяет добиться
следующего свойства:
Иными словами, имена полей предопределяют
запись, а позиции – нет.
Анонимные записи:
Как они устроены?
Класс типов используется для работы с
полями. Все предобъявленные в библиотеке
типы записей имеют инстансы этого класса.
Ниже представлена упрощённая версия
реализации.
Анонимные записи:
Как они устроены?
Выражение ссылки на поле, как следующее:
Преобразовывается в:
Применение:
Преобразование в
структурированные данные
Следующего выражения:
Достаточно чтобы сгенерировать такой-вот
JSON:
Применение:
Именованные параметры
функций
Вместо
Применение:
Шаблонизаторы: Laika
Шаблон:
Можно использовать так:
Как пользоваться
Ниже приведён пример того, как Вы можете
настроить проект использовать препроцессор
во всех модулях.
Как пользоваться
Также возможно включать препроцессор
индивидуально для модуля. Для этого нужно
добавить следующую прагму в шапку модуля:
Конечно же, подразумевается, что Ваш проект
имеет те же зависимости, как и на
предыдущем слайде.
Как пользоваться
Оба способа использования подразумевают,
что директория бинарников, устанавливаемых
Cabal, (e.g., “.cabal/bin/”) упомянута в PATH.
Ссылки
● Библиотека типов анонимных записей:
http://hackage.haskell.org/package/record
● Препроцессор:
http://hackage.haskell.org/package/record-
preprocessor
● Мой блог с моими контактами:
http://nikita-volkov.github.io/

More Related Content

Viewers also liked

Airbnb tech talk: Levi Weintraub on webkit
Airbnb tech talk: Levi Weintraub on webkitAirbnb tech talk: Levi Weintraub on webkit
Airbnb tech talk: Levi Weintraub on webkitnaseemh
 
"Немного о функциональном программирование в JavaScript" Алексей Коваленко
"Немного о функциональном программирование в JavaScript" Алексей Коваленко"Немного о функциональном программирование в JavaScript" Алексей Коваленко
"Немного о функциональном программирование в JavaScript" Алексей КоваленкоFwdays
 
Who's More Functional: Kotlin, Groovy, Scala, or Java?
Who's More Functional: Kotlin, Groovy, Scala, or Java?Who's More Functional: Kotlin, Groovy, Scala, or Java?
Who's More Functional: Kotlin, Groovy, Scala, or Java?Andrey Breslav
 
Pushing Python: Building a High Throughput, Low Latency System
Pushing Python: Building a High Throughput, Low Latency SystemPushing Python: Building a High Throughput, Low Latency System
Pushing Python: Building a High Throughput, Low Latency SystemKevin Ballard
 
London React August - GraphQL at The Financial Times - Viktor Charypar
London React August - GraphQL at The Financial Times - Viktor CharyparLondon React August - GraphQL at The Financial Times - Viktor Charypar
London React August - GraphQL at The Financial Times - Viktor CharyparReact London Community
 
CSS/SVG Matrix Transforms
CSS/SVG Matrix TransformsCSS/SVG Matrix Transforms
CSS/SVG Matrix TransformsMarc Grabanski
 
gevent at TellApart
gevent at TellApartgevent at TellApart
gevent at TellApartTellApart
 
Map, Flatmap and Reduce are Your New Best Friends: Simpler Collections, Concu...
Map, Flatmap and Reduce are Your New Best Friends: Simpler Collections, Concu...Map, Flatmap and Reduce are Your New Best Friends: Simpler Collections, Concu...
Map, Flatmap and Reduce are Your New Best Friends: Simpler Collections, Concu...Chris Richardson
 
Functional Programming in JavaScript by Luis Atencio
Functional Programming in JavaScript by Luis AtencioFunctional Programming in JavaScript by Luis Atencio
Functional Programming in JavaScript by Luis AtencioLuis Atencio
 
Introduction to Functional Programming in JavaScript
Introduction to Functional Programming in JavaScriptIntroduction to Functional Programming in JavaScript
Introduction to Functional Programming in JavaScripttmont
 
Domain Modeling in a Functional World
Domain Modeling in a Functional WorldDomain Modeling in a Functional World
Domain Modeling in a Functional WorldDebasish Ghosh
 
Introduction to Storm
Introduction to Storm Introduction to Storm
Introduction to Storm Chandler Huang
 
DNS Security Presentation ISSA
DNS Security Presentation ISSADNS Security Presentation ISSA
DNS Security Presentation ISSASrikrupa Srivatsan
 
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013Introduction and Overview of Apache Kafka, TriHUG July 23, 2013
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013mumrah
 
From cache to in-memory data grid. Introduction to Hazelcast.
From cache to in-memory data grid. Introduction to Hazelcast.From cache to in-memory data grid. Introduction to Hazelcast.
From cache to in-memory data grid. Introduction to Hazelcast.Taras Matyashovsky
 
Cassandra Introduction & Features
Cassandra Introduction & FeaturesCassandra Introduction & Features
Cassandra Introduction & FeaturesDataStax Academy
 
Etsy Activity Feeds Architecture
Etsy Activity Feeds ArchitectureEtsy Activity Feeds Architecture
Etsy Activity Feeds ArchitectureDan McKinley
 
Introduction to Apache ZooKeeper
Introduction to Apache ZooKeeperIntroduction to Apache ZooKeeper
Introduction to Apache ZooKeeperSaurav Haloi
 

Viewers also liked (20)

Airbnb tech talk: Levi Weintraub on webkit
Airbnb tech talk: Levi Weintraub on webkitAirbnb tech talk: Levi Weintraub on webkit
Airbnb tech talk: Levi Weintraub on webkit
 
"Немного о функциональном программирование в JavaScript" Алексей Коваленко
"Немного о функциональном программирование в JavaScript" Алексей Коваленко"Немного о функциональном программирование в JavaScript" Алексей Коваленко
"Немного о функциональном программирование в JavaScript" Алексей Коваленко
 
Who's More Functional: Kotlin, Groovy, Scala, or Java?
Who's More Functional: Kotlin, Groovy, Scala, or Java?Who's More Functional: Kotlin, Groovy, Scala, or Java?
Who's More Functional: Kotlin, Groovy, Scala, or Java?
 
Pushing Python: Building a High Throughput, Low Latency System
Pushing Python: Building a High Throughput, Low Latency SystemPushing Python: Building a High Throughput, Low Latency System
Pushing Python: Building a High Throughput, Low Latency System
 
London React August - GraphQL at The Financial Times - Viktor Charypar
London React August - GraphQL at The Financial Times - Viktor CharyparLondon React August - GraphQL at The Financial Times - Viktor Charypar
London React August - GraphQL at The Financial Times - Viktor Charypar
 
CSS/SVG Matrix Transforms
CSS/SVG Matrix TransformsCSS/SVG Matrix Transforms
CSS/SVG Matrix Transforms
 
HTML5 Essentials
HTML5 EssentialsHTML5 Essentials
HTML5 Essentials
 
jQuery Essentials
jQuery EssentialsjQuery Essentials
jQuery Essentials
 
gevent at TellApart
gevent at TellApartgevent at TellApart
gevent at TellApart
 
Map, Flatmap and Reduce are Your New Best Friends: Simpler Collections, Concu...
Map, Flatmap and Reduce are Your New Best Friends: Simpler Collections, Concu...Map, Flatmap and Reduce are Your New Best Friends: Simpler Collections, Concu...
Map, Flatmap and Reduce are Your New Best Friends: Simpler Collections, Concu...
 
Functional Programming in JavaScript by Luis Atencio
Functional Programming in JavaScript by Luis AtencioFunctional Programming in JavaScript by Luis Atencio
Functional Programming in JavaScript by Luis Atencio
 
Introduction to Functional Programming in JavaScript
Introduction to Functional Programming in JavaScriptIntroduction to Functional Programming in JavaScript
Introduction to Functional Programming in JavaScript
 
Domain Modeling in a Functional World
Domain Modeling in a Functional WorldDomain Modeling in a Functional World
Domain Modeling in a Functional World
 
Introduction to Storm
Introduction to Storm Introduction to Storm
Introduction to Storm
 
DNS Security Presentation ISSA
DNS Security Presentation ISSADNS Security Presentation ISSA
DNS Security Presentation ISSA
 
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013Introduction and Overview of Apache Kafka, TriHUG July 23, 2013
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013
 
From cache to in-memory data grid. Introduction to Hazelcast.
From cache to in-memory data grid. Introduction to Hazelcast.From cache to in-memory data grid. Introduction to Hazelcast.
From cache to in-memory data grid. Introduction to Hazelcast.
 
Cassandra Introduction & Features
Cassandra Introduction & FeaturesCassandra Introduction & Features
Cassandra Introduction & Features
 
Etsy Activity Feeds Architecture
Etsy Activity Feeds ArchitectureEtsy Activity Feeds Architecture
Etsy Activity Feeds Architecture
 
Introduction to Apache ZooKeeper
Introduction to Apache ZooKeeperIntroduction to Apache ZooKeeper
Introduction to Apache ZooKeeper
 

Similar to Анонимные записи в Haskell. Никита Волков

Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin
 
Реальный мир и хорошие модели данных.
Реальный мир и хорошие модели данных. Реальный мир и хорошие модели данных.
Реальный мир и хорошие модели данных. Victor Agroskin
 
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"Anatoly Levenchuk
 
массивы Php
массивы Phpмассивы Php
массивы PhpVasya Petrov
 
Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Sergey Nemchinsky
 
Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...
Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...
Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...solit
 
Rust: история языка и контекст применения
Rust: история языка и контекст примененияRust: история языка и контекст применения
Rust: история языка и контекст примененияNikita Baksalyar
 
"Война типов: сильные против слабых" Виктор Полищук
"Война типов: сильные против слабых" Виктор Полищук"Война типов: сильные против слабых" Виктор Полищук
"Война типов: сильные против слабых" Виктор ПолищукFwdays
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
 
Erlang and OCaml Experience at Echo
Erlang and OCaml Experience at EchoErlang and OCaml Experience at Echo
Erlang and OCaml Experience at EchoLev Walkin
 
Лев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangЛев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangYury Yurevich
 
Msu.Center.Lectures.J01 Introducing Java
Msu.Center.Lectures.J01 Introducing JavaMsu.Center.Lectures.J01 Introducing Java
Msu.Center.Lectures.J01 Introducing Javaolegol
 
Анализ текста на основе лексико-синтаксичеких шаблонов c сокращением многов...
Анализ  текста на основе лексико-синтаксичеких  шаблонов c сокращением многов...Анализ  текста на основе лексико-синтаксичеких  шаблонов c сокращением многов...
Анализ текста на основе лексико-синтаксичеких шаблонов c сокращением многов...Alexey Noskov
 

Similar to Анонимные записи в Haskell. Никита Волков (20)

Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)
 
Invisible
InvisibleInvisible
Invisible
 
Rspec
RspecRspec
Rspec
 
Реальный мир и хорошие модели данных.
Реальный мир и хорошие модели данных. Реальный мир и хорошие модели данных.
Реальный мир и хорошие модели данных.
 
Step 1
Step 1Step 1
Step 1
 
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"
 
лекция 4
лекция 4лекция 4
лекция 4
 
лекция 4
лекция 4лекция 4
лекция 4
 
массивы Php
массивы Phpмассивы Php
массивы Php
 
Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"
 
Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...
Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...
Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...
 
Rust: история языка и контекст применения
Rust: история языка и контекст примененияRust: история языка и контекст применения
Rust: история языка и контекст применения
 
Step 5
Step 5Step 5
Step 5
 
"Война типов: сильные против слабых" Виктор Полищук
"Война типов: сильные против слабых" Виктор Полищук"Война типов: сильные против слабых" Виктор Полищук
"Война типов: сильные против слабых" Виктор Полищук
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
 
Erlang and OCaml Experience at Echo
Erlang and OCaml Experience at EchoErlang and OCaml Experience at Echo
Erlang and OCaml Experience at Echo
 
Лев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangЛев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про Erlang
 
Msu.Center.Lectures.J01 Introducing Java
Msu.Center.Lectures.J01 Introducing JavaMsu.Center.Lectures.J01 Introducing Java
Msu.Center.Lectures.J01 Introducing Java
 
Анализ текста на основе лексико-синтаксичеких шаблонов c сокращением многов...
Анализ  текста на основе лексико-синтаксичеких  шаблонов c сокращением многов...Анализ  текста на основе лексико-синтаксичеких  шаблонов c сокращением многов...
Анализ текста на основе лексико-синтаксичеких шаблонов c сокращением многов...
 
Scala lecture #4
Scala lecture #4Scala lecture #4
Scala lecture #4
 

Анонимные записи в Haskell. Никита Волков