SML by example
Compila(on 2016
Aslan Askarov (aslan@cs.au.dk)
Revised from slides by E.Ernst
SML by example Compila(on 2016 Aslan Askarov ( aslan@cs.au.dk ) - - PowerPoint PPT Presentation
SML by example Compila(on 2016 Aslan Askarov ( aslan@cs.au.dk ) Revised from slides by E.Ernst Star%ng an SML interac%ve session sml Standard ML of New Jersey v110.78 [built: Sun Apr 26 01:06:11 2015] - 1 + 1; val it = 2 : int This is an
Revised from slides by E.Ernst
› sml Standard ML of New Jersey v110.78 [built: Sun Apr 26 01:06:11 2015]
val it = 2 : int
val it = 2 : int
> _
> rlwrap sml
stdIn:1.21 Warning: calling polyEqual val it = fn : ''a -> ''a -> bool
> rlwrap sml -Ccontrol.poly-eq-warn=false ...
val it = fn : ''a -> ''a -> bool
stdIn:1.2-1.13 Error: operator and operand don't agree [equality type required]
in expression: 42.0 = 42.0
val it = true : bool
val it = 7 : int
val res = 7 : int
val it = 14 : int
val it = 3 : int
val it = 3 : int
[autoloading] [library $SMLNJ-BASIS/basis.cm is stable] [autoloading done] val y = 1.41421356237 : real
val large = false : bool
val it = false : bool
val it = 42 : int
val title = "Mr" : string
val name = "Tambourine Man" : string
val junkmail = "Dear Mr Tambourine Man, you have won $$$!" : string
val n = 41 : int
val it = "Dear Mr Tambourine Man" : string
stdIn:35.1-35.12 Error: operator and operand don't agree [literal]
in expression: Math.sqrt 2
val circleArea = fn : real -> real
val a = 314.159265359 : real
val doubl = fn : real -> real
val it = 14.0 : real
= "Dear " ^ title ^ " " ^ name ^ ", You have won $$$!"; val junkmail = fn : string -> string -> string
val it = "Dear Mr Tambourine Man, You have won $$$!" : string
val swapped = fn : string -> string -> string
val it = fn : string -> string
val it = "Dear Alice Mr, You have won $$$!" : string
val f = fn : string -> string
val half = fn : real -> real
val it = 0.707106781187 : real
val it = 0.707106781187 : real
val it = fn : real -> real
val also_sqrt = fn : real -> real
val it = 1.41421356237 : real
val fac = fn : int -> int
val it = 3628800 : int
= and odd n = if n = 0 then false else even (n - 1); val even = fn : int -> bool val odd = fn : int -> bool
val it = fn : int -> int
val it = 420 : int
val isLarge = fn : real -> bool
val it = true : bool
val it = 3 : int
val it = 3 : int
val it = 3 : int
val x = 5 : int
= in if x then 117 else 118 (* uses the new x *) = end; val it = 117 : int
val it = 5 : int
= | fac n = n * fac (n - 1); val fac = fn : int -> int
val it = 3628800 : int
= case n of = 0 => 1 = | _ => n * fac (n - 1); val fac = fn : int -> int
val p = (2,3) : int * int
val w = (2,true,(7,false),"blah") : int * bool * (int * bool) * string
val it = true : bool
val it = "blah" : string
val it = 7 : int
val add = fn : int * int -> int
val it = 5 : int
val noon = (12,0) : int * int
val talk = (9,0) : int * int
Hello val it = () : unit (* the empty tuple: no info *)
= h1 < h2 orelse (h1 = h2 andalso m1 < m2 ); val earlier = fn : (int * int) * (int * int) -> bool
stdIn:166.1-166.18 Error: operator and operand don't agree [tycon mismatch]
in expression: earlier noon
val it = false : bool
val x1 = [7,9,13] : int list
val x2 = [7,9,13] : int list
val equal = true : bool
val ss = ["Dear ","Mr","","Tambourine Man",", You have won $$$!"] : string list
val junkmail2 = "Dear MrTambourine Man, You have won $$$!" : string
= | len (x::xr) = 1 + len xr; val len = fn : ''a list -> int
val x2len = 3 : int
val sslen = 5 : int
val x3 = [47,11] : int list
val x1x3 = [7,9,13,47,11] : int list
val it = 1 : int
val it = [2,3] : int list
val z = [(1,"a"),(2,"b"),(3,"c")] : (int * string) list
val it = ([1,2,3],["a","b","c"]) : int list * string list
val x = {name="Alice",phone=777} : {name:string, phone:int}
val it = "Alice" : string
val it = 777 : int
val show = fn : {name:string, phone:int} -> string
val it = "Alice has extension 777" : string
exception IllegalHour
val mins = fn : int -> int
uncaught exception IllegalHour raised at: stdIn:204.48-204.59
val it = ~1 : int
= | Teacher of string * int; datatype person = Student of string | Teacher of string * int
val people = [Student "Alice",Teacher ("Bob",444)] : person list
= | getphone (Student name) = raise Fail "no phone"; val getphone = fn : person -> int
uncaught exception Fail [Fail: no phone]
= | NONE; datatype intopt = NONE | SOME of int
= | getphone (Student name) = NONE; val getphone = fn : person -> intopt
val it = NONE : intopt
= | Br of int * intTree * intTree; datatype intTree = Br of int * intTree * intTree | Lf
val t1 = Br (34,Br (23,Lf,Lf),Br (54,Lf,Br #)) : intTree
= | sumTree (Br (v, t1, t2)) = v + sumTree t1 + sumTree t2; val sumTree = fn : intTree -> int
val t1sum = 189 : int
val addp = fn : int * int -> int
val addc = fn : int -> int -> int
val res1 = 42 : int
val res2 = 42 : int
val addSeventeen = fn : int -> int
val res3 = 42 : int
val res4 = 117 : int