سؤال
في هيكل وتفسير برامج الكمبيوتر (SICP) القسم 2.2.3 يتم تعريف العديد من الوظائف باستخدام:
(accumulate cons nil
(filter pred
(map op sequence)))
مثالان يستفيدان من هذا على قائمة أرقام فيبوناتشي ، even-fibs
و list-fib-squares
.
يتم تعريف وظائف التراكم والتصفية والخريطة في القسم 2.2 أيضًا. الجزء الذي يربكني هو السبب في أن المؤلفين شملوا accumulate
هنا. accumulate
يأخذ 3 معلمات:
وظيفة ثنائية يتم تطبيقها
القيمة الأولية ، تستخدم كمعلمة أقصى اليمين للوظيفة
قائمة سيتم تطبيق الوظيفة إليها
مثال على تطبيق التراكم على قائمة باستخدام التعريف في الكتاب:
(accumulate cons nil (list 1 2 3))
=> (cons 1 (cons 2 (cons 3 nil)))
=> (1 2 3)
لأن المعلمة الثالثة هي قائمة ، (accumulate cons nil some-list)
سيعود فقط some-list
, وفي هذه الحالة نتيجة (filter pred (map op sequence))
هي قائمة.
هل هناك سبب لهذا الاستخدام accumulate
بخلاف الاتساق مع وظائف أخرى منظمة بالمثل في القسم؟
المحلول
أنا متأكد من أن هذين الاستخدامين accumulate
إن مجرد توضيح لحقيقة أن "العناصر الإرشادية لبناء قائمة" يمكن التعامل معها كعملية تراكمية بنفس الطريقة التي يمكن بها "ضرب الأرقام للحصول على منتج" أو "جمع الأرقام للحصول على إجمالي". أنت محق في أن التراكم هو بشكل فعال عدم وجود OP.
(جانبا: لاحظ أنه من الواضح أن هذا يمكن أن يكون عملية أكثر فائدة إذا كان إخراج filter
ومدخلات accumulate
لم تكن قائمة على سبيل المثال ، إذا كان يمثل تسلسلًا تم إنشاؤه بتكاسل.)