A friendly effect system for Haskell
Go to file
2017-02-02 20:10:29 +01:00
bench Rearrange imports in bench/Core.hs 2017-01-28 15:42:44 +01:00
examples/src Use MIN_VERSION_package macros instead of __GLASGOW_HASKELL__ 2017-01-28 15:42:44 +01:00
src Enhanced docs, and applied coding style to Reader 2017-02-02 20:10:29 +01:00
tests Making HLint happy 2017-02-02 20:10:29 +01:00
.gitignore prevent stack.yaml from being checked in 2016-04-16 21:33:09 -05:00
.travis.yml Disable HLint on Travis by passing -f-test-hlint to cabal 2017-02-02 20:07:33 +01:00
changelog.md Update changelog 2017-01-29 11:20:16 +01:00
freer-effects.cabal Disable HLint on Travis by passing -f-test-hlint to cabal 2017-02-02 20:07:33 +01:00
LICENSE Renaming to freer-effects; updating copyright and package description 2017-02-02 20:06:51 +01:00
README.md Renaming to freer-effects; updating copyright and package description 2017-02-02 20:06:51 +01:00
Setup.hs initial commit 2015-09-12 00:38:18 -05:00

Freer Effects: Extensible Effects with Freer Monads

Haskell Programming Language BSD3 License

Hackage Hackage Dependencies Build

Description

Library freer-effects is an implementation of effect system for Haskell, which is based on the work of Oleg Kiselyov et al.:

Much of the implementation is a repackaging and cleaning up of the reference materials provided here.

Features

The key features of Freer are:

  • An efficient effect system for Haskell as a library.
  • Implementations for several common Haskell monads as effects:
    • Reader
    • Writer
    • State
    • StateRW: State in terms of Reader/Writer.
    • Trace
    • Exception
  • Core components for defining your own Effects.

Example: Teletype DSL

Here's what using Freer looks like:

{-# LANGUAGE GADTs #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DataKinds #-}
module Teletype where

import Control.Monad.Freer
import Control.Monad.Freer.Internal
import System.Exit hiding (ExitSuccess)

--------------------------------------------------------------------------------
                          -- Effect Model --
--------------------------------------------------------------------------------
data Teletype s where
  PutStrLn    :: String -> Teletype ()
  GetLine     :: Teletype String
  ExitSuccess :: Teletype ()

putStrLn' :: Member Teletype r => String -> Eff r ()
putStrLn' = send . PutStrLn

getLine'  :: Member Teletype r => Eff r String
getLine' = send GetLine

exitSuccess' :: Member Teletype r => Eff r ()
exitSuccess' = send ExitSuccess

--------------------------------------------------------------------------------
                     -- Effectful Interpreter --
--------------------------------------------------------------------------------
runTeletype :: Eff '[Teletype] w -> IO w
runTeletype (Val x) = return x
runTeletype (E u q) = case extract u of
              (PutStrLn msg) -> putStrLn msg  >> runTeletype (qApp q ())
              GetLine        -> getLine      >>= \s -> runTeletype (qApp q s)
              ExitSuccess    -> exitSuccess

--------------------------------------------------------------------------------
                        -- Pure Interpreter --
--------------------------------------------------------------------------------
runTeletypePure :: [String] -> Eff '[Teletype] w -> [String]
runTeletypePure inputs req =
  reverse . snd $ run (handleRelayS (inputs, []) (\s _ -> pure s) go req)
  where
    go :: ([String], [String])
       -> Teletype v
       -> (([String], [String]) -> Arr '[] v ([String], [String]))
       -> Eff '[] ([String], [String])
    go (is, os) (PutStrLn msg) q = q (is, msg : os) ()
    go (i:is, os) GetLine q = q (is, os) i
    go ([], _) GetLine _ = error "Not enough lines"
    go (_, os) ExitSuccess _ = pure ([], os)

Contributing

Contributions are welcome! Documentation, examples, code, and feedback - they all help.

Developer Setup

The easiest way to start contributing is to install stack. stack can install GHC/Haskell for you, and automates common developer tasks.

The key commands are:

  • stack setup: install GHC
  • stack build
  • stack clean
  • stack haddock: builds documentation
  • stack test
  • stack bench
  • stack ghci: start a REPL instance

Licensing

This project is distrubted under a BSD3 license. See the included LICENSE file for more details.

Acknowledgements

Package freer-effects started as a fork of freer authored by Allele Dev.

This package would not be possible without the paper and the reference implementation. In particular:

There will be deviations from the source.