visualize-cbn: Visualize CBN reduction

[ bsd3, development, program ] [ Propose Tags ]

CBN interpretation and visualization tool. Exports in text format, coloured text (ANSI) or HTML/JavaScript.

[Skip to Readme]


Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


Versions [RSS],,, 0.2.0, 0.2.1
Change log
Dependencies ansi-terminal (>=0.6 && <1.1), base (>=4.9 && <4.20), blaze-html (>=0.8 && <0.10), blaze-markup (>=0.7 && <0.9), containers (>=0.5 && <0.8), data-default (>=0.7 && <0.8), mtl, optparse-applicative (>=0.12 && <0.19), parsec (>=3.1 && <3.2), template-haskell, text [details]
License BSD-3-Clause
Copyright Well-Typed LLP
Author Edsko de Vries
Revised Revision 3 made by AndreasAbel at 2023-09-29T12:42:28Z
Category Development
Source repo head: git clone
Uploaded by EdskoDeVries at 2019-09-10T09:01:05Z
Distributions NixOS:
Reverse Dependencies 1 direct, 0 indirect [details]
Executables visualize-cbn
Downloads 1748 total (3 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs not available [build log]
Last success reported on 2019-09-10 [all 2 reports]

Readme for visualize-cbn-

[back to package description]

Call-by-name interpretation and visualization tool

Haskell and other call-by-name languages use lazy evaluation as their default evaluation strategy. For beginners and advanced programmers alike this can sometimes be confusing. The visualize-cbn tool is designed to help in such cases; it is a simple interpreter for a mini-Haskell-like language which outputs the state of the program at every step in a human readable format. It can also generate a HTML/JavaScript version with "Previous" and "Next" buttons to allow to step through a program.


Consider the following example program:

fac = (\n ->
    if le n 1
      then 1
      else mul (@fac (sub n 1)) n

main = @fac 1

The syntax is not quite Haskell, but hopefully it should be pretty self-explanatory. The parser is pretty finicky; look at some of the examples in examples/ to deduce what the syntax is. The only somewhat odd feature is the identifies marked with an at-sign (@); these corresponds to pointers in the heap. For programs in their initial state (i.e., as written down), the only heap pointers we expect are to CAFs (constant applicative forms; values defined at the top-level of the program).

Stepping through

We can step through the evaluation of this program using

visualize-cbn -i examples/fac.hs --show-trace --hide-prelude

This will result in something like

** 0

fac 1

(apply fac)

** 1

if 1 <= 1
  then 1
  else fac (1 - 1) * 1

(delta: 1 <= 1)

** 2

if True
  then 1
  else fac (1 - 1) * 1

(if True)

** 3



At every step it lists the current state of the program, as well as the reduction rules that apply. There are some options for tweaking the output; see --help.

Generating HTML/JavaScript

The tool can also generate HTML/JavaScript:

cr visualize-cbn -i examples/fac.hs --javascript foo.js

The resulting .js file can be embedded in a HTML page (such as a blog post); a minimal HTML page illustrating how this is done is given by


<a onclick="cbnPrev()">Prev</a>
<a onclick="cbnNext()">Next</a>
(step <span id="cbn_step">Step</span>, <span id="cbn_status">Status</span>)

<table width="100%" border="1" cellpadding="5" style="border-collapse: collapse;">
<tr><td><div style="font-family: monospace;" id="cbn_term">Term</div></td></tr>
<tr><td><div style="font-family: monospace;" id="cbn_heap">Heap</div></td></tr>

<script type="text/javascript" src="foo.js"></script>


(This .html file was not written to illustrate HTML best practices :-) ) See the Well-Typed blog post about the tool for an example output.