Skip to main content

Python module for composing computations

Project description

FPy

version_badge

Functional Python

For better computation composing in Python

Goals

  • To bring the ability of composing computations in the functional way
  • Make my life easier

No Goals

  • Exact clone of Haskell
  • Blazing fast / super efficient

Python is Already Amazing, Why Bother?

  • Because I can
  • Python may be amazing in some field, but sucks from the functional perspective

Python Sucks, Why Bother?

  • Because I can
  • Python is still used in my work place

Install

With pip:

pip install fppy

Control:

Functor fpy.control.functor

Given Functors f, g:

  • __fmap__ :: f a -> (a -> b) -> f b
  • __ntrans__ :: f a -> (f a ~> g b) -> g b

Operators:

  • | = __fmap__
  • & = __ntrans__

Functions:

  • fmap = __fmap__

NTrans (Natrual Transform) fpy.control.natural_transform

Given Functors f, g:

  • __trans__ :: f a ~> g b

Applicative : Functor fpy.control.applicative

No new trait comparing to functor, liftA2 is defined using fmap

Monad : Applicative fpy.control.monad

Given Monad m:

  • __bind__ :: m a -> (a -> m b) -> m b

Operators:

  • >> = __bind__

Do Notation:

  • @do(Monad) enables do notation in the decorated function, where the explicit return statement will be treated as ret from the given Monad type, if no return statement is given, the last element on the stack will be returned.
  • name <- computation binds the computation to the following block, calling the __bind__ method of the monad object returned from computation with the name name.
  • (name1, name2, ..., namen) <- computation works in the similar way as the single name binding, this applys the binding function to the tuple contained within the monad object instead of calling the function directly.
  • name1, name2, ..., namen <- computation same as above

Data

Maybe : Monad fpy.data.maybe

Types:

  • Maybe[T]
  • Just[T] : Maybe[T]
  • Nothing[T] : Maybe[T]

Functions:

  • isJust :: Maybe[T] -> bool
  • isNothing :: Maybe[T] -> bool
  • fromJust :: Maybe[T] -> T
  • fromMaybe :: T -> Maybe[T] -> T
  • maybe :: S -> (T -> S) -> Maybe[T] -> S
  • mapMaybe :: (T -> Maybe[S]) -> List[T] -> List[S]

Either : Monad fpy.data.either

Types:

  • Either[T]
  • Left[T] : Either[T]
  • Right[T] : Either[T]

Forgetful : Monad (Forgetful Functor) fpy.data.forgetful

Types:

  • Under[T] Under similar to Haskell's Identity monad

Cont : Monad fpy.data.cont

Types:

  • Cont[T, R]

Functions:

  • cont :: (A -> B) -> Cont[A, B]
  • runCont :: Cout[B, C] -> C

Functions:

Given functor f: forget: NTrans[F, B, Under, T] :: f b ~> Under[T]

Utility Functions fpy.data.function

  • id_ :: T -> T
  • const :: T -> A -> T
  • flip :: (B -> A -> T) -> A -> B -> T
  • fix :: (A -> A) -> A
  • on :: (B -> B -> T) -> (A -> B) -> A -> A -> T

Slightly Dependent Utilities

-- not so well typed

NArg :: Nat -> Type
NArg (S Z) = A
NArg (S n) = A -> (NArg n)

NTpl :: (n:Nat) -> (NArg n) -> Type
NTpl (S Z) A =( A,)
NTpl (S n) (A -> NArg n) = cons A (NTpl n (NArg n))
  • constN :: (n:Nat) -> A -> (NArg n) -> A
  • uncurryN :: (n:Nat) -> args:(NArg n) -> A -> ((NTpl n args) -> A)

Composable

Composable fpy.composable.composable

  • __compose__

Operators:

  • ^ = __compose__

Transparent fpy.composable.transparent

  • __underlying__ Delegate an attribute access to an underlying object

Function fpy.composable.function

Types:

  • func : Composable
  • SignatureMismatchError
  • NotEnoughArgsError

Collections fpy.composable.collections

Types:

  • Seq : func
  • Map : func

Functions:

  • transN(n, f, it) := it[n] = f(it[n])
  • getN(n, it) := it[n]
  • setN(n, v, it) := it[n] = v
  • eqN(n, it, x) := it[n] == x
  • mapN(n, fn, lsts) := map(fn, zip(lst1, lst2 ... lstn))
  • of_(v1 ... vn) := _ in (v1 ... vn)
  • is_(t) := isinstance(_, t)
  • and_(a, b) := a(_) and b(_)
  • or_(a, b) := a(_) or b(_)
  • to(dst, src) := dst(src)
  • apply(fn) := fn(*a, **k)
  • fwd_ = Under.ret

Predefined Vars:

  • trans0
  • trans1
  • get0
  • get1
  • set0
  • set1
  • eq0
  • eq1
  • mp1
  • mp2

Parsec

Parsec fpy.parsec.parsec

Types:

  • parser[S, T] :: [S] -> Either [S] ([T] * [S])

Operators:

  • * = parser.timeN
  • + = parser.concat
  • | = parser.choice
  • >> = parser.parseR
  • << = parser.parseL

Functions:

  • one :: (S -> bool) -> parser[S, S]
  • neg :: (S -> bool) -> parser[S, S]
  • just_nothing :: parser[S, T]
  • pmaybe :: parser[S, T] -> parser[S, T]
  • many :: parser[S, T] -> parser[S, T]
  • many1 :: parser[S, T] -> parser[S, T]
  • ptrans :: parser[S, T] -> (T -> Y) -> parser[S, Y]
  • peek :: parser[S, T] -> parser[S, T]
  • skip :: parser[S, T] -> parser[S, T]
  • pseq :: [S] -> parser[S, T]
  • inv :: parser[S, T] -> parser[S, T]

Dependencies

License

GPL3+

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fppy-0.0.17.tar.gz (32.7 kB view details)

Uploaded Source

Built Distribution

fppy-0.0.17-py3-none-any.whl (41.6 kB view details)

Uploaded Python 3

File details

Details for the file fppy-0.0.17.tar.gz.

File metadata

  • Download URL: fppy-0.0.17.tar.gz
  • Upload date:
  • Size: 32.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.6

File hashes

Hashes for fppy-0.0.17.tar.gz
Algorithm Hash digest
SHA256 dcf9ae0d9ada79a7bdd83df4e6f86335251592b768f0be2a513528f4d3d4a1e5
MD5 d523067788681b1d6deab5e98e99aba5
BLAKE2b-256 a46c4b0eea083e335c60dd4febcbdf9fdea6923f0ec9949d0c2437488cb856f5

See more details on using hashes here.

File details

Details for the file fppy-0.0.17-py3-none-any.whl.

File metadata

  • Download URL: fppy-0.0.17-py3-none-any.whl
  • Upload date:
  • Size: 41.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.6

File hashes

Hashes for fppy-0.0.17-py3-none-any.whl
Algorithm Hash digest
SHA256 220a0cc90a872781f54dbb4bdf1fda469ba5223388b398e05fc8031d62f1606b
MD5 78126a0ad17c7e9f119c5617949f2198
BLAKE2b-256 f0bbc71d7bb7cf0aa3319464ffc48c4ac1a1461fb4b58fcaa9add3bb7f552c11

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page