Skip to content
CAI
Software that uses CAICheck a score

fsprojects/FSharpPlus

54.1

Adequate · 23 September 2026

19.8k

lines of production code

F#

primary language

5

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

FSharpPlus is a functional programming library for F\# that provides a comprehensive suite of typeclass implementations, including Applicative, Monad, Arrow, and Bifoldable, alongside extended data structures like DList and NonEmpty collections. It supports advanced type-level programming with compile-time safe Vector and Matrix types, and offers generic computation expressions for monadic workflows. The system also includes mathematical operators lifted over applicative contexts and robust asynchronous utilities, all targeting .NET 8 with compatibility for Fable.

How it got here

2012–2017 — Modernization and generic computation expressions

5 changes.

The project underwent a significant modernization by upgrading to .NET 8 and F\# 8, while introducing a new generic computation expression builder system. This period also saw the expansion of test coverage for core modules and a comprehensive restructuring of the documentation site to include detailed guides on functional programming abstractions.

2019–2022 — Type-level programming and functional abstractions

12 changes.

This period focused on expanding the library's functional programming capabilities by introducing new typeclasses, monad transformers, and mathematical operators for applicative functors. A significant addition was the FSharpPlus.TypeLevel library, enabling compile-time safety for vectors and matrices through type providers. The work also included restructuring extension modules, updating documentation tooling to .NET 8, and broadening test coverage for Fable compatibility and performance benchmarks.

Features

Added PlantUML abstraction diagram and rendering tooling

The documentation tooling now includes a new PlantUML source file (abstractions.plantuml) that visually maps the F\# library's type-class hierarchy, including newly added abstractions such as Bitraversable, Bifoldable, and ZipApplicative. To support the generation of these diagrams, a new F\# script (plantuml.fs) has been added to handle the encoding and compression of PlantUML content, ensuring the diagrams render correctly in the documentation.

docsrc/tools/templates · high confidence

Expanded data structures and monadic operations in FSharpPlus.Data

The Data module now includes new types and operations for functional programming patterns. New data structures include Compose (for functor composition), Const (for lens getters), Cont/ContT (continuation-passing style), Coproduct (sum types), DList (difference lists with O(1) append), MultiMap (maps with multiple values per key), and various monoid wrappers (Dual, Endo, All, Any, First, Last, Mult). The module also adds NonEmptyList, NonEmptySeq, NonEmptySet, and NonEmptyMap types with associated helper functions. Monad transformers (ResultT, ChoiceT, ListT, etc.) have been updated with improved lift2/lift3 support and fixed map2/map3 implementations. Result gains bindTask and bindInto operators for binding into Tasks and generic monads. Validation gains non-generic \<!\> operator, sequence/bisequence, and partition support. ZipList gains Alternative and ZipFunctor instances. Free monads gain hoist and InlineIfLambda optimizations. DList gains IEquatable, toArray, pairwise, and DList.pairwise. Various XML documentation fixes and Fable 4 compatibility updates are included.

src/FSharpPlus/Data · high confidence

FSharpPlus 1.9.1 release scaffolding

This change introduces the initial project structure and configuration for FSharpPlus version 1.9.1, including the solution file, build properties, and documentation. It establishes the repository layout with source, test, and documentation projects, sets up Git attributes and ignore rules for Visual Studio and F\# tooling, and defines the Apache 2.0 license. The release notes indicate this version includes Task-related function fixes, ValueTask support, and the removal of the net45 target framework.

(repo-wide) · high confidence

Library restructured into per-module extension files with new Async and Task capabilities

The extension functions previously contained in a single large file have been split into dedicated modules (Array, Async, Choice, Dict, Dictionary, Enumerator, Exception, Extensions, etc.), improving organization and maintainability. This change introduces new asynchronous capabilities, including \Async.map2\ and \Async.map3\ which now leverage \Task\ under the hood for parallel execution and error collection, and adds \Async.AsTask\ for converting async workflows to \Task\. Support for \ValueTask\ is also extended with \Sequential\ overloads for \Result\, \Choice\, \Option\, and \VOption\. Additionally, new array operations like \cons\, \uncons\, \apply\, and \lift2/3\ are available, and dictionary extensions now include \map2\, \map3\, \zip\, and \unzip\ for combining multiple dictionaries.

src/FSharpPlus/Extensions · high confidence

New functional programming abstractions and typeclass implementations

This release introduces several new functional programming abstractions and expands existing typeclass support within the Control module. New files add implementations for Alternative (including Empty, Append, and Choice operations), Applicative (with Apply, Lift2, Lift3, and IsLeftZero), and a full set of Arrow typeclasses (Arr, ArrFirst, ArrSecond, ArrCombine, Fanout, App, Fanin, AcMerge, AcLeft, AcRight). Additionally, Bifoldable and Bitraversable typeclasses are introduced with support for Result, Choice, and tuples. Existing typeclasses are extended with new overloads and behaviors, including limited applicative support for dictionaries, ValueTask support, and specific fixes for traversals and left-zero logic.

