exception negative_arg of real; fun SQRT x = if x < 0.0 then raise (negative_arg x) else sqrt x; fun quad_roots (a,b,c) = (* assumes a is non-zero *) let val discriminant = (b*b - 4.0*a*c) val d = SQRT discriminant val a2 = 2.0*a in ([(~b + d)/a2,(~b - d)/a2],discriminant) end handle (negative_arg y) => ([],y); val s1 = quad_roots (1.0,0.0,~1.0); (* X*X -1 ... has roots ~1 and 1 *) val s2 = quad_roots (1.0,0.0,1.0); (* X*X +1 ... has no real roots. *)