GIML: Tutorial Two
- Predict the type of each of these objects. Check your answer by entering
each followed by the semicolon.
("two", true, 2);
["two", true, 2];
((1,2),(3,4,5));
[[1,2],[3,4,5]];
[[],[],[]];
("andrew",size "andrew");
(["andrew"="andrew","andrew"="ben"],size "andrew", size);
- Consider the following bindings. Try to predict the result before executing
them.
val (a,b) = (5,6);
val (c,d) = (2,("xx","yy"));
val (e,(f,g)) = (1,(2,3));
val (l,m,n) = ("xx",(1,2));
That last binding will fail as the left and right hand sides are incompatible.
val (p, _ ) = (12, 10);
val (q, 10) = (12, 10);
val (r, 11) = (12, 10);
Note the failed binding again.
val u = 1::[2,3];
val v::w = 1::[2,3];
val h::t = [4,5,6];
Be sure that you understand how the final example works.
- Consider the type of each of the following functions
fun fone(x:int) = [x,x,x];
fun ftwo(x) = (x,x,x);
fun fthree(x,y) = [x ^ "b", y];
fun ffour(x,y,z) = (x+(size y),z);
- Find out the type of each of the in-built functions explode, rev, hd and tl.
Try each function on a list or a string as appropriate. Make a note of each of
the following:
- The type of explode and the name of its inverse.
- The type of rev and its inverse.
- The type of hd and what it is an abbreviation for
- The type of tl and what it is an abbreviation for.
Evaluate each of the following; try to predict the result.
hd(explode "south");
hd(tl(explode "north"));
hd(rev(explode "east"));
hd(tl(rev(explode "west")));
Optional Questions:
- The function composition operator is o (say of). We can use it to create
functions from functions.
val first = hd o explode;
val second = hd o tl o explode;
Create the functions third, fourth and last in a similar manner. You
should find that these functions extract a single character from a string.
Notice that in a chain of composed functions the last is applied first.
Note for Moscow ML users
- Use the functions first, second ... to create the following:
fun roll s = fourth s ^ first s ^ second s ^ third s;
fun exch s = second s ^ first s ^ third s ^ fourth s;
Test these functions on some four character string such as "ache" and
"vile".
To save typing you may use the function map - however as this is a higher order
function which we have not yet covered you must not attempt to understand how it
works.
val words = ["ache", "vile", "amid", "evil", "ogre"];
map roll words;
map exch words;
The two permutations roll and exch can be used to generate any permutation of
four characters. For example
val what = roll o roll o roll o exch o roll;
What's what "what"?
Using only function composition on roll and exch define the functions which
perform the following.
fb "seat" -> "eats"
fc "silt" -> "slit"
fd "more" -> "rome"
Warning : do not apply fb to "ears"
Hints:
Why not try the second self assessment now.
Now would be a good time to tackle
Diversion: Distorting Bitmaps