Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/fumieval/monad-skeleton

Operational monad library
https://github.com/fumieval/monad-skeleton

haskell monads

Last synced: about 2 months ago
JSON representation

Operational monad library

Awesome Lists containing this project

README

        

monad-skeleton
======================

[![Build Status](https://travis-ci.org/fumieval/monad-skeleton.svg?branch=master)](https://travis-ci.org/fumieval/monad-skeleton)
[![Hackage](https://img.shields.io/hackage/v/monad-skeleton.svg)](https://hackage.haskell.org/package/monad-skeleton)

This package provides `Skeleton`, an operational monad (i.e. free monad that does not require the Functor implementation). The internal encoding
gives O(1) bind and monadic reflection.

`Skeleton` promotes unit instructions to a monad. It is isomorphic to
`MonadView (Skeleton t)`:

```haskell
data MonadView t m x where
Return :: a -> MonadView t m a
(:>>=) :: !(t a) -> (a -> m b) -> MonadView t m b

boned :: MonadView t (Skeleton t) a -> Skeleton t a
debone :: Skeleton t a -> MonadView t (Skeleton t) a
```

GADTs are handy to define instructions:

```haskell
data Interaction x where
Get :: Interaction String
Put :: String -> Interaction ()

echo :: Skeleton Interaction ()
echo = bone Get >>= bone . Put
```

Use `debone` to interpret a computation.

```haskell
interpret :: Skeleton Interaction a -> IO a
interpret m = case debone m of
Return a -> return a
Get :>>= k -> getLine >>= interpret . k
Put s :>>= k -> putStrLn s >>= interpret . k
```