src/FSharpPlus/Control · high confidence

New generic computation expressions and builder system

The library introduces a new design for generic computation expressions, providing \Builder\, \StrictBuilder\, and \DelayedBuilder\ types that work with any type satisfying the \Monad\ constraint. This includes support for \MonadPlus\ (with \Zero\ and \Combine\ operations) and \MonadFx\ (for side-effecting monads), allowing users to write generic workflows using standard F\# syntax like \for\, \while\, \use\, \try/with\, and \try/finally\. The implementation also adds idiom bracket support (\iI\/\Ii\) for applicative-style programming and integrates these builders into the \FSharpPlus.Control\ namespace.

src/FSharpPlus · high confidence

New math operators for Applicative and ZipApplicative functors

Users can now perform arithmetic and comparison operations directly on Applicative functors using the new \FSharpPlus.Math.Applicative\ module. This includes element-wise operators like \.+.\ and \.\<=.\ for standard applicatives, as well as a \ZipApplicative\ module that uses zip-based combination (\\<.\>\) instead of sequential applicative composition. These operators allow mathematical expressions to be lifted over applicative contexts without requiring sequential evaluation.

src/FSharpPlus/Math · high confidence

New type-level programming library with compile-time Vector and Matrix types

A new \FSharpPlus.TypeLevel\ library has been introduced to support type-level programming, featuring compile-time natural numbers (\TypeNat\), booleans (\TypeBool\), and tuple utilities. This library provides strongly-typed \Vector\ and \Matrix\ data structures where dimensions are encoded in the type system, ensuring size safety at compile time. It includes a F\# Type Provider (\NatProvider\, \VectorProvider\, \MatrixProvider\) that enables static parameters for operations like \Get\, \ZeroCreate\, and \Replicate\, allowing the compiler to verify index bounds and dimension compatibility. Users can now leverage these type-safe collections for numerical computations with guarantees enforced during compilation rather than at runtime.

src/FSharpPlus.TypeLevel · high confidence

Behavioural changes

Documentation samples consolidated and updated for .NET 8

The documentation project now compiles a unified set of F\# script samples (Collections, Conversions, Split-Join, and Learn You a Haskell) to ensure they remain valid. These samples have been updated to reference the FSharpPlus library built for .NET 8, replacing previous targets like .NET Framework 4.5 and Fable 3, and demonstrate updated syntax such as strict monad comprehensions.

src/FSharpPlus.Docs · high confidence

Documentation site restructured with new HTML template and abstraction guides

The documentation site has been reorganized under the \docsrc/content\ directory, introducing a new \\_template.html\ layout that powers the generated HTML. This update adds comprehensive guides for functional programming abstractions, including detailed pages for Alternative, Applicative, Arrow, Bifoldable, Bifunctor, Bitraversable, Category, Comonad, Contravariant, Foldable, Functor, Monoid, Profunctor, and Semigroup, each featuring definitions, rules, concrete implementations, and executable F\# examples.

docsrc/content · high confidence

New documentation build tooling targeting .NET 8

The documentation build process has been updated to target .NET 8, replacing previous framework versions. New tooling files in \docsrc/tools\ (including \Program.fs\, \doclib.fs\, and \tools.fs\) now configure the build to compile the library from \src/FSharpPlus/bin/Release/net8.0/FSharpPlus.dll\ and generate documentation using FSharp.Formatting. This includes specific logic for publishing to the \gh-pages\ branch and handling PlantUML diagrams.

docsrc/tools · high confidence

Updated F\# TypeProviders SDK submodule

The external F\# TypeProviders SDK submodule has been updated to commit dc8c662, incorporating changes related to type-level literals and Nat-dependent vector/matrix support.

external · medium confidence

Test coverage

Added benchmarks for Async.Sequence and Option/Result/ValueOption.Sequence implementations; Added comprehensive test coverage for FSharpPlus core modules; Added test file for CustomerId and ICustomerId types; Expanded test coverage for F\# and Fable compatibility.

Dependencies

Upgrade to .NET 8 and F\# 8

The project has been upgraded to target .NET 8 across all components, including the main library, documentation tools, type-level modules, and test suites. This migration aligns the build with F\# 8 language features and updates the FSharp.Core dependency to version 6.0.6. Additionally, the Fable JavaScript compiler support has been updated to version 4, ensuring compatibility with the new .NET 8 target framework.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 54 → 54 (+0.3)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 88 → 88 (+0.1)
  • Architecture 53 → 53 (+0.3)
  • Maturity 57 → 54 (-3.0)
  • Readiness 58 → 58 (+0.0)
  • Security 59 → 75 (+15.7)
  • Accessibility 50 → 50 (+0.0)

