8000 GitHub - kostiantxn/fun: A package for functional programming in Python
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

kostiantxn/fun

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

fun

License: MIT Workflow

A package for functional programming in Python.

fun contains implementations of some features you can find in functional languages such as Haskell. Those features are not implemented by default in any standard library, and that's why fun may come in handy. The fun package includes:

  • Pattern matching [1]
  • Monads [2]
  • Currying [3]

Examples

Pattern Matching

You can use fun.patterns for pattern matching. Here is a simple example:

from fun.patterns import match, case

language = 'French'

greeting = match(language, case | 'English' > 'Hello, world!',
                           case | 'French'  > 'Bonjour le monde!',
                           case | 'German'  > 'Hallo Welt!')

print(greeting)  # Prints 'Bonjour le monde!'.

But not only strings can be matched. You can use the package to match almost anything you could think of: primitive built-in types (int, float, complex, bool, str), standard collections (list, tuple and dict), data classes.

Sometimes you may need to use variables in pattern matching. The fun.patterns package provides you with the ability to achieve this. Here is an example:

from fun.patterns import match, case, x, y

expression = [10, '*', 20]

result = match(expression, case | [x, '+', y] > x + y,
                           case | [x, '-', y] > x - y,
                           case | [x, '*', y] > x * y,
                           case | [x, '/', y] > x / y)

print(result)  # Prints '200'.

Check out the examples to find out more about pattern matching with fun.patterns.

Monads

The fun.monads module allows you to write monadic functions:

from math import sqrt
from fun.monads import monad, Maybe, Just, Nothing

def divide(a, b):
    return Just(a / b) if b != 0 else Nothing()

def root(a):
    return Just(sqrt(a)) if a >= 0 else Nothing()

@monad(Maybe)
def f(x, y):
    """f(x, y) = 2 √(x / y)"""
    
    a = yield divide(x, y)
    b = yield root(a)
    c = 2 * b

    return c

print(f(18, 2))  # Prints 'Just 6.0'.
print(f(18, 0))  # Prints 'Nothing'.
print(f(-8, 2))  # Prints 'Nothing'.

You can use List as well:

from fun.monads import monad, List

@monad(List)
def triples(n):
    """Pythagorean triples."""

    x = yield List[1, ..., n]
    y = yield List[x, ..., n]
    z = yield List[y, ..., n]

    yield List[(x, y, z),] if x**2 + y**2 == z**2 else \
          List.empty()

print(triples(15))  # Prints 'List[(3, 4, 5), (5, 12, 13), (6, 8, 10), (9, 12, 15)]'.

The monad decorator allows you to utilise the notation similar to the do notation in Haskell. Thus, a function wrapped by this decorator must use only a fixed set of statements. Below you can see the table with the allowed statements and their equivalents in Haskell.

Python Haskell
x = g(y) let x = g y
x = yield m x <- m
yield m m
return x return x

Currying

The fun.currying module allows you to write curried functions:

from fun.currying import curry

@curry
def add(x, y):
    return x + y

print(add(1, 2))      # Prints 3.
print(add(1)(2))      # Prints 3.
print(add(1)(y=2))    # Prints 3.
print(add(x=1)(y=2))  # Prints 3.
print(add(x=1)(2))    # Raises a `ValueError`.

More

For more examples, check out the examples directory.

License

The package is licensed under the MIT License.

About

A package for functional programming in Python

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

0