Skip to main content
Version: v2.2.82 (latest)
Reference · Collections

Array Monoid

Combining arrays using monoid operations. Arrays form a monoid under concatenation, enabling powerful composition patterns.

01

Core API

FunctionSignatureDescription
Foldfunc Fold[A any](m Monoid[A]) func([]A) AFold array using monoid
FoldMapfunc FoldMap[A, B any](m Monoid[B]) func(func(A) B) func([]A) BMap then fold
ConcatAllfunc ConcatAll[A any](m Monoid[[]A]) func([][]A) []AConcatenate all elements
Monoidfunc Monoid[A any]() Monoid[[]A]Array monoid instance
02

Usage Examples

Fold

fold.go
import (
  A "github.com/IBM/fp-go/v2/array"
  F "github.com/IBM/fp-go/v2/function"
  M "github.com/IBM/fp-go/v2/monoid"
  N "github.com/IBM/fp-go/v2/number"
  S "github.com/IBM/fp-go/v2/string"
)

// Sum numbers
numbers := []int{1, 2, 3, 4, 5}
sum := F.Pipe2(
  numbers,
  A.Fold(N.MonoidSum),
)
// 15

// Concatenate strings
words := []string{"Hello", " ", "World"}
result := F.Pipe2(
  words,
  A.Fold(S.Monoid),
)
// "Hello World"

FoldMap

foldmap.go
type Product struct {
  Name  string
  Price float64
}

products := []Product{
  {Name: "Laptop", Price: 999},
  {Name: "Mouse", Price: 29},
  {Name: "Keyboard", Price: 79},
}

// Calculate total price
total := F.Pipe2(
  products,
  A.FoldMap(M.MonoidSum[float64]())(func(p Product) float64 {
      return p.Price
  }),
)
// 1107.0

ConcatAll

concat.go
// Flatten nested arrays
nested := [][]int{{1, 2}, {3, 4}, {5}}
flat := A.ConcatAll(A.Monoid[int]())(nested)
// []int{1, 2, 3, 4, 5}

Aggregating Data

aggregate.go
type Sale struct {
  Amount   float64
  Quantity int
}

sales := []Sale{
  {Amount: 100, Quantity: 2},
  {Amount: 200, Quantity: 1},
  {Amount: 50, Quantity: 5},
}

totalAmount := F.Pipe2(
  sales,
  A.FoldMap(M.MonoidSum[float64]())(func(s Sale) float64 {
      return s.Amount
  }),
)
// 350.0

totalQuantity := F.Pipe2(
  sales,
  A.FoldMap(M.MonoidSum[int]())(func(s Sale) int {
      return s.Quantity
  }),
)
// 8

Custom Monoid

custom.go
type ValidationResult struct {
  Errors []string
  Valid  bool
}

// Monoid for validation results
validationMonoid := M.MakeMonoid(
  func(a, b ValidationResult) ValidationResult {
      return ValidationResult{
          Errors: append(a.Errors, b.Errors...),
          Valid:  a.Valid && b.Valid,
      }
  },
  ValidationResult{Errors: []string{}, Valid: true},
)

results := []ValidationResult{
  {Errors: []string{}, Valid: true},
  {Errors: []string{"Invalid email"}, Valid: false},
  {Errors: []string{"Password too short"}, Valid: false},
}

combined := F.Pipe2(
  results,
  A.Fold(validationMonoid),
)
// ValidationResult{
//   Errors: []string{"Invalid email", "Password too short"},
//   Valid: false,
// }