Greg Fitzgerald garious at gmail.com
Mon Nov 17 21:13:02 EST 2008

```I wrote:
> I don't recall where I found the following example

My apologies to Ralf Lammel and Ondrej Rypacek.  Five seconds on
Google tells me I had copied that code verbatim from their paper, "The
expression lemma."

http://www.uni-koblenz.de/~laemmel/expression/long.pdf

Great paper, by the way!

-Greg

On Mon, Nov 17, 2008 at 11:00 AM, Greg Fitzgerald <garious at gmail.com> wrote:
> Jonathan Cast wrote:
>> [Functional and object-oriented programming] have points of similarity, but on net the
>> best plan is to simply never reason analogically from one to the other.
>
> Coming from the OO world, I found it very useful to see how the same
> solution is modeled using different paradigms.  I don't recall where I
> found the following example, but copied it locally as compelling
> evidence that the functional solution can be much clearer and shorter
> than the same solution modeled with objects and inheritance.
>
> -- Arithmetic expression forms
> data Expr = Num Int | Add Expr Expr
>
> -- Evaluate expressions
> eval :: Expr -> Int
> eval (Num i) = i
> eval (Add l r ) = eval l + eval r
>
> -- Modify literals modulo v
> modn :: Expr -> Int -> Expr
> modn (Num i) v = Num (i 'mod' v)
> modn (Add l r) v = Add (modn l v) (modn r v)
>
>
>
> public abstract class Expr {
>   public abstract int eval ();
>   public abstract void modn(int v);
> }
>
> public class Num extends Expr {
>   private int value;
>   public Num(int value) { this.value = value; }
>   public int eval () { return value; }
>   public void modn(int v) { this.value = this.value % v;
> }
>
> public class Add extends Expr {
>   private Expr left, right;
>   public Add(Expr left, Expr right ) { this.left = left; this.right = right; }
>   public int eval () { return left.eval () + right.eval (); }
>   public void modn(int v) { left.modn(v); right.modn(v); }
> }
>
> -Greg
>
```