Пары

Прошлый пост был о том, как пользоваться составным типом данных — точкой на плоскости. Теперь о том, как этот тип реализовать. Сделать это можно при помощи пар.

Пара — это структура данных, которая объединяет в себе два значения. В джаваскрипте пар по дефолту нет, поэтому чтобы их использовать придется самостоятельно задать функцию-конструктор cons и две функции-селектора: first для первого значения и second для второго. Работают они так:

const pair = cons('left', 'right')
first(pair)  // возвращает 'left'
second(pair)  // возвращает 'right'

Конструктору пары можно передавать другие пары. Таким образом вкладывая пары друг в друга можно создавать сколь угодно сложные типы данных.

Во вчерашнем посте была функция makePoint, которая создает объект, описывающий точку на плоскости. Вот так выглядит ее реализация:

const makePoint = (x, y) => cons(x, y);
const getX = point => first(point);
const getY = point => second(point);

Функции для создания и манипуляции объектами какого-то типа называются «интерфейс». Зачем нужно задавать эти функции, если можно создавать и использовать точки напрямую через cons, first, second?

const point = cons(x, y);
const x = first(point);

Для создания собственных типов данных есть две причины:

  1. Упрощение кода. С точками на плоскости это не так заметно, но когда объект составлен больше чем из двух элементов, то удобнее пользоваться селекторами, чем добираться до внутренностей многократно вложенной пары серией из first и second.

  2. Отделение интерфейса от реализации. Разделять их нужно, чтобы при изменении реализации типов, не нужно было менять код, их использующий. Например если я захочу поменять местами координаты точки в паре, то без интерфейса придется найти все места, где я использую first(point) для нахождения координаты x и заменить на second(point). И наоборот. А если есть интерфейс, то достаточно будет переписать пару функций getX и getY.

13 января 2018

Составные данные

Прошел пару первых уроков из курса «составные данные»: Первый учит моделировать объекты типа «точка на плоскости».

Для работы с точками на плоскости объявляются функция-конструктор makePoint и две функции-селектора getX и getY. Конструктор принимает два аргумента: x и y, которые соответствуют координатам точки и возвращает объект, который эту точку олицетворяет. Селекторы наоборот, принимают объект-точку и возвращают число, соответствующее координате x или y этой точки.

Вот так, например, создается точка, которая лежит в начале координат:

const point = makePoint(0, 0)

Если хотим посмотреть, какая у точки координата x, то используем соответствующий селектор:

const x = getX(point)

Теперь можно позадавать разные операции над точками. Вот, например, функция, которая получив любую точку возвращает новую точку, отраженную относительно оси X:

const symmetricalXPoint = (point) => makePoint(getX(point), getY(point))

Может возникнуть вопрос, а зачем все эти конструкторы и селекторы? Нельзя использовать обычные числовые константы для работы с этими точками? Можно, если захотеть. Для примера, возьмем задачу найти середину между двумя точками: (1, 1) и (3, 7). Решение просто на числах будет выглядеть примерно так:

// первая точка
const x1 = 1;
const y1 = 1;

// вторая точка
const x2 = 3;
const y2 = 7;

// точка между первой и второй
const x3 = middle(x1, x2);
const y3 = middle(y1, y2);

То же самое, но используя тип данных для точки:
const p1 = makePoint(1, 1);
const p2 = makePoint(7, 3);
const p3 = middle(p1, p2);

В первом случае код захламлен горой констант с разными координатами, которые никак между собой не связаны. Приходится внимательно следить, какая координата к какой точке относится. Представим на минуту, что будет, если в программе точек не три, а сотни. И расположены они не на плоскости, а в четырехмерном пространстве.

В следующем посте о том, как реализовать функции makePoint, getX и getY.

12 января 2018

Числа черча

Решил на хекслете упражнение на числа Черча. Решение: https://repl.it/repls/MistyroseSpotlessBustard.

Числа Черча связаны с понятием лямбда-исчисления. Это такая система, в которой вычисления выражают только анонимными функциями. Оказывается, одних функций достаточно, чтобы выразить любую программу, обойдясь без всяких циклов, рекурсий и условных операторов. Так вот числа Черча — это способ, которым в лямбда-исчислении выражают натуральные числа.

Нужно было задать функцию, соответствующую нулю и функцию добавления единицы к числу. Заодно факультативно написал функции сложения и умножения двух чисел. Вычитание тоже хотел сделать, но не придумал, как можно от числа Черча отнять единицу. В целом, упражнение крайне полезное чтобы привыкнуть к манипуляциям с функциями высшего порядка.

Само название чисел черча поначалу мне сильно мешало понять их смысл. По сути числом Черча называют функцию, которая принимает некую функцию, некий аргумент, потом применяет эту функцию к аргументу столько раз, какое число вся эта конструкция призвана символизировать, и возвращает полученный результат. Тройка, например, выражается так:

f => x => f(f(f(x)))

Как видим, к привычным числам все это имеет весьма отдаленное отношение.

11 января 2018

Терминал

Начал следующий курс на хекслете, про основы командной строки. Терминалом я пользуюсь достаточно редко, поэтому когда приходится в него залезать, я каждый раз иду смотреть видосы о том, какая команда что делает. У для этого даже есть любимая серия уроков, в которой все доходчиво разжевано.

10 января 2018

OGP

Сегодня прошел курс про основы html, css и веб-дизайна на хекслете.

С версткой я знаком давно, из нового в курсе узнал лишь как делать разметку в коде, чтобы соцсети при отрисовке ссылки на страницу использовали нужные данные (заголовок, картинка и т. д.).

Для этого придуман специальный протокол — open graph. Суть проста: внутри head прописываешь meta теги с атрибутами property типа og:title, og:image и соответствующими атрибутами content.

Полное описание протокола

10 января 2018

Источники

Для начала расскажу, какие источники я использую для обучения.

Есть такой хороший сайт с онлайн курсами по программированию: hexlet.io. На нем есть программа обучения фронтенду, которую я активно начал проходить пару недель назад. За это время успел пройти 6 курсов из 22 в программе.

Параллельно с курсами на хекслете не спеша читаю книгу how to design programs Книга предназначена для новичков и делает акцент на обучении систематическому методу к созданию программ. Я пока нахожусь в середине первой главы, но уже вынес из нее подход, который сделал процесс программирования для меня заметно проще и приятнее.

9 января 2018

О блоге

Привет! Меня зовут Игнат. Я изучаю веб-программирование, а в этом блоге буду документировать процесс обучения.

Пара слов обо мне

Занимаюсь дизайном, в основном рисую сайты и веб-приложения. Хочу научиться воплощать свои идеи не только на картинке, но и в жизни, для чего и взялся за программирование.

О чем буду писать

Блог выступит в роли конспекта. Изучив что-нибудь новое, прочитав главу из книжки, или пройдя курс, я перескажу все что понял здесь в сокращенном виде. По задумке, такой метод вынудит меня глубже разобраться в теме: пока сам не въехал, внятно объяснить не сможешь.

В первую очередь буду писать о темах, напрямую связанных с веб-программированием: javascript, html/css, фронт- и бекенд фреймворки.

Со временем попробую реализовать какие-нибудь проекты, попутно описывая процесс тут.

Уровень сложности контента

Несколько книг по программированию я уже открывал, из которых вынес начальное представление о теме. Поэтому азы вроде «как работает цикл» я пропущу и попробую разобраться, как, имея некоторые минимальные теоретические знания, начать применять их на практике.

С радостью принимаю любые вопросы, комментарии и пожелания в телеграме.

8 января 2018
Стр. 5 из 5