# Arrow for Kotlin: typed functional programming without leaving the language

> Arrow is a Kotlin library that supplies Option, Either, optics and typed error handling. It suits teams already on Kotlin who want functional data types and explicit failure paths, and it is a poor fit for anyone expecting a general-purpose framework.

**arrow-kt/arrow** — The perfect companion for your Kotlin journey - Inspired by functional, data-oriented and concurrent programming

- Repository: https://github.com/arrow-kt/arrow
- Website: http://arrow-kt.io
- Stars: 6,582 · Forks: 473
- Language: Kotlin
- License: NOASSERTION
- Published: 2026-09-22 · Updated: 2026-09-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/arrow-kt-arrow

## What Arrow adds to a Kotlin codebase

Kotlin ships nullability in the type system but leaves error handling to exceptions and sealed classes you write yourself. Arrow fills that gap with data types such as Option and Either, functional operators such as zipOrAccumulate, and computation blocks. The README describes the project as a library for Typed Functional Programming in Kotlin and states that it aims to provide a lingua franca of interfaces and abstractions across Kotlin libraries. That framing matters: Arrow is not a web framework, an ORM or a dependency injection container. It is a set of abstractions that other libraries can build on, and the topics list on the repository includes typeclasses, monads, optics and functional data structures. The audience is Kotlin developers who already accept that a function returning Either<Error, Value> is more informative than one that throws, and who want that style supported by library code rather than by convention.

## How the abstractions are organised in arrow-libs

The repository root holds build.gradle.kts, settings.gradle.kts, buildSrc/ and a single source directory, arrow-libs/. Everything published lives under that directory, which is why the README links to Maven Central with the group io.arrow-kt and the artifact arrow-core as the example. The documentation is not in this repository. The README states plainly that the documentation is hosted in a separate repository, arrow-kt/arrow-website, and it lists the learning paths that live there: quickstart and setup, typed errors, coroutines and resources, resilience, immutable data, and collections and functions. That split has a practical consequence. If you find a gap in the API reference, the fix belongs in a different repository from the code you are reading. The build itself is Gradle, with gradlew and gradlew.bat at the root, a gradle/ wrapper directory, and a generator-scripts/ directory alongside buildSrc/, which suggests parts of the codebase are produced rather than written by hand. The presence of kotlin-js-store/ and a test-optics-gradle-plugin.sh script indicates the project is built for more than one Kotlin target.

## Where to get Arrow and what the first step looks like

The README does not contain installation steps. It points to the quickstart and setup page on arrow-kt.io and shows a Maven Central badge for the io.arrow-kt group with arrow-core as the sample artifact. Those are the only coordinates the repository itself gives you, so confirm the version on Maven Central rather than copying one from a blog post. The README also names the types and operators the library provides, including Option, Either and zipOrAccumulate, and it links typed errors as a separate learning path, which is where the Either examples live. Because the README carries a Kotlin 1.8.10 badge, check that badge against your own compiler before you add the dependency. Nothing in the repository describes a Gradle plugin, an annotation processor or a code generator you need to apply; the build files at the root are for building Arrow itself, not for consuming it.

## Where Arrow stops being the right tool

Arrow does not replace coroutines, and the README treats them as separate concerns: the documentation lists coroutines and resources as its own learning path rather than folding it into the core types. If your problem is scheduling, cancellation or structured concurrency, the Kotlin standard library is the answer and Arrow is not. The second limitation is the licence metadata. The repository's LICENSE file contains the Apache License, Version 2.0 text, and the README carries an Apache 2.0 badge, but the repository metadata reports the licence as NOASSERTION. That mismatch means automated licence scanners may flag the project even though the file itself is unambiguous. If your organisation gates dependencies on scanner output, resolve that before you add the dependency, not after. The third limitation is release cadence. The most recent releases listed are 2.3.0-alpha.2, 2.3.0-alpha.3 and 2.3.0-alpha.4, from July 2026, all alpha builds. A team that will not ship alpha artifacts needs to check what the current stable line is, because the release list here does not show one. The last push to the repository was on 2026-09-21, so the project is not dormant, but activity on main is not the same thing as a stable release you can pin.

