سؤال

ولقد كتبت وظيفة follwing:

let str2lst str =
    let rec f s acc =
      match s with
        | "" -> acc
        | _  -> f (s.Substring 1) (s.[0]::acc)
    f str []

وكيف يمكنني أن أعرف إذا تحولت # مترجم F قبل أن تتحول إلى حلقة؟ هل هناك طريقة لمعرفة من دون استخدام العاكس (ليست لدي خبرة مع العاكس، وأنا لا أعرف C #)؟

وتحرير: أيضا، هل من الممكن كتابة دالة العودية الذيل دون استخدام وظيفة الداخلية، أم أنها ضرورية لحلقة للإقامة في

وأيضا، هل هناك وظيفة في F # الأمراض المنقولة جنسيا ليب لتشغيل وظيفة معينة عدة مرات، في كل مرة يعطيها الناتج الماضي كمدخل؟ دعونا نقول لدي سلسلة، أريد أن أشغل وظيفة خلال سلسلة ثم تشغيله مرة أخرى على السلسلة الناتجة وهلم جرا ...

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

المحلول

للأسف لا توجد وسيلة تافهة.

وليس من الصعب جدا لقراءة شفرة المصدر واستخدام أنواع وتحديد ما إذا كان شيء هو دعوة الذيل عن طريق التفتيش (هل هو "آخر شيء، وليس في كتلة" حاول ")، ولكن الناس ثانيا- تخمين أنفسهم وارتكاب الأخطاء. ليس هناك طريقة تلقائية بسيطة (غير يتفقد مثل الشفرة التي تم إنشاؤها).

وبطبيعة الحال، يمكنك فقط محاولة الدالة على قطعة كبيرة من البيانات اختبار ومعرفة ما اذا كان يفجر أم لا.

وسوف # مترجم F توليد تعليمات IL .tail لجميع المكالمات الذيل (ما لم يكن الأعلام المترجم لإيقاف تشغيلها يستخدم - تستخدم عندما تريد للحفاظ على إطارات كومة من أجل التصحيح)، باستثناء أن وظائف مباشرة الذيل متكررة سوف يكون الأمثل في الحلقات. (تحرير: أعتقد في الوقت الحاضر # مترجم F فشل أيضا تنبعث منها .tail في الحالات التي يمكن إثبات عدم وجود حلقات متكررة من خلال هذا الموقع دعوة، وهذا هو الأمثل نظرا إلى أن شفرة تشغيل .tail أبطأ قليلا على العديد من المنصات.)

'tailcall' هو الكلمة المحجوزة، مع فكرة أن النسخة المقبلة من F # قد تسمح لك لكتابة منها مثلا.

tailcall func args

ومن ثم الحصول على التحذير / الخطأ إذا لم يكن مكالمة الذيل.

وظائف فقط التي ليست بطبيعة الحال الذيل العودية (وبالتالي تحتاج إلى المعلمة تراكم إضافية) سوف 'قوة' لك في لغة ال 'وظيفة الداخلية.

وفيما يلي نموذج التعليمات البرمجية ما طلبتم:

let rec nTimes n f x =
    if n = 0 then
        x
    else
        nTimes (n-1) f (f x)

let r = nTimes 3 (fun s -> s ^ " is a rose") "A rose"
printfn "%s" r

نصائح أخرى

وأنا أحب بحكم التجربة بول غراهام يصوغ في في اللثغة : إذا كان هناك على العمل غادر الى القيام به ، أو على سبيل المثال التلاعب في الناتج دعوة متكررة، ثم الدعوة ليست العودية الذيل.

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