OCaml effects examples
Examples to illustrate the use of algebraic effects in OCaml. See
- Effective Concurrency with Algebraic Effects
- Pearls of Algebraic Effects and Handlers
- Retrofitting Effect Handlers onto OCaml
Examples
- A concurrent round-robin scheduler
- Mutable state
- ML-style refs
- Transactional state
- Asynchronous IO in direct-style
- Dynamic wind
- Deriving generator from any interator
- Promises
- Monadic reflection
- MVars
- Chameneos-redux
- Message-passing pipeline: Sieve of Eratostheneses
- Deep pipes
- Non termination from effects
- Continuation cloning is tricky
- A solution to the Same Fringe Problem
- Reverse-mode Algorithmic Differentiation
The original implementation of Multicore OCaml allowed a user to Obj.clone_continuation
. This has been removed, the examples that used this are in the multishot
directory. See this conversation about the removal of this feature. They now use the ocaml-multicont library.
Running the examples
To run the examples with Multicore OCaml, be sure to install Opam with these instructions. If your version of Opam (opam --version
) is greater than or equal to 2.1
then the following instructions will work:
# After cloning this repository, create a 5.0.0 switch
opam update
# Add the alpha repository to get unreleased 5.0.0 compatible libraries
opam switch create 5.0.0+trunk --repo=default,alpha=git+https://github.com/kit-ty-kate/opam-alpha-repository.git
opam install . --deps-only
If your version of Opam is less than 2.1
, then you will also need to add the beta repository when creating the switch. All of the other commands remain the same.
opam switch create 5.0.0+trunk --repo=default,beta=git+https://github.com/ocaml/ocaml-beta-repository.git,alpha=git+https://github.com/kit-ty-kate/opam-alpha-repository.git
Running make
will build all of the examples. If you want to run a single executable that is built with dune
you can run:
$ dune exec -- ./<executable_name>.exe
External examples
These are other examples that utilise OCaml effect handlers that are not in this repo:
Citation
If you are citing this work in an academic paper, please cite the PLDI 2021 paper "Retrofitting Effect Handlers onto OCaml": https://dl.acm.org/doi/10.1145/3453483.3454039.