OSlash


NameOSlash JSON
Version 0.6.3 PyPI version JSON
download
home_pagehttps://github.com/dbrattli/oslash
SummaryOSlash (Ø) for Python 3.8+
upload_time2020-10-12 20:50:14
maintainer
docs_urlNone
authorDag Brattli
requires_python
licenseMIT License
keywords
VCS
bugtrack_url
requirements typing_extensions
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Functors, Applicatives, And Monads in Python

![Python package](https://github.com/dbrattli/OSlash/workflows/Python%20package/badge.svg)

OSlash (Ø) is a library for playing with functional programming in Python 3.8+. It's an attempt to re-implement some of
the code from [Learn You a Haskell for Great Good!](http://learnyouahaskell.com/) in Python 3.8. OSlash unifies
functional and object oriented paradigms by grouping related functions within classes. Objects are however never used
for storing values or mutable data, and data only lives within function closures.

OSlash is intended to be a tutorial. For practical functional programming in Python in production environments you
should use [FSlash](https://github.com/dbrattli/fslash) instead.

## Install

```bash
> pip3 install oslash
```

The project currently contains implementations for:

## Abstract Base Classes

- **[Functor](https://github.com/dbrattli/OSlash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures#functors)**, for stuff that can be mapped
- **[Applicative](https://github.com/dbrattli/OSlash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures#applicatives)**, for callable stuff
- **Monoid**, for associative stuff
- **[Monad](https://github.com/dbrattli/OSlash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures#monads)**, for monadic stuff

## And Some Monads

- **Identity**, boxed stuff in its simplest form
- **[Maybe (Just | Nothing)](https://github.com/dbrattli/oslash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures)**, for optional stuff
- **Either (Right | Left)**, for possible failures
- **List**, purely functional list of stuff
- **[IO Action](https://github.com/dbrattli/OSlash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures#io-monad)**, for impure stuff
- **[Writer](https://github.com/dbrattli/OSlash/wiki/Three-Useful-Monads#the-writer-monad)**, for logging stuff
- **[Reader](https://github.com/dbrattli/OSlash/wiki/Three-Useful-Monads#the-reader-monad)**, for callable stuff
- **State**, for stateful computations of stuff
- **Cont**, for continuation of stuff

## Monadic functions

- **>>**, for sequencing monadic actions
- **lift**, for mapping a function over monadic values
- **join**, for removing one level of monadic structure
- **compose**, for composing monadic functions

## Utility functions

- **compose**, for composing 0 to n functions

## But why?

Yes, I know there are other projects out there like [PyMonad](https://bitbucket.org/jason_delaat/pymonad/),
[fn.py](https://github.com/kachayev/fn.py). I'm simply doing this in order to better understand the
[book](http://learnyouahaskell.com/). It's so much easier to learn when you implement things yourself. The code may be
similar to PyMonad in structure, but is quite different in implementation.

Why is the project called OSlash? OSlash is the Norwegian character called [Oslash](http://en.wikipedia.org/wiki/Ø).
Initially I wanted to create a project that used Ø and ø (unicode) for the project name and modules. It didn't work out
well, so I renamed it to OSlash.

## Examples

Haskell:

```haskell
> fmap (+3) (Just 2)
Just 5

> (+3) <$> (Just 2)
Just 5
```

Python:

```python
>>> Just(2).map(lambda x: x+3)
Just 5

>>> (lambda x: x+3) % Just(2)
Just 5

```

IO Actions:

```python
from oslash import put_line, get_line

main = put_line("What is your name?") | (lambda _:
    get_line() | (lambda name:
    put_line("What is your age?") | (lambda _:
    get_line() | (lambda age:
    put_line("Hello " + name + "!") | (lambda _:
    put_line("You are " + age + " years old"))))))

if __name__ == "__main__":
    main()
```

## Tutorials

- [Functors, Applicatives, And Monads In Pictures](https://github.com/dbrattli/oslash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures) in Python.
- [Three Useful Monads](https://github.com/dbrattli/OSlash/wiki/Three-Useful-Monads) _(in progress)_
- [Using Either monad in Python](https://medium.com/@rnesytov/using-either-monad-in-python-b6eac698dff5)



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/dbrattli/oslash",
    "name": "OSlash",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "",
    "author": "Dag Brattli",
    "author_email": "dag@brattli.net",
    "download_url": "https://files.pythonhosted.org/packages/60/b2/54ea4a7c6f768469a4c6a2f27f5c7cf572d63e9fd7f7618fca89c30966b3/OSlash-0.6.3.tar.gz",
    "platform": "",
    "description": "# Functors, Applicatives, And Monads in Python\n\n![Python package](https://github.com/dbrattli/OSlash/workflows/Python%20package/badge.svg)\n\nOSlash (\u00d8) is a library for playing with functional programming in Python 3.8+. It's an attempt to re-implement some of\nthe code from [Learn You a Haskell for Great Good!](http://learnyouahaskell.com/) in Python 3.8. OSlash unifies\nfunctional and object oriented paradigms by grouping related functions within classes. Objects are however never used\nfor storing values or mutable data, and data only lives within function closures.\n\nOSlash is intended to be a tutorial. For practical functional programming in Python in production environments you\nshould use [FSlash](https://github.com/dbrattli/fslash) instead.\n\n## Install\n\n```bash\n> pip3 install oslash\n```\n\nThe project currently contains implementations for:\n\n## Abstract Base Classes\n\n- **[Functor](https://github.com/dbrattli/OSlash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures#functors)**, for stuff that can be mapped\n- **[Applicative](https://github.com/dbrattli/OSlash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures#applicatives)**, for callable stuff\n- **Monoid**, for associative stuff\n- **[Monad](https://github.com/dbrattli/OSlash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures#monads)**, for monadic stuff\n\n## And Some Monads\n\n- **Identity**, boxed stuff in its simplest form\n- **[Maybe (Just | Nothing)](https://github.com/dbrattli/oslash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures)**, for optional stuff\n- **Either (Right | Left)**, for possible failures\n- **List**, purely functional list of stuff\n- **[IO Action](https://github.com/dbrattli/OSlash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures#io-monad)**, for impure stuff\n- **[Writer](https://github.com/dbrattli/OSlash/wiki/Three-Useful-Monads#the-writer-monad)**, for logging stuff\n- **[Reader](https://github.com/dbrattli/OSlash/wiki/Three-Useful-Monads#the-reader-monad)**, for callable stuff\n- **State**, for stateful computations of stuff\n- **Cont**, for continuation of stuff\n\n## Monadic functions\n\n- **>>**, for sequencing monadic actions\n- **lift**, for mapping a function over monadic values\n- **join**, for removing one level of monadic structure\n- **compose**, for composing monadic functions\n\n## Utility functions\n\n- **compose**, for composing 0 to n functions\n\n## But why?\n\nYes, I know there are other projects out there like [PyMonad](https://bitbucket.org/jason_delaat/pymonad/),\n[fn.py](https://github.com/kachayev/fn.py). I'm simply doing this in order to better understand the\n[book](http://learnyouahaskell.com/). It's so much easier to learn when you implement things yourself. The code may be\nsimilar to PyMonad in structure, but is quite different in implementation.\n\nWhy is the project called OSlash? OSlash is the Norwegian character called [Oslash](http://en.wikipedia.org/wiki/\u00d8).\nInitially I wanted to create a project that used \u00d8 and \u00f8 (unicode) for the project name and modules. It didn't work out\nwell, so I renamed it to OSlash.\n\n## Examples\n\nHaskell:\n\n```haskell\n> fmap (+3) (Just 2)\nJust 5\n\n> (+3) <$> (Just 2)\nJust 5\n```\n\nPython:\n\n```python\n>>> Just(2).map(lambda x: x+3)\nJust 5\n\n>>> (lambda x: x+3) % Just(2)\nJust 5\n\n```\n\nIO Actions:\n\n```python\nfrom oslash import put_line, get_line\n\nmain = put_line(\"What is your name?\") | (lambda _:\n    get_line() | (lambda name:\n    put_line(\"What is your age?\") | (lambda _:\n    get_line() | (lambda age:\n    put_line(\"Hello \" + name + \"!\") | (lambda _:\n    put_line(\"You are \" + age + \" years old\"))))))\n\nif __name__ == \"__main__\":\n    main()\n```\n\n## Tutorials\n\n- [Functors, Applicatives, And Monads In Pictures](https://github.com/dbrattli/oslash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures) in Python.\n- [Three Useful Monads](https://github.com/dbrattli/OSlash/wiki/Three-Useful-Monads) _(in progress)_\n- [Using Either monad in Python](https://medium.com/@rnesytov/using-either-monad-in-python-b6eac698dff5)\n\n\n",
    "bugtrack_url": null,
    "license": "MIT License",
    "summary": "OSlash (\u00d8) for Python 3.8+",
    "version": "0.6.3",
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "md5": "cde67e011b11a81884296a011540e706",
                "sha256": "89b978443b7db3ac2666106bdc3680add3c886a6d8fcdd02fd062af86d29494f"
            },
            "downloads": -1,
            "filename": "OSlash-0.6.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "cde67e011b11a81884296a011540e706",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 26943,
            "upload_time": "2020-10-12T20:50:13",
            "upload_time_iso_8601": "2020-10-12T20:50:13.060982Z",
            "url": "https://files.pythonhosted.org/packages/2d/c3/77d40a6e20fdfbf92b086d2c47e3cc82731e179e3f44bdc8e60b7306bcc3/OSlash-0.6.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "efa57eb3695297b0be02b89f2b081843",
                "sha256": "868aeb58a656f2ed3b73d9dd6abe387b20b74fc9413d3e8653b615b15bf728f3"
            },
            "downloads": -1,
            "filename": "OSlash-0.6.3.tar.gz",
            "has_sig": false,
            "md5_digest": "efa57eb3695297b0be02b89f2b081843",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 35228,
            "upload_time": "2020-10-12T20:50:14",
            "upload_time_iso_8601": "2020-10-12T20:50:14.165269Z",
            "url": "https://files.pythonhosted.org/packages/60/b2/54ea4a7c6f768469a4c6a2f27f5c7cf572d63e9fd7f7618fca89c30966b3/OSlash-0.6.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2020-10-12 20:50:14",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "github_user": "dbrattli",
    "github_project": "oslash",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "typing_extensions",
            "specs": []
        }
    ],
    "lcname": "oslash"
}
        
Elapsed time: 0.07043s