That's a function definition -- a and b are the arguments. Caml has a funny syntax. Here's an annotated version, with comments (* like this *).

 
module StringCmp =
struct
type t = string (* This is like a C typedef *)

(* This is a function definition. 'let compare a b = <foo>'
declares a function that takes two arguments a and b. The <foo>
expression after the = is the function body. Function calls don't
use the 'f(x, y)' syntax. Instead, Caml uses simple
juxtaposition: 'f x y' instead. *)

let compare a b =
compare (String.lowercase a) (String.lowercase b)

(* This call to compare calls the generic comparison function, and
rebinds it locally in this module. (String.lowercase s) will return
a lowercase version. So what we are doing is lowercasing both args
and then calling the generic compare, to get a case-insensitive
comparison.
*)
end