Split

Формальное определение

Split - полугруппоид (Compose), допускающий произведения.

Split должен удовлетворять законам Compose.

Определение в виде кода на Scala

trait Split[=>:[_, _]] extends Compose[=>:]:
  def split[A, B, C, D](f: A =>: B, g: C =>: D): (A, C) =>: (B, D)

Примеры

Функция от одной переменной

object Split:
  given Split[Function1] with
    override def compose[A, B, C](f: B => C, g: A => B): A => C = g andThen f

    override def split[A, B, C, D](f: A => B, g: C => D): ((A, C)) => (B, D) =
      (a, c) => (f(a), g(c))

Реализация

Реализация в Cats

import cats.*, cats.data.*, cats.syntax.all.*

lazy val f = (_:Int) + 1
lazy val g = (_:Int) * 100

(f split g)((1, 1))
// res0: (Int, Int) = (2, 100)

Реализация в ScalaZ

import scalaz.*
import Scalaz.*

// ... Все операции родителей

Ссылки: