كيفية الحصول على طريقتين يدعو بعضنا البعض؟

StackOverflow https://stackoverflow.com/questions/680606

  •  22-08-2019
  •  | 
  •  

سؤال

وأنا مرتبك قليلا عن كيفية الحصول على اثنين من طريقة لتنادي بعضها البعض (أي أن يكون A() دعوة B() وB() دعوة A()). ويبدو أن F # فقط "يرى" الطريقة بعد تم اجهتها في التعليمات البرمجية، لذلك إذا كان لديه لا، فإنه يقول فقط <م> لم يتم تحديد قيمة أو منشئ .

وأنا في عداد المفقودين شيء أساسي جدا هنا؟

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

المحلول

'السماح الكتابة ... و ... "هو بناء الجملة التي تسعى.

let rec F() = 
    G()
and G() =
    F()

وانظر أيضا مغامرات في F # شركة -Recursion .

نصائح أخرى

ومنذ والسؤال هو حول أساليب، والجواب براين هو حول وظائف، وربما كان من المفيد أن نشير إلى أنه يمكنك استخدام بناء الجملة مشابهة لأنواع:

type A() =
    let b = new B()
    member x.MethodA() = b.MethodB()
and B() =
    member x.MethodB() = ()

ملحوظة أيضا أن الأعضاء "السماح تفصيل" بشكل افتراضي (في الحقيقة أنا لا أعتقد أنها يمكن أن تكون غير عودي).

وF # 4.1 يدخل <لأ href = "https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/modules#module-rec-allowing-mutual-recursive-code-at-the على مستوى -module "يختلط =" noreferrer "> متبادل وحدات و مساحات الأسماء العودية .

وهذه هي بديل للالكلمة and.

module rec PingPong = // <------ rec keyword here.

    let pong() = 
        printfn "pong"
        ping() 

    let ping () = 
        printfn "ping"
        pong()

والكلمة rec تحدد وحدات ومساحات أن "السماح لكافة التعليمات البرمجية الواردة أن تكون متكررة بعضها بعضا".

وظائف أعلن عبر اسمحوا

let rec a () = b ()
and b () = ()

وهذه هي <م> وظائف متكررة بعضها بعضا .

طرق داخل نفس نوع

type T () =
    member t.A () = t.B()
    member t.B () = ()

وهذا هو تافهة. انها تعمل فقط. ملاحظة تعليق هابيل بالرغم من ذلك.

طرق داخل أنواع مختلفة

type TypeA () =
    member t.A (b : TypeB) = b.B()

and TypeB () =
    member b.B () = ()

وهذا يستخدم بناء الجملة type ... and ل <م> أنواع متكررة بعضها بعضا .

ملاحظات

وعادة ما يتم استخدام and فقط في حالة حدوث المكالمات في كلا الاتجاهين. خلاف ذلك، قد يكون من الأفضل لإعادة ترتيب الإعلانات بحيث تأتي وظيفة تسمى أولا. غالبا ما يكون من المفيد للنوع الاستدلال وقراءة لتجنب تبعيات دائرية، ولا يعني لهم حيث لا يتم استخدامها.

وأقترح لتحرير المسألة إما طلب وظائف بشكل عام، أو لطلب أنواع مختلفة (في هذه الحالة أود أن إزالة أول حالتين من هذه الإجابة). تعتبر وسائل المرجح أن تكون مجموعة فرعية من الوظائف، وهو مصطلح رياضي العام. ومع ذلك، فإن جميع وظائف # F هي من الناحية الفنية <م> طرق CLI ، وهذا ما يتم تجميع لهم. كما هو، وليس من الواضح ما السؤال يسأل عنه، ولكن أفترض من الإجابة المقبولة أنه لا نطلب ليس فقط بالنسبة للطرق، كعنوان يعني ضمنا.

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