## Arrow compared with hand-rolled sealed classes

The realistic alternative is not another library. It is writing your own sealed class hierarchy for results and your own extension functions for mapping and flat-mapping over it. That approach has real advantages: no dependency, no version skew against your Kotlin compiler, and full control over the shape of the API. What it does not give you is the shared vocabulary. The README's stated goal is a lingua franca of interfaces and abstractions across Kotlin libraries, and that is the actual difference. A hand-rolled Result type is understood by your team and nobody else. Either, Option and the typeclass hierarchy behind them are understood by anyone who has used Arrow, and third-party libraries can target those interfaces directly. The cost of the shared vocabulary is that you inherit the library's release cycle and its abstractions, including the ones you do not need. A small service with one failure mode does not benefit from a typeclass hierarchy, and adding Arrow there is overhead with no payoff.

## Maintenance, upgrades and licence implications

The repository is not archived and the last push was on 2026-09-21, one day before the date used for this assessment. Commits are landing. The release list, however, shows three consecutive alpha versions in July 2026 and nothing after them, so the upgrade path a stable user follows is not visible from this repository's releases. The README directs contributors to CONTRIBUTING.md and points users at the Kotlin Slack channels and the issue tracker for questions, which means upgrade guidance lives in the documentation repository rather than here. The README does not document rollback, and it does not describe a deprecation policy for the types it exposes. On licensing, the LICENSE file and the README badge both point to Apache License 2.0, while the repository metadata reports NOASSERTION. Apache 2.0 is a permissive licence with an explicit patent grant, but this is a description of what the files say, not legal advice. If your organisation has a licence review process, feed it the LICENSE file and the badge rather than the metadata field.

## Conclusion

Adopt Arrow if your codebase is Kotlin and you want Option, Either and typed errors expressed in the type system rather than through exceptions. Do not adopt it as an application framework or as a substitute for coroutines, and do not expect the README to tell you how to roll back a release, because it does not. Before committing, check the Maven Central coordinates for the module you need and confirm that the Kotlin version badge in the README matches your project's compiler, since the README lists Kotlin 1.8.10.

## FAQ

### What is the Arrow Kotlin library?

It is a library for typed functional programming in Kotlin. The README states that it provides data types such as Option and Either, operators such as zipOrAccumulate, and computation blocks, with the aim of offering a shared set of interfaces and abstractions across Kotlin libraries.

### How do I set up Arrow in a Kotlin project?

The README does not list installation steps; it links to the quickstart and setup page at arrow-kt.io and shows a Maven Central badge for the io.arrow-kt group with arrow-core as the example artifact. The version and the exact dependency snippet come from that page, not from the README.

### Does Arrow replace Kotlin coroutines?

No. The documentation treats coroutines and resources as a separate learning path from the core data types, and the README lists them as distinct topics. Arrow covers types and abstractions such as Either and Option, not scheduling or structured concurrency.

### Is Arrow actively maintained?

The repository is not archived and the last push was on 2026-09-21. The most recent releases listed are 2.3.0-alpha.2, 2.3.0-alpha.3 and 2.3.0-alpha.4 from July 2026, so the visible release line is alpha rather than stable.

### What licence does Arrow use?

The LICENSE file contains the Apache License, Version 2.0 and the README carries an Apache 2.0 badge, but the repository metadata reports the licence as NOASSERTION. That discrepancy is worth resolving with your own licence review before adopting it.

## Sources

- [arrow-kt/arrow on GitHub](https://github.com/arrow-kt/arrow)
- [Issues](https://github.com/arrow-kt/arrow/issues)
- [Project website](http://arrow-kt.io)
- [README](https://github.com/arrow-kt/arrow/blob/main/README.md)
- [Releases](https://github.com/arrow-kt/arrow/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/arrow-kt-arrow
