لماذا هذا هاسكل قانون العمل بنجاح مع لانهائية القوائم ؟
-
08-07-2019 - |
سؤال
لدي بعض هاسكل رمز لا العمل بشكل صحيح على قائمة لا حصر لها, ولكن أنا لا أفهم لماذا فإنه يمكن القيام بذلك بنجاح.(أنا عدلت البرمجية الأصلية-التي لم تتعامل مع لانهائية القوائم أن تتضمن شيئا من بعض مدونة على الانترنت و فجأة أرى أنه يعمل ولكن لا أعرف لماذا).
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
لا يقيم الحجة الثانية.
والنقطة الأساسية هنا هي أن هاسكل هي لغة غير صارمة. "غير صارمة" تعني أنه يتيح وظائف غير صارمة، وهذا بدوره يعني أن المعلمات وظيفة قد لا يتم تقييم بشكل كامل قبل أن يمكن استخدامها. من الواضح أن هذا يسمح لتقييم كسول، والذي هو "تقنية تأخير عملية حسابية حتى يطلب من النتيجة".
وأنا لا أعرف هاسكل، ولكن أظن أن في قضيتك، وأنها تعمل بسبب تقييم كسول. لأنه يسمح لك للعمل مع قائمة طويلة بلا حدود، عند الوصول إليه، فإنه سيتم احتساب النتيجة كما كنت في حاجة إليها.