سؤال

سؤال سريع كان يزعجني مؤخرًا. هل يقوم Haskell بإجراء جميع اختبار التكافؤ في وظيفة تُرجع منطقية ، حتى لو قام المرء بإرجاع قيمة خاطئة؟

علي سبيل المثال

f a b = ((a+b) == 2) && ((a*b) == 2)

إذا كان الاختبار الأول يعود خطأ ، فهل سيجري الاختبار الثاني بعد &&؟ أم أن هاسكل كسول بما يكفي لعدم القيام بذلك والمضي قدمًا؟

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

المحلول

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

(&&)                    :: Bool -> Bool -> Bool
True  && x              =  x
False && _              =  False

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

نصائح أخرى

كما قال مارتن ، فإن اللغات ذات التقييم الكسول لا تُقيّم أي شيء لا يلزم وجود قيمة على الفور. بلغة كسول مثل هاسكل ، تحصل على دائرة قصيرة مجانًا. في معظم اللغات ، || و && والمشغلين المماثلة يجب أن يتم بناؤها خصيصًا في اللغة من أجل تقييم الدائرة القصيرة. ومع ذلك ، في هاسكل ، فإن التقييم البطيء يجعل هذا غير ضروري. يمكنك تحديد وظيفة تقوم بدوائر قصيرة بنفسك حتى:

scircuit fb sb = if fb then fb else sb

سوف تتصرف هذه الوظيفة تمامًا مثل المشغل المنطقي "أو". هنا كيف || تم تعريفه في هاسكل:

True  || _ = True
False || x = x

لذا ، لإعطائك إجابة محددة على سؤالك ، لا. إذا كان الجانب الأيسر من || صحيح أن الجانب الأيمن لا يتم تقييمه أبدًا. يمكنك وضع اثنين واثنين معًا للمشغلين الآخرين الذين "دائرة قصيرة".

التقييم الكسول يعني أنه لا يتم تقييم أي شيء حتى هناك حاجة إليه حقًا.

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