Q1: page 32, 4.1 b,d,f b) hd [3,4,5] 3 d) explode "foo" [ "f", "o", "o" ] f) "c" :: [ "a", "t" ] [ "c", "a", "t" ] Q2: page 32, 4.2 b,d,f b) hd [] You can't take the head of an empty list. An empty list is indivisible - both hd and tl fail on it. There's no real way to fix it. My only suggestion is to recode your function to use pattern matching. You should almost never have to call hd directly anyhow. d) explode ["bar"] explode is of type fn : string -> string list. Here, we're passing a string list, with one element, the string "bar". Presumably you should just say 'explode "bar"'. f) ["r"]::["a","t"] When you cons something using the :: operator, the thing on the right has to be a list of objects the same type as the things on the left. That would imply that ["a","t"] would have to be a list of the type of ["r"], i.e. a list of list of strings. It's not. Two good ways to fix this are "r"::["a","t"] or ["r"]@["a","t"]. Q3: page 33 4.3 b,d b) [[1,2],nil,[3]] int list list d) (["a","b"],[nil,[1,2,3]]) string list * int list list Q4: 5.1 b,d,f b) fun min3 (x:int,y,z) = if x < y then if x < z then x else z else if y < z then y else z; d) fun length nil = 0 | length (_::xs) = 1 + length xs; f) fun cycle nil = nil | cycle (x::xs) = xs@[x]; Q5: 6.10 b b) fun delete (x,nil) = nil | delete (x,y::ys) = if x = y then ys else y :: delete (x,ys);