@popovitsj имеет хорошую склонность.
SML использует сопоставление шаблонов, чтобы определить, какую версию определения функции использовать.
fun sqrt x s = if ((s*s) <= x) then s | sqrt x s = if (s*s) > x then sqrt x (s - 1);
Является не определенным, и SML не имеет возможности отступить и пробовать другое определение, если то, что он пытается, не удается (то есть как Prolog).
В этом сценарии вы можете просто использовать
fun sqrt x s = if s * s <= x then s else sqrt x (s-1);
Эта функция логически действительна только в том случае, если вы передаете ее значение, которое при первоначальном прохождении не пройдет выражение IF.
Я не проверял это, но я считаю, что это должно помочь.