سؤال

محاولة تحديد كيفية الحصول على الجذر التربيعي في SML باستخدام هذا الرمز الكاذب:

sqrt x s = s if s*s <= x
sqrt x s = sqrt x (s-1) if s*s > x

أعطيت هذه الصيغ لنا من قبل المحاضر ، علينا حل المشكلة في SML.

لقد جربتها بعض الطرق المختلفة ، لكنني سأقوم بنشر الطرق المختلفة مع الأخطاء عبر وحدة التحكم:

- fun sqrt x s = if ((s*s) <= x) then s | sqrt x s = if (s*s) > x then sqrt x (s - 1);
stdIn:32.39-32.45 Error: syntax error: deleting  BAR ID
stdIn:32.52-32.56 Error: syntax error: deleting  IF LPAREN
stdIn:32.59-32.62 Error: syntax error: deleting  RPAREN ID
stdIn:32.65-32.74 Error: syntax error: deleting  THEN ID
- fun sqrt x s = s if ((s*s) <= x) | sqrt x (s - 1);
stdIn:10.2-17.4 Error: syntax error: deleting  IF LPAREN
stdIn:17.14 Error: syntax error found at RPAREN
- fun sqrt x s = s if s*s <= x | sqrt x (s - 1);
stdIn:10.2-17.4 Error: syntax error: deleting  IF ID
- fun sqroot x s = s if s*s <= x | sqrt x (s - 1);
stdIn:17.2-17.6 Error: syntax error: deleting  IF ID
- fun sqrt x s = s IF s*s <= x | sqrt x (s - 1);
= ;
= ;
= ;;
stdIn:17.28-34.2 Error: syntax error: deleting  SEMICOLON SEMICOLON SEMICOLON
- fun sqrt x s = s IF s*s <= x END | sqrt x s = sqrt x (s-1) IF s*s > x END;
stdIn:17.12-17.15 Error: unbound variable or constructor: END
stdIn:10.2-17.2 Error: unbound variable or constructor: IF
stdIn:35.20-35.23 Error: unbound variable or constructor: END
stdIn:35.9-35.11 Error: unbound variable or constructor: IF
stdIn:1.17-17.15 Error: operator is not a function [circularity]
  operator: 'Z
  in expression:
    (s <errorvar>) s
stdIn:1.17-17.15 Error: operator and operand don't agree [overload]
  operator domain: 'Z * 'Z
  operand:         _ * (_ -> 'Y)
  in expression:
    (s <errorvar>) s * s
stdIn:1.6-35.23 Error: types of rules don't agree [literal]
  earlier rule(s): (_ -> int) * (_ -> 'Z) -> bool
  this rule: (_ -> int) * int -> bool
  in rule:
    (x,s) => (<exp> <exp>) s * s > x <errorvar>
stdIn:1.6-35.23 Error: right-hand-side of clause doesn't agree with function result type [literal]
  expression:  (_ -> 'Z) -> bool
  result type:  int -> _ -> int -> int
  in declaration:
    sqrt = (fn arg => (fn <pat> => <exp>))

الخطوط التي تحمل علامة "-" هي مدخلات سريعة مني ويتم إرجاع جميع الآخرين بواسطة النظام التفاعلي.

نقدر اي مساعدة، شكرا.

هل كانت مفيدة؟

المحلول

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);

هذه الوظيفة صالحة منطقياً فقط إذا كنت تمررها قيمة عندما تفشل في الأصل في التعبير إذا كان التعبير.

لم أختبر هذا ولكني أعتقد أنه ينبغي أن يساعد.

نصائح أخرى

ربما هذا مفيد؟ تم تنفيذ الرمز الكاذب في بيثون:

def sqrt(x,s):
    if (s*s <= x):
        return s
    return sqrt(x,s-1)

بالنسبة لـ SML ، لا يمكنني التحقق من هذا ، لأنه ليس لدي برنامج التحويل البرمجي SML ، ولكن ربما هذا سيعمل؟

fun sqrt (x, s) = if s*s <= x then s else sqrt(x,s-1)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top