## Wednesday, 1 January 2014

### The basic evaluator

OK so I've taken down Philip Wadler's paper "Monads for functional programming" from its place on my One Day I'll Get My Head Round This pile because I ask myself, how would this work in Erlang?  Here goes.

### Basic evaluator

The paper illustrates application of monads to functional programming by means of a series of variations on a tiny example program, a module for evaluating simple expressions.

The evaluator works on two types of term:
• A term is either a constant, denoted by the tuple {con, A} where A is some integer,
• Or it is a quotient, denoted {dv, T, U} where T and U are other terms.
The basic evaluator looks like this. To evaluate a Constant {con, A} we return the integer A.  To evaluate the quotient {dv, T, U} we evaluate T and U and then divide the value from T by the value from U.
There are also two example expressions to test, called Answer and Error:
• Answer represents the calculations (1972/2)/23 = 42 (I get the allusion) and
• Error represents 1/0 so it is there to cause an error.
I've added these to the module as functions to save typing them out.  Here is the code.
-module(eval0).
-export([eval/1]).

% Basic evaluator

eval({con, A}) ->
A;
eval({dv, T, U}) ->
eval(T) div eval(U).

{dv, {dv, {con, 1972}, {con, 2}}, {con, 23}}.

error() ->
{dv, {con, 1}, {con, 0}}.

So I can load this code into the Erlang shell and evaluate the two expressions answer and error:

C:\Users\polly\Erlang>erl
Eshell V5.10.2  (abort with ^G)
1> l(eval0).
{module,eval0}
42
3> eval0:eval(eval0:error()).
** exception error: an error occurred when evaluating an arithmetic expression
in function  eval0:eval/1 (c:/Users/polly/Erlang/eval0.erl, line 10)
4> q().
ok
5>
C:\Users\polly\Erlang>