Skip to main content

Do notation in Python

Project description

py_monad_do

A simple monad do notation implementation with nice syntax using generators. Also includes sample monads such as Maybe and List.

Sample code:

from monad_do import *

@do(List)
def test_list(a, b):
    x = yield [a * 10, a] # Native lists are coerced into monad Lists here.
    y = yield [b * 100, b * 10, b]
    return [x + y]


print(test_list(3, 4)) # List([430, 70, 34, 403, 43, 7])

Monad instances derive from the Monad class and provide the methods pure(static) and bind. The do decorators binds the values yielded from a generator to its later computation. In a sense, yield works like <- in Haskell.

Note that generators are uncopyable, so if some code needs to be run more than once (such as the case for the List monad), the generator is run from the beginning once again, with the values sent into it recorded to eliminate duplicate computation. This requires that the generators decorated by do to be more or less "pure".

The do decorator is implemented inside monad_do.do_cached. There is also a simpler implementation in monad_do.do_simple which sketches the basic idea, but runs the generator from the beginning for each yield.

The implementation is primarily inspired by these following materials:

Type hints are not incorporated. For now, the weak support for function types (on arguments) makes type hinting more of a burden then something helpful.

Acknowledgements

Thank @danoneata for adding the Reader Monad.

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

monad_do-0.1.1.tar.gz (7.2 kB view details)

Uploaded Source

Built Distribution

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

monad_do-0.1.1-py3-none-any.whl (9.4 kB view details)

Uploaded Python 3

File details

Details for the file monad_do-0.1.1.tar.gz.

File metadata

  • Download URL: monad_do-0.1.1.tar.gz
  • Upload date:
  • Size: 7.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.9.1

File hashes

Hashes for monad_do-0.1.1.tar.gz
Algorithm Hash digest
SHA256 bb1f21bffa5303b84233707e317bb8d4ecb359ac92fcc601b1138635752542de
MD5 083dab6fb0cbc997a1750639a66dc24f
BLAKE2b-256 e2aefffed32ee300d0770af1d717e26421372a12e6f860945cdc0840b4b5e7bf

See more details on using hashes here.

File details

Details for the file monad_do-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: monad_do-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 9.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.9.1

File hashes

Hashes for monad_do-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6ea2c373be6a8a2338a68242227ae6c0ecd3a62ee865947b7a29e133afd94061
MD5 10173f588376763c867a17e376289d87
BLAKE2b-256 7bd447c3e45b2690dbb1ed4108f6514114bc221feb15d6d1e589420682a4dd40

See more details on using hashes here.

Supported by

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