@Popovitsj hat eine gute Neigung.
SML verwendet das Musteranpassung, um zu bestimmen, welche Version der Funktionsdefinition verwendet werden soll.
fun sqrt x s = if ((s*s) <= x) then s | sqrt x s = if (s*s) > x then sqrt x (s - 1);
Ist nicht deterministisch, und SML verfügt nicht über die Möglichkeit, eine andere Definition zu erzielen und zu versuchen, wenn die von ihm versehentlich versuchte (dh Prolog).
In diesem Szenario können Sie einfach verwenden
fun sqrt x s = if s * s <= x then s else sqrt x (s-1);
Diese Funktion ist nur logisch gültig, wenn Sie sie übergeben, dass bei ursprünglich bestandener Ausdruck den Wert fehlschlägt.
Ich habe das nicht getestet, aber ich glaube, es sollte helfen.