ML Intro Notes
Last changed: DOGFOOD-frances

.

(Notes for 441 Lecture on 9/26/05.)

To Begin

Command Prompt

Types

                 + - * div mod = < <= > >=
                 + - * / 
                andalso orelse 
                ^

Expressions

Files

Datatypes

                datatype nat = Zero | Succ of nat
                val zero = Zero
                val two = Succ(Succ(Zero))
                case two of Zero => print("zero") | Succ(_) => print("non-zero")   (* at command prompt *)
                fun nat2int(n:nat):int =
                  case n of
                    Zero => 0
                  | Succ(x) => 1 + nat2int(x)


                fun int2nat(i:int):nat =
                  if (i = 0) then Zero
                    else Succ(int2nat(i-1))
                                                   |- add N1 N2 N3
                -------------------       ------------------------------
                |- add Z N N              |- add (S N1)  N2 (S N3)
                fun add(n1:nat,n2:nat):nat =
                  case n1 of
                    Zero => n2
                  | Succ(n1') => Succ(add(n1', n2))
                - add(int2nat 4, int2nat 8);
                val it = Succ (Succ (Succ (Succ (Succ #)))) : nat
                - nat2int(it);
                val it = 12 : int

Lists

                datatype 'a list = nil | :: of 'a * 'a list
                (true,3) :: (false,2) :: nil
                [[1,2],[3],[]] : int list list
                fun length(l) =
                  case l of
                    nil => 0
                  | h::t => 1 + length(t)     (* type of h? t? *)
                fun append(l1, l2) =
                   case l1 of
                     nil => l2
                   | h::t => h::append(t,l2)

Higher order functions

                val addone = fn x => x+1                (* addone: int -> int *)
                val addn = fn n => fn x => x + n        (* addn: int -> int -> int *)
                map: ('a -> 'b) -> 'a list -> 'b list
                fun map f =
                  fn l => case l of
                             nil => nil
                          | h::t => f(h) :: (map f t)
                fun map f l =
                  case l of
                    nil => nil
                  | h::t => f(h) :: (map f t)