Resolved (89)

  • Change coupling: Error.fs ↔ Option.fs (src/FSharpPlus/Data/Error.fs)
  • Change coupling: abstraction-comonad.fsx ↔ abstraction-profunctor.fsx (docsrc/content/abstraction-comonad.fsx)
  • Change coupling: abstraction-monad.fsx ↔ abstraction-profunctor.fsx (docsrc/content/abstraction-monad.fsx)
  • Dependency hygiene not measured — no packages were read
  • Duplicated block (11 lines × 2) (src/FSharpPlus/Extensions/Observable.fs)
  • Duplicated block (11 lines × 2) (src/FSharpPlus/Extensions/String.fs)
  • Duplicated block (11 lines × 2) (src/FSharpPlus/Extensions/ValueTask.fs)
  • Duplicated block (13 lines × 2) (src/FSharpPlus/Extensions/Result.fs)
  • Duplicated block (13 lines × 3) (src/FSharpPlus/Data/Seq.fs)
  • Duplicated block (14 lines × 2) (src/FSharpPlus/Data/Seq.fs)
  • Duplicated block (15 lines × 2) (src/FSharpPlus/Extensions/ValueTask.fs)
  • Duplicated block (16 lines × 2) (src/FSharpPlus/Extensions/Extensions.fs)
  • Duplicated block (5 lines × 2) (src/FSharpPlus.TypeLevel/Providers/Matrix.Provider.fs)
  • Duplicated block (5 lines × 2) (src/FSharpPlus/Builders.fs)
  • Duplicated block (5 lines × 2) (src/FSharpPlus/Builders.fs)
  • Duplicated block (5 lines × 2) (src/FSharpPlus/Control/Monoid.fs)
  • Duplicated block (5 lines × 2) (src/FSharpPlus/Data/DList.fs)
  • Duplicated block (5 lines × 2) (src/FSharpPlus/Data/Seq.fs)
  • Duplicated block (5 lines × 2) (src/FSharpPlus/Extensions/Task.fs)
  • Duplicated block (5 lines × 3) (src/FSharpPlus/Extensions/IReadOnlyDictionary.fs)
  • …and 69 more

New (86)

  • CODEOWNERS assigns no owner to any path
  • Concentrated knowledge decay
  • Duplicated block (10 lines × 2) (src/FSharpPlus/Data/Seq.fs)
  • Duplicated block (10 lines × 2) (src/FSharpPlus/Extensions/String.fs)
  • Duplicated block (10 lines × 2) (src/FSharpPlus/Internals.fs)
  • Duplicated block (10 lines × 3) (src/FSharpPlus/Data/Seq.fs)
  • Duplicated block (10 lines × 4) (src/FSharpPlus/Extensions/Task.fs)
  • Duplicated block (10–11 lines × 2) (src/FSharpPlus/Data/Seq.fs)
  • Duplicated block (11 lines × 2) (src/FSharpPlus/Extensions/Observable.fs)
  • Duplicated block (11 lines × 2) (src/FSharpPlus/Extensions/Task.fs)
  • Duplicated block (11 lines × 3) (src/FSharpPlus/Data/Seq.fs)
  • Duplicated block (11–12 lines × 3) (src/FSharpPlus/Data/Seq.fs)
  • Duplicated block (11–14 lines × 2) (src/FSharpPlus/Data/DList.fs)
  • Duplicated block (12 lines × 2) (src/FSharpPlus/Data/Seq.fs)
  • Duplicated block (13 lines × 2) (src/FSharpPlus/Extensions/Result.fs)
  • Duplicated block (15 lines × 2) (src/FSharpPlus/Extensions/Task.fs)
  • Duplicated block (16 lines × 2) (src/FSharpPlus/Extensions/Extensions.fs)
  • Duplicated block (16 lines × 2) (src/FSharpPlus/Extensions/Task.fs)
  • Duplicated block (16 lines × 3) (src/FSharpPlus/Data/Seq.fs)
  • Duplicated block (16–17 lines × 2) (src/FSharpPlus/Extensions/Task.fs)
  • …and 66 more

Changes since last survey

  • 4 commits — 3 feature/other, 1 fixes

By area

  • (root) — 1 commit
  • .github/workflows — 1 commit
  • src/FSharpPlus.Docs — 1 commit
  • tests/FSharpPlus.Tests — 1 commit

Notable commits

  • fix: fix: Compilation chokes on nowarn
  • change: Align Async.Await cancellation with fslang-suggestions #840
  • change: Enable SourceLink
  • change: Push .snupkg files on deployment

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

fsprojects/FSharpPlus was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 23 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit b5a650a483cb31af75f2ee698d78731298a19abf — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-955b9cee9818.