Skip to main content

Functors, Applicatives, And Monads in Python

Python package

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.

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

> pip3 install 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

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

oslash-1.0.0.tar.gz (60.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

oslash-1.0.0-py3-none-any.whl (30.7 kB view details)

Uploaded Python 3

File details

Details for the file oslash-1.0.0.tar.gz.

File metadata

  • Download URL: oslash-1.0.0.tar.gz
  • Upload date:
  • Size: 60.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.9 {"installer":{"name":"uv","version":"0.9.9"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for oslash-1.0.0.tar.gz
Algorithm Hash digest
SHA256 e696e4841f3b09d8e0cb2659553b469a3f9f55fd758f795dfc253f7a479cd0ed
MD5 9423e7c2884ef8852109566df896feaa
BLAKE2b-256 c6ea3b7e99dc87357bdeaf1b2ac6013c1a03ce8d895a60573c33c93be749c2f4

See more details on using hashes here.

File details

Details for the file oslash-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: oslash-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 30.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.9 {"installer":{"name":"uv","version":"0.9.9"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for oslash-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8e5e7a53d4c95a68b8bd22c7c07727f862b8a723a6535544c72f653ba498927d
MD5 6d021925bafa22a84d5b9308d6499563
BLAKE2b-256 e9762c3c204665bbd3edfd808b3ab9cbba2249e9b407bb24e7549ed6114341e4

See more details on using hashes here.

Release history Release notifications | RSS feed

2.0.0

2 files

This release

1.0.0 This release

2 files

0.6.3

2 files

0.6.2

2 files

0.5.1

1 file

0.5.0

1 file

0.4.0

1 file

0.3.0

1 file

0.2.0

1 file

0.1.0

1 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