Skip to main content

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.

Metadata

Release files for guac 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for guac 1.0.0
File Interpreter ABI Platform
guac-1.0.0-py3-none-any.whl Python 3 none any Details

Release files / guac-1.0.0-py3-none-any.whl

Download URL guac-1.0.0-py3-none-any.whl
Size 6.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
979c209ce91cfa81d24968e682f1fff640e9b58ff6bd40e4fb41ed61a4ece0f1
BLAKE2b-256 checksum
How to use checksums
495f12b61bb6fc640ecd3e74021adc9c05b7e6f9d1d22e4ee64800d87ae7b408
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

This release

1.0.0 This release

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page