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.14.tar.gz (32.3 kB view details)

Uploaded Source

Built Distribution

fppy-0.0.14-py3-none-any.whl (40.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: fppy-0.0.14.tar.gz
  • Upload date:
  • Size: 32.3 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.14.tar.gz
Algorithm Hash digest
SHA256 2532a3b25a68d7bd251d9bc538b14d842d595861153a2b308dbb011c5de245c2
MD5 b9de0aae6d181672e5b56b2b7ec46ae0
BLAKE2b-256 9eb75102ca9026ceed88ae5f212bbd9f5f7333e65a52ba6e0857e4a0de2f282a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fppy-0.0.14-py3-none-any.whl
  • Upload date:
  • Size: 40.9 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.14-py3-none-any.whl
Algorithm Hash digest
SHA256 e2bbf8459f00e699ccea3d5db09300eab3b61b9dba4398106fed291fe9b6d93a
MD5 10fe8bf5b72cceebf1b5dcc2ce217d01
BLAKE2b-256 d47be9cd362a21bd533604e9ec946a31eba7448d76255a431e63793986eff4a7

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