كيفية تحويل كسول تسلسل إلى غير كسول في Clojure
-
10-07-2019 - |
سؤال
حاولت التالية في Clojure ، وتوقع أن يكون من فئة غير كسول تسلسل عاد:
(.getClass (doall (take 3 (repeatedly rand))))
ولكن هذا لا يزال يعود clojure.lang.LazySeq
.تخميني هو أن doall
لا تقييم كامل تسلسل ولكن يعود تسلسل الأصلي كما انها لا تزال مفيدة في التحفيظ.
فما هو اصطلاحي يعني خلق غير كسول تسلسل من كسول ؟
المحلول
doall هو كل ما تحتاج.فقط لأن seq لديه نوع LazySeq لا يعني أنه يجب انتظار التقييم.كسول seqs ذاكرة التخزين المؤقت نتائجها ، لذا كل ما عليك القيام به هو السير كسول بعدها مرة واحدة (كما doall لا) من أجل إجبار كل شيء ، وبالتالي جعلها غير كسول.بعدها لا لا قوة المجموعة بأكملها إلى تقييم.
نصائح أخرى
هذا هو إلى حد ما مسألة التصنيف. كسول التسلسل نوع واحد فقط من تسلسل كما هي قائمة ، ناقلات أو خريطة.وبالتالي فإن الجواب هو بالطبع "الامر يعتمد على ما هو نوع من عدم كسول تسلسل كنت ترغب في الحصول على:
أن تختار من:
- سابق كسول (من تقييمها) كسول تسلسل
(doall ... )
- قائمة من أجل الوصول المتسلسل
(apply list (my-lazy-seq)) OR (into () ...)
- ناقلات في وقت لاحق الوصول العشوائي
(vec (my-lazy-seq))
- خريطة أو مجموعة إذا كان لديك بعض الأغراض الخاصة.
هل يمكن أن يكون أي نوع من تسلسل معظم الأجنحة الاحتياجات الخاصة بك.
وهذا الرجل الغني يبدو أن نعرف كلوجر له وهو الصحيح تماما.
بوث وأعتقد أن هذا رمز المتكررة، وذلك باستخدام سبيل المثال، قد يكون مكملا مفيدا لهذا السؤال:
=> (realized? (take 3 (repeatedly rand)))
false
=> (realized? (doall (take 3 (repeatedly rand))))
true
والواقع <م> نوع م> لم يتغير ولكن تحقيق م> لديه
وأنا تعثر على هذه هذا بلوق أ > آخر حول doall
لا يجري العودية. لذلك وجدت أول تعليق في هذا المنصب لم خدعة. شيء على غرار:
(use 'closure.walk)
(postwalk identity nested-lazy-thing)
ولقد وجدت هذا مفيدا في وحدة الاختبار حيث كنت أرغب في إجبار تقييم بعض التطبيقات المتداخلة من map
إلى فرض حالة الخطأ.
(.getClass (into '() (take 3 (repeatedly rand))))