Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

xnning/EvEff

Efficient Haskell effect handlers based on evidence translation.

xnning/EvEff.json
{
"createdAt": "2020-07-22T21:52:33Z",
"defaultBranch": "master",
"description": "Efficient Haskell effect handlers based on evidence translation.",
"fullName": "xnning/EvEff",
"homepage": "",
"language": "Haskell",
"name": "EvEff",
"pushedAt": "2021-07-19T02:26:38Z",
"stargazersCount": 85,
"topics": [],
"updatedAt": "2025-11-10T22:14:56Z",
"url": "https://github.com/xnning/EvEff"
}

EvEff: Efficient effect handlers based on Evidence translation

Section titled “EvEff: Efficient effect handlers based on Evidence translation”

Efficient effect handlers based on evidence translation [1]. The interface and design is described in detail in “Effect Handlers in Haskell, Evidently”, Ningning Xie and Daan Leijen, Haskell 2020.

Installation:

  • First install stack
  • Build with > stack build
  • Load examples:
    > stack ghci eveff:lib
    ..
    ghci> runEff helloWorld
    "hello world"

An example of defining and using a Reader effect:

{-# LANGUAGE TypeOperators, FlexibleContexts, Rank2Types #-}
import Control.Ev.Eff
-- A @Reader@ effect definition with one operation @ask@ of type @()@ to @a@.
data Reader a e ans = Reader{ ask :: Op () a e ans }
greet :: (Reader String :? e) => Eff e String
greet = do s <- perform ask ()
return ("hello " ++ s)
test :: String
test = runEff $
handler (Reader{ ask = value "world" }) $ -- @:: Reader String () Int@
do s <- greet -- executes in context @:: Eff (Reader String :* ()) Int@
return s

Enjoy,
Daan Leijen and Ningning Xie, May 2020.

[1] “Effect Handlers, Evidently”, Ningning Xie et al., ICFP 2020 (pdf).