The freer-effects package


Implementation of effect system for Haskell, which is based on the work of Oleg Kiselyov et al.:

The key features are:

[Skip to ReadMe]


Dependenciesbase (>=4.7 && <5), freer-effects [details]
Copyright(c) 2016 Allele Dev; 2017 Ixperta Solutions s.r.o.
AuthorAllele Dev, Ixcom Core Team, and other contributors
Home page
Bug tracker
Source repositoryhead: git clone -b master
this: git clone
UploadedMon Mar 6 00:08:23 UTC 2017 by PeterTrsko




pedanticPass additional warning flags and -Werror to GHC.DisabledManual
test-hlintEnable test suite that checks sources using HLint.EnabledManual

Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info


Maintainers' corner

For package maintainers and hackage trustees

Readme for freer-effects-

Freer Effects: Extensible Effects with Freer Monads

Haskell Programming Language BSD3 License

Hackage Hackage Dependencies Build


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.


The key features of Freer are:

Example: Console DSL

Here's what using Freer looks like:

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DataKinds #-}
module Console where

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

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

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

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

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

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

                             -- Pure Interpreter --
runConsolePure :: [String] -> Eff '[Console] w -> [String]
runConsolePure inputs req =
    reverse . snd $ run (handleRelayS (inputs, []) (\s _ -> pure s) go req)
    go  :: ([String], [String])
        -> Console 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)


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:

For more information about stack tool can be found in its documentation.


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


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.