هل هناك وظيفة مماثلة ل"andmap" في كلوجر؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

وأريد أن تطبيق سلسلة من الاختبارات على قائمتي وتأكد من أن يتم تمرير كافة الاختبارات. هل هناك وظيفة مماثلة ل"andmap" في كلوجر؟

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

المحلول

هل يمكن استخدام every?:

user=> (every? string? '("hi" 1))
false

وهنا وثائق حول every? .

نصائح أخرى

وكلوجر 1.3 سيضيف كل سابق التحديد (وتتعلق بعض-الجبهة الوطنية ل"أو" إصدار).

وclojure.core / كل-سابق التحديد ([ص] [P1 P2] [P1 P2 P3] [P1 P2 P3 & PS])

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

قد يكون تنفيذ السذاجة:

و(defn كل-سابق التحديد [& preds] (FN [وسائط] (كل؟ # (كل؟٪ سائط) preds)))

ولكن التنفيذ الفعلي سيكون الأداء أفضل.

وكتبت andmap كما ماكرو الذي يأخذ المسندات كوسائط ويبني وظيفة أن "يلتف على and حول المسندات"، أي بمعنى.

(andmap integer? odd?) 
==>
(fn [x] (and (integer? x)
             (odd? x)))

و(لا تتسع ل<م> بالضبط هذا، ولكنه يتسع لشيء يعادل ذلك)

وهذا له ميزة أنه shortcuircuts على المسندات حتى تتمكن من كتابة

(every? (andmap integer? odd?) [1 3 "a string"])

ودون الحصول على استثناء وقت التشغيل كما ستحصل مع <لأ href = "https://stackoverflow.com/questions/1209824/is-there-a-function-similar-to-andmap-in-clojure/1209990# 1209990 "> ارثرز الإجابة .

وهنا هو تعريف andmap:

(defmacro andmap 
  ([]       `(fn [& x#] true))
  ([p & ps] `(fn [& x#] (and (apply ~p x#)
                             (apply (andmap ~@ps) x#)))))

ومن الممكن أيضا لتحديد andmap باعتبارها وظيفة والتي أيضا قصيرة الدوائر على المسندات انها بسبب lazyness:

(defn andmap [& ps]
  (fn [& x]
    (every? true? (map (fn [p] (apply p x)) ps))))

ووالمسندات إلى andmap يمكن اتخاذ عدد التعسفي من الحجج، ولذلك فمن الممكن أن يكتب

(map (andmap #(and (integer? %1)
                   (integer? %2))
             #(and (odd? %1)
                   (even? %2))
             <)
     [1 3 9]
     [2 6 "string"])

والذي يقيم إلى (true true false).

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

وهنا هو المحاولة الأولى:

(defn andmap? [data tests]
  (every? true? (for [d data, f tests]
                  (f d))))

user> (andmap? '(2 4 8) [even? pos?])
true
user> (andmap? '(2 4 8) [even? odd?])
false
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top