Группа Arrow

В функциональном программировании Arrow — это абстракция, обобщающая понятие функций и позволяющая работать с вычислениями как с объектами первого класса. Концепция была введена Джоном Хьюзом для структурирования программ, где вычисления могут комбинироваться и преобразовываться в более сложные конструкции. В Scala эта концепция реализуется через классы типов, которые предоставляют гибкость для построения композиционных программ, моделируя компонуемые отношения между двумя типами — например, функцию A => B, Kleisli (обертывание A => F[B]) или Cokleisli (обертывание F[A] => B). Стрелку F[A, B] можно рассматривать как представление вычисления от A до B с некоторым контекстом, аналогично тому, как функтор/аппликатив/монада F[A] представляет значение A с контекстом.

Группа Arrow включает в себя несколько связанных классов типов. Эти классы типов позволяют:

Использование

Группа Arrow находит применение в различных областях функционального программирования. Эти абстракции позволяют работать с вычислениями как с объектами первого класса, обеспечивая гибкость и модульность. Вот основные области, где используется группа Arrow:

Схема

classDiagram
    class Compose~ =>: ~{
        +compose[A, B, C](f: B =>: C, g: A =>: B) A =>: C
    }
    class Category~ =>: ~{
        +id[A]: A =>: A    
    }
    Compose <|-- Category 
    class Split~ =>: ~{
        +split[A, B, C, D](f: A =>: B, g: C =>: D) (A, C) =>: (B, D)   
    }
    Compose <|-- Split 
    class Profunctor~ =>: ~{
        +mapfst[A, B, C](fab: A =>: B)(f: C => A) C =>: B
        +mapsnd[A, B, C](fab: A =>: B)(f: B => C) A =>: C
        +dimap[A, B, C, D](fab: A =>: B)(f: C => A)(g: B => D) C =>: D
    }
    class Strong~ =>: ~{
        +first[A, B, C](fa: A =>: B) (A, C) =>: (B, C)
        +second[A, B, C](fa: A =>: B) (C, A) =>: (C, B)
    }
    Profunctor <|-- Strong 
    class Arrow~ =>: ~{
        +arr[A, B](f: A => B) A =>: B
    }
    Category <|-- Arrow 
    Split <|-- Arrow
    Strong <|-- Arrow
    class Choice~ =>: ~{
        +choice[A, B, C](fac: A =>: C, fbc: B =>: C) Either[A, B] =>: C
    }
    Category <|-- Choice
    class ArrowChoice~ =>: ~{
        +choose[A, B, C, D](f: A =>: C)(g: B =>: D) Either[A, B] =>: Either[C, D]
    }
    Choice <|-- ArrowChoice
    Arrow <|-- ArrowChoice

Ссылки: