Skip to main content

OSlash (Ø) for Python 3.8+

Project description

Functors, Applicatives, And Monads in Python

Python package

OSlash (Ø) is a library for playing with functional programming in Python 3.8+. It's an attempt to re-implement some of the code from Learn You a Haskell for Great Good! in Python 3.8. OSlash unifies functional and object oriented paradigms by grouping related functions within classes. Objects are however never used for storing values or mutable data, and data only lives within function closures.

OSlash is intended to be a tutorial. For practical functional programming in Python in production environments you should use FSlash 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

Project details


Download files

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

Source Distribution

OSlash-0.6.3.tar.gz (35.2 kB view details)

Uploaded Source

Built Distribution

OSlash-0.6.3-py3-none-any.whl (26.9 kB view details)

Uploaded Python 3

File details

Details for the file OSlash-0.6.3.tar.gz.

File metadata

  • Download URL: OSlash-0.6.3.tar.gz
  • Upload date:
  • Size: 35.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.6

File hashes

Hashes for OSlash-0.6.3.tar.gz
Algorithm Hash digest
SHA256 868aeb58a656f2ed3b73d9dd6abe387b20b74fc9413d3e8653b615b15bf728f3
MD5 efa57eb3695297b0be02b89f2b081843
BLAKE2b-256 60b254ea4a7c6f768469a4c6a2f27f5c7cf572d63e9fd7f7618fca89c30966b3

See more details on using hashes here.

File details

Details for the file OSlash-0.6.3-py3-none-any.whl.

File metadata

  • Download URL: OSlash-0.6.3-py3-none-any.whl
  • Upload date:
  • Size: 26.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.6

File hashes

Hashes for OSlash-0.6.3-py3-none-any.whl
Algorithm Hash digest
SHA256 89b978443b7db3ac2666106bdc3680add3c886a6d8fcdd02fd062af86d29494f
MD5 cde67e011b11a81884296a011540e706
BLAKE2b-256 2dc377d40a6e20fdfbf92b086d2c47e3cc82731e179e3f44bdc8e60b7306bcc3

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page