You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2026/06/01 02:13:17 UTC

(groovy-website) branch asf-site updated: split last table

This is an automated email from the ASF dual-hosted git repository.

paulk-asert pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/groovy-website.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 607548c  split last table
607548c is described below

commit 607548c004b735aa47dfe6fdfd8719a9172e6ff6
Author: Paul King <pa...@asert.com.au>
AuthorDate: Mon Jun 1 12:13:07 2026 +1000

    split last table
---
 site/src/site/blog/groovy6-functional.adoc | 99 +++++++++++++++++++++---------
 1 file changed, 69 insertions(+), 30 deletions(-)

diff --git a/site/src/site/blog/groovy6-functional.adoc b/site/src/site/blog/groovy6-functional.adoc
index 79babcb..bad428f 100644
--- a/site/src/site/blog/groovy6-functional.adoc
+++ b/site/src/site/blog/groovy6-functional.adoc
@@ -1125,98 +1125,137 @@ For a JVM-resident FP audience, the comparison set is FunctionalJava,
 Vavr, HighJ, and the language alternatives Scala and Kotlin, with
 Haskell kept as the reference point. The Scala column is really
 Scala+Cats where it names `cats.*` types; Kotlin's FP rows lean on
-the Arrow library similarly.
+the Arrow library similarly. It splits across two tables that share
+the Concept and Groovy 6 columns — first against the JVM FP libraries,
+then against the languages.
 
-[cols="2,1,1,1,1,1,1,1",options="header"]
+.Versus the JVM FP libraries
+[cols="2,1,1,1,1",options="header"]
 |===
-| Concept | Groovy 6 | FunctionalJava | Vavr | HighJ | Scala | Kotlin | Haskell
+| Concept | Groovy 6 | FunctionalJava | Vavr | HighJ
 
 | Closures and composition
 | native (`>>`, `<<`, curry)
 | `fj.F`, `.o()`, curry on `F2..F8`
 | `Function0..Function8`, `andThen`/`compose`/`curried`/`memoized`
 | `Functions` combinators
-| native (`andThen`, `compose`)
-| native (lambdas, `::`, `andThen`/`compose` in stdlib)
-| native
 
 | Monoid / Semigroup
 | `@Associative`/`@Reducer` + `CombinerChecker`
 | `Monoid<A>`, `Semigroup<A>` values
 | n/a (uses `Foldable.reduce`)
 | `Monoid<µ>` typeclass instance
-| `cats.Monoid` typeclass
-| `arrow.typeclasses.Monoid`
-| `Monoid` class
 
 | Purity & effects
 | `@Pure(allows = ...)` + `PurityChecker`
 | n/a (convention only)
 | `Try` lifts effects to a value
 | `IO<µ>` simulation
-| `cats.effect.IO`
-| `suspend` + `arrow` effects
-| `IO`, `State`, etc.
 
 | Frame conditions
 | `@Modifies` + `ModifiesChecker`
 | n/a
 | n/a
 | n/a
-| n/a (libraries)
-| n/a
-| n/a
 
 | Monadic comprehension
 | `DO` (GEP-23, no HKT)
 | n/a (hand-written `.bind`)
 | `For(...).yield(fn)` ("For-Comprehension")
 | simulated, with µ tags
-| `for { ... } yield`
-| `arrow` `either { }`/`nullable { }` bind blocks
-| `do { ... }`
 
 | Null / absence
 | `NullChecker` (strict)
 | `fj.data.Option`
 | `Option`
 | `Maybe<µ>`
-| `Option`
-| native nullable types (`T?`)
-| `Maybe`
 
 | Validation / errors
 | `fj.data.Validation` and `io.vavr.control.{Try, Either, Validation}` in `DO`
 | `Validation<E, A>`
 | `Try`, `Either`, `Validation`
 | `Either<µ, µ>`
-| `Either`, `Validated`
-| `arrow.core.{Either, Validated}`
-| `Either`, `Validation`
 
 | Persistent collections
 | `.asImmutable()` (view); `@Immutable` (deep-frozen)
 | `fj.data.List`, `fj.data.Stream`
 | `io.vavr.collection.{List, Vector, HashMap, ...}` (HAMT-based, structural sharing)
 | n/a
-| `scala.collection.immutable.*` (persistent)
-| `kotlinx.collections.immutable` (persistent)
-| native (persistent everywhere)
 
 | Termination
 | `@Decreases` (Hoare)
 | n/a
 | n/a
 | n/a
-| n/a (libraries)
-| n/a
-| totality checker (extensions)
 
 | Higher-kinded abstraction
 | no
 | no (encoded by hand)
 | no (encoded by hand)
 | simulated HKT
+|===
+
+.Versus the languages (Scala+Cats, Kotlin+Arrow; Haskell for reference)
+[cols="2,1,1,1,1",options="header"]
+|===
+| Concept | Groovy 6 | Scala | Kotlin | Haskell
+
+| Closures and composition
+| native (`>>`, `<<`, curry)
+| native (`andThen`, `compose`)
+| native (lambdas, `::`, `andThen`/`compose` in stdlib)
+| native
+
+| Monoid / Semigroup
+| `@Associative`/`@Reducer` + `CombinerChecker`
+| `cats.Monoid` typeclass
+| `arrow.typeclasses.Monoid`
+| `Monoid` class
+
+| Purity & effects
+| `@Pure(allows = ...)` + `PurityChecker`
+| `cats.effect.IO`
+| `suspend` + `arrow` effects
+| `IO`, `State`, etc.
+
+| Frame conditions
+| `@Modifies` + `ModifiesChecker`
+| n/a (libraries)
+| n/a
+| n/a
+
+| Monadic comprehension
+| `DO` (GEP-23, no HKT)
+| `for { ... } yield`
+| `arrow` `either { }`/`nullable { }` bind blocks
+| `do { ... }`
+
+| Null / absence
+| `NullChecker` (strict)
+| `Option`
+| native nullable types (`T?`)
+| `Maybe`
+
+| Validation / errors
+| `fj.data.Validation` and `io.vavr.control.{Try, Either, Validation}` in `DO`
+| `Either`, `Validated`
+| `arrow.core.{Either, Validated}`
+| `Either`, `Validation`
+
+| Persistent collections
+| `.asImmutable()` (view); `@Immutable` (deep-frozen)
+| `scala.collection.immutable.*` (persistent)
+| `kotlinx.collections.immutable` (persistent)
+| native (persistent everywhere)
+
+| Termination
+| `@Decreases` (Hoare)
+| n/a (libraries)
+| n/a
+| totality checker (extensions)
+
+| Higher-kinded abstraction
+| no
 | native
 | no (Arrow dropped HKT encoding)
 | native