TGViewer
Khraks dev Khraks dev @khraks_dev · 108 subscribers
Post #50 309
Combiner & Reducer

В v4 добавили новые модули которые являются адаптированными Semigroup & Monoid из fp-ts.
Semigroup (Полугруппа) — это некий тип A и операция combine которая каким-то образом делает из двух экземпляров типа один. Как отражено в названии - комбинирует)

interface Combiner<A> {
combine: (self: A, that: A) => A
}

Самое интересное: подразумевается, что эта штука удовлетворяет неким законам.

// ассоциативность
(a⋅b)⋅c = a⋅(b⋅c)

Тут смысл такой что не важно в каком порядке выполняется операция комбинирования — результат будет тем же. Еще говорят, что полугруппа — это основа параллельности. Ну верно же: получается всю работу (выполнение всех операций combine`) можно выполнить на разных исполнителях параллельно (в примере ниже `ab и `cd`)

((a⋅b)⋅c)⋅d = (a⋅b)⋅(c⋅d)

Еще одним свойством является замкнутость — то есть комбинируя значения одного типа мы не получим значение другого.
Опять же удобство в композуемости — в других модулях предоставляются функции для построения более сложных комбайнеров)))

// Option.ts
declare function makeCombinerFailFast<A>(
combiner: Combiner<A>
): Combiner<Option<A>>

const sumNum: Combiner<number> = Combiner.make((a, b) => a + b)
const sumOpt: Combiner<Option<number>> = makeCombinerFailFast(sumNum)
// sumOpt(None, None) // None
// sumOpt(None, Option(2)) // None
// sumOpt(Option(2), None) // None
// sumOpt(Option(2), Option(1)) // Option(3)

Например тут мы поднимаем более простой комбайнер в Option и получаем новый — который объединяет непустые значения и оставляет пустые как есть.
Помимо "мерджа" значений можно выбрать один из 2х элементов:
например брать только первый или только второй элемент (`Combiner.first` & `Combiner.second`) .
А если скрестить силы с модулем Order то можно выбирать только максимальный или минимальный элементы.
В общем инкапсулируя некую логику по комбинированию в такую абстракцию мы получаем доступ к богатым возможностям которые предоставляет экосистема. А соблюдение законов дает гарантии поведения.
Пока вижу мало использования внутри v4 экосистемы напрямую — возможно предполагается использовать только саму combine функцию.

Использовали ли когда-то полугруппы? Были какие-то необычные примеры использования? Как вам нейминг?)
  • 👍 7
More from @khraks_dev
  1. Sep 10, 2026Добавил еще PR с Context.Mixin, чтобы подмешивать к классу поведение Context.Service Тепер…
  2. Sep 10, 2026Post #56
  3. Sep 7, 2026Post #55
  4. Sep 3, 2026Post #54
  5. Sep 3, 2026Итак HKT на основе TypeLambda interface TypeLambda { readonly Arg1: unknown; readonly Arg2…
  6. Aug 30, 2026# HKT Дефункционализация В TypeScript нет настоящих Higher-Kinded Types (HKT). А они приме…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →