Прошлый пост был о том, как пользоваться составным типом данных — точкой на плоскости. Теперь о том, как этот тип реализовать. Сделать это можно при помощи пар.
Пара — это структура данных, которая объединяет в себе два значения. В джаваскрипте пар по дефолту нет, поэтому чтобы их использовать придется самостоятельно задать функцию-конструктор 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);
Для создания собственных типов данных есть две причины:
Упрощение кода. С точками на плоскости это не так заметно, но когда объект составлен больше чем из двух элементов, то удобнее пользоваться селекторами, чем добираться до внутренностей многократно вложенной пары серией из first
и second
.
Отделение интерфейса от реализации. Разделять их нужно, чтобы при изменении реализации типов, не нужно было менять код, их использующий. Например если я захочу поменять местами координаты точки в паре, то без интерфейса придется найти все места, где я использую first(point)
для нахождения координаты x
и заменить на second(point)
. И наоборот. А если есть интерфейс, то достаточно будет переписать пару функций getX
и getY
.
Прошел пару первых уроков из курса «составные данные»: Первый учит моделировать объекты типа «точка на плоскости».
Для работы с точками на плоскости объявляются функция-конструктор 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
.
Решил на хекслете упражнение на числа Черча. Решение: https://repl.it/repls/MistyroseSpotlessBustard.
Числа Черча связаны с понятием лямбда-исчисления. Это такая система, в которой вычисления выражают только анонимными функциями. Оказывается, одних функций достаточно, чтобы выразить любую программу, обойдясь без всяких циклов, рекурсий и условных операторов. Так вот числа Черча — это способ, которым в лямбда-исчислении выражают натуральные числа.
Нужно было задать функцию, соответствующую нулю и функцию добавления единицы к числу. Заодно факультативно написал функции сложения и умножения двух чисел. Вычитание тоже хотел сделать, но не придумал, как можно от числа Черча отнять единицу. В целом, упражнение крайне полезное чтобы привыкнуть к манипуляциям с функциями высшего порядка.
Само название чисел черча поначалу мне сильно мешало понять их смысл. По сути числом Черча называют функцию, которая принимает некую функцию, некий аргумент, потом применяет эту функцию к аргументу столько раз, какое число вся эта конструкция призвана символизировать, и возвращает полученный результат. Тройка, например, выражается так:
f => x => f(f(f(x)))
Как видим, к привычным числам все это имеет весьма отдаленное отношение.
Начал следующий курс на хекслете, про основы командной строки. Терминалом я пользуюсь достаточно редко, поэтому когда приходится в него залезать, я каждый раз иду смотреть видосы о том, какая команда что делает. У для этого даже есть любимая серия уроков, в которой все доходчиво разжевано.
Сегодня прошел курс про основы html, css и веб-дизайна на хекслете.
С версткой я знаком давно, из нового в курсе узнал лишь как делать разметку в коде, чтобы соцсети при отрисовке ссылки на страницу использовали нужные данные (заголовок, картинка и т. д.).
Для этого придуман специальный протокол — open graph. Суть проста: внутри head прописываешь meta теги с атрибутами property типа og:title, og:image и соответствующими атрибутами content.
Для начала расскажу, какие источники я использую для обучения.
Есть такой хороший сайт с онлайн курсами по программированию: hexlet.io. На нем есть программа обучения фронтенду, которую я активно начал проходить пару недель назад. За это время успел пройти 6 курсов из 22 в программе.
Параллельно с курсами на хекслете не спеша читаю книгу how to design programs Книга предназначена для новичков и делает акцент на обучении систематическому методу к созданию программ. Я пока нахожусь в середине первой главы, но уже вынес из нее подход, который сделал процесс программирования для меня заметно проще и приятнее.
Привет! Меня зовут Игнат. Я изучаю веб-программирование, а в этом блоге буду документировать процесс обучения.
Занимаюсь дизайном, в основном рисую сайты и веб-приложения. Хочу научиться воплощать свои идеи не только на картинке, но и в жизни, для чего и взялся за программирование.
Блог выступит в роли конспекта. Изучив что-нибудь новое, прочитав главу из книжки, или пройдя курс, я перескажу все что понял здесь в сокращенном виде. По задумке, такой метод вынудит меня глубже разобраться в теме: пока сам не въехал, внятно объяснить не сможешь.
В первую очередь буду писать о темах, напрямую связанных с веб-программированием: javascript, html/css, фронт- и бекенд фреймворки.
Со временем попробую реализовать какие-нибудь проекты, попутно описывая процесс тут.
Несколько книг по программированию я уже открывал, из которых вынес начальное представление о теме. Поэтому азы вроде «как работает цикл» я пропущу и попробую разобраться, как, имея некоторые минимальные теоретические знания, начать применять их на практике.
С радостью принимаю любые вопросы, комментарии и пожелания в телеграме.