Skip to main content

Functors, Applicatives, And Monads in Python

CI PyPI Python Version License

OSlash (Ø) is a library for learning and understanding functional programming in Python 3.12+. It re-implements concepts from Learn You a Haskell for Great Good! using Python with modern type annotations. OSlash unifies functional and object-oriented paradigms by grouping related functions within classes. Objects are never used for storing values or mutable data; data exists only within function closures.

✨ What's New in 1.0

OSlash 1.0 is a complete modernization for Python 3.12+:

  • Modern Type System: Fully type-checked with Pyright in strict mode
  • PEP 695 Syntax: Clean type parameters (class Maybe[T]: instead of Generic[T])
  • Modern Tooling: Built with uv, formatted with ruff, validated with pre-commit hooks
  • Production Status: Stable release ready for educational use

Type Safety: OSlash is fully type-checked with Pyright in strict mode, providing excellent IDE support and catching errors at development time. It leverages Python 3.12's PEP 695 type parameter syntax for clean, ergonomic generic types.

OSlash is intended to be a tutorial. For practical functional programming in Python in production environments you should use Expression instead.

Install

# Using pip
pip install oslash

# Or using uv (recommended)
uv add oslash

The project currently contains implementations for:

Abstract Base Classes

  • Functor, for stuff that can be mapped
  • Applicative, for callable stuff
  • Monoid, for associative stuff
  • Monad, for monadic stuff

And Some Monads

  • Identity, boxed stuff in its simplest form
  • Maybe (Just | Nothing), for optional stuff
  • Either (Right | Left), for possible failures
  • List, purely functional list of stuff
  • IO Action, for impure stuff
  • Writer, for logging stuff
  • Reader, for callable stuff
  • State, for stateful computations of stuff
  • Cont, for continuation of stuff

Monadic functions

  • >>, for sequencing monadic actions
  • lift, for mapping a function over monadic values
  • join, for removing one level of monadic structure
  • compose, for composing monadic functions

Utility functions

  • compose, for composing 0 to n functions

But why?

Yes, I know there are other projects out there like PyMonad, fn.py. I'm simply doing this in order to better understand the book. It's so much easier to learn when you implement things yourself. The code may be similar to PyMonad in structure, but is quite different in implementation.

Why is the project called OSlash? OSlash is the Norwegian character called Oslash. Initially I wanted to create a project that used Ø and ø (unicode) for the project name and modules. It didn't work out well, so I renamed it to OSlash.

Examples

Haskell:

> fmap (+3) (Just 2)
Just 5

> (+3) <$> (Just 2)
Just 5

Python:

>>> Just(2).map(lambda x: x+3)
Just 5

>>> (lambda x: x+3) % Just(2)
Just 5

IO Actions:

from oslash import put_line, get_line

main = put_line("What is your name?") | (lambda _:
    get_line() | (lambda name:
    put_line("What is your age?") | (lambda _:
    get_line() | (lambda age:
    put_line("Hello " + name + "!") | (lambda _:
    put_line("You are " + age + " years old"))))))

if __name__ == "__main__":
    main()

Tutorials

Metadata

Release files for oslash 2.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for oslash 2.0.0
File Size Uploaded
oslash-2.0.0.tar.gz 61.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for oslash 2.0.0
File Interpreter ABI Platform
oslash-2.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 93.1 kB

Release files / oslash-2.0.0.tar.gz

Download URL oslash-2.0.0.tar.gz
Size 61.5 kB
Tags Source
SHA-256 checksum
How to use checksums
c8090331973ccab85a5266bdb125d3547d0e1d27b0990bd3bc2de2e56bef4a8c
BLAKE2b-256 checksum
How to use checksums
ceeb58b7e2b23050076eb54e63cfd16943cce70dc2c5e3a4921be7df9ba66185
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / oslash-2.0.0-py3-none-any.whl

Download URL oslash-2.0.0-py3-none-any.whl
Size 31.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fafb124f80cc757d62a9731f28f60f57479414c2463189f365bf6f55014a3aad
BLAKE2b-256 checksum
How to use checksums
1963d44b1af6e1a15d0dcaef0fa6e47e61159ef0afa451667909aef0fef89926
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release history Release notifications | RSS feed

This release

2.0.0 This release

2 release files

1.0.0

2 release files

0.6.3

2 release files

0.6.2

2 release files

0.5.1

1 release file

0.5.0

1 release file

0.4.0

1 release file

0.3.0

1 release file

0.2.0

1 release file

0.1.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page