سؤال

iterate :: (a -> a) -> a -> [a]

(كما قد تعرف) iterate هي وظيفة تأخذ وظيفة وقيمة البدء. ثم يطبق الوظيفة على قيمة البداية ، ثم يطبق نفس الوظيفة على النتيجة الأخيرة ، وهلم جرا.

Prelude> take 5 $ iterate (^2) 2
[2,4,16,256,65536]
Prelude> 

والنتيجة هي قائمة لا حصر لها. (لهذا السبب أستخدمه take). سؤالي كيف يمكنك تنفيذ خاصتك iterate' وظيفة في هاسكل ، باستخدام الأساسيات فقط ((:) (++) lambdas ، نمط mataching ، الحراس ، وما إلى ذلك)؟

(Haskell Beginner هنا)

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

المحلول

نحن سوف، أعاد يبني قائمة لا حصر لها من القيم أ زادت من قبل F. لذلك أود أن أبدأ بكتابة وظيفة تعرضها بعض القيمة أ إلى القائمة التي شيدت من خلال استدعاء التكرار بشكل متكرر مع فا:

iterate :: (a -> a) -> a -> [a]
iterate f a = a : iterate f (f a)

بفضل التقييم البطيء ، سيتم تقييم هذا الجزء فقط من القائمة التي تم إنشاؤها اللازمة لحساب قيمة وظيفتي.

نصائح أخرى

لاحظ أيضًا أنه يمكنك العثور على تعريفات موجزة لنطاق وظائف Haskell الأساسية في التقرير مقدمة قياسية.

يمكن أن تكون القراءة من خلال هذه القائمة من التعريفات المباشرة التي تمسك بشكل أساسي مكتبة غنية من قبل البدائية الخام تعليمية للغاية وفتحة من حيث توفير نافذة على "Haskell Way".

أتذكر لحظة آها في وقت مبكر جدًا عند القراءة: data Bool = False | True.

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