لماذا هذا هاسكل قانون العمل بنجاح مع لانهائية القوائم ؟

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

سؤال

لدي بعض هاسكل رمز لا العمل بشكل صحيح على قائمة لا حصر لها, ولكن أنا لا أفهم لماذا فإنه يمكن القيام بذلك بنجاح.(أنا عدلت البرمجية الأصلية-التي لم تتعامل مع لانهائية القوائم أن تتضمن شيئا من بعض مدونة على الانترنت و فجأة أرى أنه يعمل ولكن لا أعرف لماذا).

myAny :: (a -> Bool) -> [a] -> Bool
myAny p list = foldr step False list
   where
      step item acc = p item || acc

فهمي foldr هو حلقة من خلال كل عنصر في القائمة (وربما هذا الفهم غير مكتملة).إذا كان الأمر كذلك, يجب أن لا يهم كيف "خطوة" وظيفة صيغته ...يجب أن تكون قادرة على التعامل مع حلقات لانهائية.

ومع ذلك ، فإن الأعمال التالية:

*Main Data.List> myAny even [1..]
True

الرجاء مساعدتي في فهم ما يلي:لماذا ؟ ؟

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

المحلول

دعونا قليلا أثر في رؤوسنا كيف هاسكل تقييم التعبير الخاص بك.استبدال يساوي بالنسبة يساوي على كل خط, تعبير بسرعة كبيرة إلى True:

myAny even [1..]
foldr step False [1..]
step 1 (foldr step False [2..])
even 1 || (foldr step False [2..])
False  || (foldr step False [2..])
foldr step False [2..]
step 2 (foldr step False [3..])
even 2 || (foldr step False [3..])
True   || (foldr step false [3..])
True

يعمل هذا لأن acc هي مرت وهو مقيم صوت هائل (كسول التقييم) ، ولكن أيضا لأن || وظيفة صارمة في أولا الحجة.

لذلك هذا ينهي:

True || and (repeat True)

ولكن هذا لا:

and (repeat True) || True

ننظر في تعريف || أن نرى لماذا هذا هو الحال:

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

نصائح أخرى

<اقتباس فقرة>   

وما أفهمه من foldr هو أنه   إرادة يتكرر خلال كل عنصر في   قائمة (وربما هذا الفهم   غير مكتمل).

وليس لديها foldr (على عكس foldl) يتكرر خلال كل بند من بنود القائمة. ومن المفيد أن ننظر في كيفية تعريف foldr.

foldr f z []     = z
foldr f z (x:xs) = f x (foldr f z xs)

وعندما يتم تقييمها دعوة إلى foldr، فإنه يفرض على تقييم استدعاء f وظيفة. ولكن لاحظ كيف تم تضمين دعوة عودي إلى foldr في مشادة إلى f وظيفة. لم يتم تقييم هذا النداء عودي إذا f لا يقيم الحجة الثانية.

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

هذه المادة ويكي

وأنا لا أعرف هاسكل، ولكن أظن أن في قضيتك، وأنها تعمل بسبب تقييم كسول. لأنه يسمح لك للعمل مع قائمة طويلة بلا حدود، عند الوصول إليه، فإنه سيتم احتساب النتيجة كما كنت في حاجة إليها.

http://en.wikipedia.org/wiki/Lazy_evaluation

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