Skip to main content

Do notation in Python

Project description


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 *

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.


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.

Files for monad-do, version 0.1.1
Filename, size File type Python version Upload date Hashes
Filename, size monad_do-0.1.1-py3-none-any.whl (9.4 kB) File type Wheel Python version py3 Upload date Hashes View
Filename, size monad_do-0.1.1.tar.gz (7.2 kB) File type Source Python version None Upload date Hashes View

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring DigiCert DigiCert EV certificate Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page