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);
هذه الوظيفة صالحة منطقياً فقط إذا كنت تمررها قيمة عندما تفشل في الأصل في التعبير إذا كان التعبير.
لم أختبر هذا ولكني أعتقد أنه ينبغي أن يساعد.