Do notation in Python
A simple monad do notation implementation with nice syntax using generators. Also includes sample monads such as
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
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".
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
The implementation is primarily inspired by these following materials:
- Monads and Do-Blocks in Python implements a do notation for the
Listmonad through recording sent values.
- Monads in Python (with nice syntax!) also implements a similar do notation which universally handle monads that only run the generator once.
- The Mother of all Monads gives the idea of implementing other monads through the
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
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
|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|