Обзор модуля SumTypes.jl, который позволяет реализовать систему суммирующих типов в Julia.

SumTypes.jl

В экосистеме пакетов языка программирования Julia есть множество действительно крутых модулей, которые могут кардинально изменить синтаксис языка. В первую очередь это связано с макросами, но в некоторых случаях самоанализ также может привести к довольно удивительным результатам. Одним из примеров такого пакета является SumTypes.jl, юлианская реализация типов суммы. Этот модуль может манипулировать синтаксисом языка Julia для предоставления типов сумм, также называемых размеченными или непересекающимися объединениями.

"блокнот"

Что такое суммовые типы?

Типы суммы — это система типов, в которой типы помечены типами, из которых они происходят. В этом смысле имена суммирующих типов имеют большой смысл. Типы суммируются один в ряд. Представьте себе планету с кучей лун, где все луны имеют отношение к тому, чтобы быть луной этой планеты. Далее по телескопу луны имеют вращающиеся обломки, которые считаются вращающимися вокруг луны. Это идея системы типов типа суммы, которая теперь перенесена в Джулию через SumTypes.jl.

Введение в SumTypes.jl



Использование SumTypes.jl для составления типов сумм невероятно просто с этим модулем. Создать тип суммы так же просто, как вызвать макрос sum_type. Затем мы предоставляем имя типа, например мой тип, который будет овощным:

@sum_type Vegetable{C, P, O} begin
    Cucumber{C}(::C)
    Pepper{P}(::P)
    Onion{O}(::O)
end

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

typeof(Cucumber(:green))
Vegetable{Symbol, Uninit}

Используя эту технику, мы, по сути, обертываем vakue определенного определенного типа, а также типы аргументов, которые были предоставлены конструктору через наши параметры. Настоящая сила SumTypes обычно проявляется, когда он используется с сопоставлением шаблонов. Это связано с тем, что концепция действительно превосходна в одном, в частности, в создании быстрых и простых структур данных с целью общего наследования и типа среди них. Отличным примером того, где что-то подобное может пригодиться, являются ключи. Представим на секунду, что у нас есть несколько имен ключей, зарегистрированных в кодах ключей. Мы хотим иметь возможность индексировать и работать с этими именами, однако мы знаем, что все типы кодов клавиш будут разными. Мы могли бы создать Dict{String, Any}, чтобы справиться с этим, и этот подход, безусловно, будет работать, однако типы сумм, безусловно, создают лучший метод хранения этих данных, а не индексирование пар внутри значения пары и наличие шести из них [] [] последовательно после имени вашей структуры.

@cases inmy_salad begin
           Cucumber() => "cucmber"
           Pepper() => "pepper"
        Onion() => "Onion"
       end
"cucmber"

Разумеется; это действительно здорово, и добавляет совершенно новую парадигму в Julia, что, безусловно, интересно для программирования. Должен признаться, этот пакет был моим первым опытом работы с такой системой типов, так же как Julia был первым языком, с которым я пробовал многократная отправка. Тем не менее, это определенно то, что мне нравится, и я мог бы увидеть его реализацию в некоторых из моих будущих проектов.

Заключение

SumTypes.jl — действительно классный пакет, добавляющий в язык программирования Julia несколько невероятно уникальных функций. Создатель модуля, Мейсон Проттер, также является создателем ReplMaker.jl, еще одного пакета, о котором я уже говорил. вот ссылка на ту статью:



Излишне говорить, что за Мэйсоном стоит подписаться и отметить его пакеты! Я с нетерпением жду возможности попробовать этот модуль в некоторых приложениях в своих проектах, и я надеюсь, что то же самое можно сказать и о вас, или, по крайней мере, вы нашли модуль интересным. Спасибо за чтение!