Second ML example

~$ sml
Standard ML of New Jersey, Version 110.0.3, January 30, 1998 [CM; autoload enabled]
- fun fact (n) =
=    if n=0 then 1
=    else n*fact(n-1);
val fact = fn : int -> int
- fact 7;
val it = 5040 : int
- fact 0;
val it = 1 : int
- fact(0-1);
GC #11.119.121.123.126.492:   (10 ms)
GC #11.120.122.124.127.497:   (10 ms)   [an infinite loop, I entered <ctrl>C]
Interrupt
GC #11.121.123.125.128.499:   (0 ms)

- fun successor(n) = n+1;
val successor = fn : int -> int
- fun pred(n) = n-1;
val pred = fn : int -> int
- fun add(m,n) =
=   if m=0 then n
=   else successor(add(pred(m),n));
val add = fn : int * int -> int
- add(2,2);
val it = 4 : int
- add(500,50);
val it = 550 : int

- let val x=5 in (3*x*x - 7*x - 10) end;
val it = 30 : int
- let val x=3
= in let val x=x+1
=    in x+x*x
=    end
= end;
val it = 20 : int

- [1,3] @ [2,5,4];
val it = [1,3,2,5,4] : int list

- fun append(x,z) = if null(x) then z
=                   else hd(x)::append(tl(x),z);
val append = fn : 'a list * 'a list -> 'a list
- append([1,3],[2,4,5]);
val it = [1,3,2,4,5] : int list
- append([1,3],[]);
val it = [1,3] : int list
- append([],[2,4,5]);
val it = [2,4,5] : int list

- fun reverse(x,z) = if null(x) then z
=                    else reverse(tl(x),hd(x)::z);
val reverse = fn : 'a list * 'a list -> 'a list
- reverse([2,4,6,8,10],[]);
val it = [10,8,6,4,2] : int list
- fun rev(x) = reverse(x,[]);
val rev = fn : 'a list -> 'a list
- rev [2,4,6,7,10];
val it = [10,7,6,4,2] : int list

- fun len([]) = 0
= |   len(a::y) = 1+len(y);
GC #0.0.0.0.2.89:   (0 ms)
val len = fn : 'a list -> int
- len [2,4,6,8,10];
val it = 5 : int
- len [];
val it = 0 : int
- len ["a","c","e","g"];
val it = 4 : int

- fun app([],z) = z
= |   app(a::y,z) = a::append(y,z);
val app = fn : 'a list * 'a list -> 'a list
- app([1,3],[2,4,5]);
val it = [1,3,2,4,5] : int list

- fun strip (a,[]) = []
= |   strip (a,b::y) =
=        if a=b
=        then strip(a,y)
=        else b::strip(a,y);
val strip = fn : ''a * ''a list -> ''a list
- strip(3,[1,2,3,4,3,2,1]);
val it = [1,2,4,2,1] : int list
- strip(5,[1,2,3,4,3,2,1]);
val it = [1,2,3,4,3,2,1] : int list
- strip("dog",["cat","dog","fish","dog","book"]);
val it = ["cat","fish","book"] : string list
- strip([1,2],[[3,4],[2,3],[1,2],[1,3]]);
val it = [[3,4],[2,3],[1,3]] : int list list

<ctrl d>
$