سؤال

أنا جديد على ML وأحاول وظائف بسيطة ، لكنني أواجه مشكلة في محاولة الحصول على وظائف للعمل بأرقام حقيقية. على سبيل المثال ، هذه الوظيفة العكسية ....

    fun reverse (nil) = nil
      | reverse (x::xs) = if xs = nil then [x]
                         else (reverse xs) @ [x];

أحصل على مخرجات الاستنباط للأعداد الصحيحة والسلاسل.

    - reverse [1,2,3,4];
    val it = [4,3,2,1] : int list
    - reverse ["a" , "b" , "c" , "d" ];
    val it = ["d","c","b","a"] : string list

هل يمكن لأي شخص أن يشرح لي لماذا لن تعمل هذه الوظيفة بأرقام حقيقية؟

هنا هو الإخراج عندما أحاول حقيقية ...

    - reverse [1.0, 2.0];
    stdIn:1.2-53.9 Error: operator and operand don't agree [equality type required]
      operator domain: ''Z list
      operand:         real list
      in expression:
        reverse (1.0 :: 2.0 :: nil)
هل كانت مفيدة؟

المحلول

real ليس نوع المساواة في ML ، وبالتالي لا يتم إنشاء أنواع متعددة الأشكال من realS - على وجه الخصوص ، real listS ليست أنواع المساواة ، وبالتالي لا يمكنك استخدام المشغل = لمقارنة اثنين real listS ، حتى لو كانت تلك القوائم فارغة. بدلاً من ذلك ، تحتاج إلى تطابق نمط. فمثلا،

fun reverse [] = []
  | reverse (x::xs) = (reverse xs) @ [x]

أو

fun reverse [] = []
  | reverse (x::xs) = case xs of
                           [] => [x]
                         | _ => (reverse xs) @ [x]

سوف تعمل حتى لأنواع غير جودة.

(بالتناوب ، استخدم الوظيفة المضمنة List.rev.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top