@PopovitsJ tiene una buena inclinación.
SML utiliza la coincidencia de patrones para determinar qué versión de la definición de función usar.
fun sqrt x s = if ((s*s) <= x) then s | sqrt x s = if (s*s) > x then sqrt x (s - 1);
No es determinista, y SML no tiene la facilidad para retroceder e intentar otra definición si la intenta falla (es decir, como Prolog).
En este escenario puedes usar
fun sqrt x s = if s * s <= x then s else sqrt x (s-1);
Esta función es lógicamente válida solo si le está pasando un valor que cuando se pasa originalmente fallará la expresión IF.
No he probado esto, pero creo que debería ayudar.