Как мне создать свой собственный тип данных с помощью стрелки

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

Это просто использовать что-то вроде Option с предоставленными конструкторами расширения, такими как Some(data) или же None, Тем не менее, как я могу создать свой собственный тип данных, который имеет функциональные операторы, такие как map() или же flatMap()?

0 ответов

Шаги для создания типов данных в Arrow, которые соответствуют классам Type, таким как Functor и, следовательно, предоставить такие методы, как map здесь изложено:

  1. Включить эмуляцию более высокого типа. https://arrow-kt.io/docs/patterns/glossary/

  2. Реализуйте экземпляр класса типа https://arrow-kt.io/docs/patterns/glossary/

В двух ссылках выше есть пример, который использует ListK упаковка стандартного lib List, Что не упоминается в примере документации, так это то, что для расширения расширений, которые Functor будет добавлять поверх ListK, включая map, liftи т. д., как определено в Functor интерфейс требует капта и мета стрелка.

kapt    "io.arrow-kt:arrow-meta:$arrow_version"

Мета Arrow отвечает за расширение Higher Kinds и Extensions для экземпляров классов типов. Одним из ограничений в текущем расширении является то, что если вы планируете использовать оба @higherkind а также @extension в том же модуле он не будет работать из-за порядка, в котором обрабатывается капт. Для этого вам нужно иметь типы данных в одном модуле и расширения в другом. На самом деле это хорошая практика, и мы следуем ей в Arrow, потому что она позволяет пользователям импортировать типы данных на заказ, когда они не хотят расширений.

Если я правильно понимаю ваш вопрос:

https://arrow-kt.io/docs/patterns/glossary/

Обратите внимание, что обработчики аннотаций должны иметь возможность генерировать экземпляры класса типов для вас. Но в основном вам просто нужно решить, какие классы типов будет поддерживать ваш тип данных, и предоставить реализации для этих классов типов. (Обратите внимание, что классы типов образуют иерархию наследования, поэтому (например), если вы реализуете Monad, вам (возможно) потребуется реализовать Functor.)

Другие вопросы по тегам