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

CNumber

Прежде чем мы перейдем к функциям и преобразованиям типов значений, нам нужно создать тип значения, к которому стоит применять функции и преобразования. Мы могли бы легко использовать такие типы, как String или Int, но это не обязательно поможет в понимании математики, лежащей в основе функционального программирования, потому что Apple уже так много сделала для нас с этими типами, поэтому использование этих типов можно рассматривать как упрощение.

Сказав это, пришло время создать тип, и лучший тип, который я могу придумать прямо сейчас, это тип под названием CNumber, что означает Complex Number. Если вы этого не сделаете, не знаю, комплексные числа - это числа, которые могут быть представлены

a + i(b)

где a и b — действительные числа, а i — мнимая единица измерения. Думайте об i как о модификаторе. Если бы вы удалили i из i(b), то у вас было бы просто действительное число b. Добавьте i, и теперь у вас есть комплексное число. Это так просто.

Вот как будет выглядеть этот тип значения:

Двойное расширение и операторы перегрузки

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

Расширение CNumber

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

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

Прямо сейчас единственный способ сравнить два CNumber — это сравнить их отдельные части, потому что Swift понимает, что означает Double == Double, но не знает, что означает CNumber == CNumber.

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

Заключение

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