سؤال

هل من الممكن التنفيذ مكارثي amb-المشغل أو العامل للاختيار غير الحتمي في C#؟

يبدو أن .NET يفتقر إلى دعم الاستمرارية ولكن yield return يمكن أن يكون مفيدا.هل سيكون هذا ممكنًا في لغات .NET الثابتة الأخرى مثل F#؟

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

المحلول

نعم، yield return يفعل شكلاً من أشكال الاستمرار.على الرغم من أنه في العديد من الحالات المفيدة، يوفر Linq عوامل تشغيل وظيفية تسمح لك بتوصيل مولد تسلسل بطيء معًا، لذا في الواقع في C# 3، ليس من الضروري استخدامه yield return كثيرًا (باستثناء عند إضافة المزيد من امتدادات نمط Linq الخاصة بك لسد الثغرات في المكتبة، على سبيل المثال.الرمز البريدي، تتكشف).

في المثال نقوم بتحليل عدد صحيح بالقوة الغاشمة.بشكل أساسي، يمكن تنفيذ نفس المثال في لغة C# باستخدام عوامل تشغيل Linq المضمنة:

var factors = Enumerable.Range(2, 100)
        .Join(Enumerable.Range(2, 100), 
              n => 1, n => 1, (i, j) => new { i, j })
        .First(v => v.i*v.j == 481);

Console.WriteLine("Factors are " + factors.i + ", " + factors.j);

هنا نقاط البداية هي مكالمتي ل Enumerable.Range, ، وهو مدمج في Linq ولكن يمكنك تنفيذه بنفسك على النحو التالي:

IEnumerable<int> Range(int start, int stop)
{
    for (int n = start; n < stop; n++)
        yield return n;
}

هناك نوعان من المعلمات الفردية، و n => 1, n => 1 المعلمات ل Join.سأختار 1 كقيمة أساسية لـ Join لاستخدامها عند مطابقة العناصر، ومن ثم ستتطابق جميع المجموعات ولذا سأقوم باختبار كل مجموعة من الأرقام من النطاقات.

ثم أقوم بتحويل زوج القيم إلى نوع من الصف (نوع مجهول) مع:

(i, j) => new { i, j })

أخيرًا، اخترت الصف الأول الذي يرضي اختباري:

.First(v => v.i*v.j == 481);

تحديث

الكود داخل المكالمة ل First ليس من الضروري أن يكون مجرد تعبير اختبار قصير.يمكن أن يكون مجموعة كبيرة من التعليمات البرمجية الحتمية التي تحتاج إلى "إعادة التشغيل" في حالة فشل الاختبار:

.First(v => 
       {
           Console.WriteLine("Aren't lambdas powerful things?");

           return v.i*v.j == 481;
       );

لذا فإن جزء البرنامج الذي قد يحتاج إلى إعادة التشغيل بقيم مختلفة يتم إدخاله في لامدا.عندما تريد لامدا إعادة تشغيل نفسها بقيم مختلفة، فإنها تُرجع خطأ فقط - وهو ما يعادل الاتصال amb بدون حجج.

نصائح أخرى

وهذا ليس جوابا على سؤالك، ولكن قد تحصل على ما تريد.

ويستخدم AMB للحوسبة nondeterministic. وكما تعلمون، حاسوب هي لغة nondeterministic باستخدام فكرة التوحيد لربط القيم للمتغيرات (أساسا ما ينتهي الأمر به AMB).

وهناك تنفيذ هذه الوظيفة في C #، ودعا YieldProlog. كما كنت تفكر، المشغل العائد هو شرطا هاما لذلك.

http://yieldprolog.sourceforge.net/

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