Hakell-inspired monadic do-notation in Python
Project description
Monadic Do-Notation
Guac provides monadic do-notation, inspired by Haskell, in Python. Monads provide “programmable semicolons” by which the behavior of programs can be changed. A common, useful monad is the list monad, which represents non-deterministic computations. The list monad makes it very easy to write backtracking searches.
Requirements
Guac requires an implementation of Python 3 that supports copy.deepcopy on generator functions. The most common distribution, CPython, is lacking this feature, but pypy implements it!
Example
Here’s an example that computes all the possible ways you can give $0.47 change with pennies, nickels, dimes, and quarters:
from guac import *
@monadic(ListMonad)
def make_change(amount_still_owed, possible_coins):
change = []
# Keep adding coins while we owe them money and there are still coins.
while amount_still_owed > 0 and possible_coins:
# "Nondeterministically" choose whether to give anther coin of this value.
# Aka, try both branches, and return both results.
give_min_coin = yield [True, False]
if give_min_coin:
# Give coin
min_coin = possible_coins[0]
change.append(min_coin)
amount_still_owed -= min_coin
else:
# Never give this coin value again (in this branch!)
del possible_coins[0]
# Did we charge them the right amount?
yield guard(amount_still_owed == 0)
# Lift the result back into the monad.
yield lift(change)
print(make_change(27, [1, 5, 10, 25]))
Running this program will print a list of lists, each list containing a different set of numbers that add up to 27. You can imagine lots of cool ways this could be used, from unification to parsing!
To learn more, check out the README.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file guac-1.0.0-py3-none-any.whl
.
File metadata
- Download URL: guac-1.0.0-py3-none-any.whl
- Upload date:
- Size: 6.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 979c209ce91cfa81d24968e682f1fff640e9b58ff6bd40e4fb41ed61a4ece0f1 |
|
MD5 | 46236af70264f9418dfc73b0b368bff6 |
|
BLAKE2b-256 | 495f12b61bb6fc640ecd3e74021adc9c05b7e6f9d1d22e4ee64800d87ae7b408 |