prefer pattern matching to equality check
can use slightly more concise syntax here, still not as nice as SML ;)

fun is_empty Nil = true
  | is_empty _ = false
alternatively, use guards?

tbh I'm not sure what's preferred in OCaml, but my instinct it to use
pattern matching as guards aren't checked for completeness by the
compiler, would be curious to hear what Alan thinks
just an alternative ORDERED sig for comparison

I know that the OCaml standard lib uses a compare function with type
t * t -> int, and it looks like Jane Street's lib replacement does
too, but I much prefer this, which feels much more MLish to me than
checking the sign of an int.

Were I actually writing an OCaml app I would probably just put up with
the version returning an int, but couldn't resist in this scenario ;)

http://caml.inria.fr/pub/docs/manual-ocaml/libref/Set.OrderedType.html
https://ocaml.janestreet.com/ocaml-core/latest/doc/core_kernel/Comparator.html#TYPEt

http://www.smlnj.org/doc/smlnj-lib/Manual/ord-key.html#ORD_KEY:SIG:SPEC