2011-06-17 20 views
50

मेरी हास्केल * थोड़ा जंग लगी है, तो मैं कल्पना कर सकते हैं कि मैं स्पष्ट याद कर रहा हूँ:स्काला: "किसी भी" और "सभी" कार्यों

def any[A](s: Traversable[A], f: A => Boolean): Boolean = { 
    s.foldLeft(false)((bool, elem) => bool || f(elem)) 
} 

इन गुणों में से एक है यह लागू होता है?

  1. स्काला libs में कहीं पूर्वनिर्धारित
  2. परिस्थितिजन्य, और तेजी से कुछ एक लाइनर
  3. गलत के रूप में लिखा (मैं इसे परीक्षण नहीं किया था, खेद;))

* वास्तव में एसएमएल, लेकिन यह 99% वही है, लेकिन सूरज के नीचे किसी के द्वारा जाना जाता है।

+5

अगर आपको लगता है हास्केल है 99% एसएमएल, आप या तो अभी तक monads या दर अंतर्निहित सिद्धांतों तरह से वास्तविक कोड लग रहा है और तरह काम करता है की तुलना में जिस तरह से उच्च करने के लिए नहीं मिला है (उदाहरण के लिए आप भी जावा 99% सी मानेंगे ++)। – delnan

+0

हैकेल या एसएमएल इस प्रश्न से संबंधित कैसे हैं (शायद मुझे स्पष्ट याद आ रही है) – OscarRyz

+1

अच्छी तरह से, मान लें कि 99% एसएमएल ** हैस्सेल में ** ** है –

उत्तर

80
  1. यह पूर्वनिर्धारित है और exists कहा जाता है। और forall वह "सब" फ़ंक्शन होगा जिसे आप ढूंढ रहे हैं।

    scala> Vector(3, 4, 5).exists(_ % 2 == 0) 
    res1: Boolean = true 
    
    scala> Vector(3, 4, 5).forall(_ % 2 == 0) 
    res2: Boolean = false 
    
  2. आप के साथ एक break (scala.util.control.Breaks से) एक for पाश का उपयोग कर इसे अधिक performant बना सकते हैं। (exists और forall के मानक पुस्तकालय कार्यान्वयन देखें।)

  3. यह सही है।

+0

लूप के लिए, पारंपरिक कैसे :)। मुझे नहीं पता कि क्या आपने पहले 'अस्तित्व' और 'पहले' लाया है (@ राफलोतोफो का जवाब इसे शामिल करने के लिए संपादित किया गया था)। इस मामले में मुझे कैसे व्यवहार करना चाहिए? दोनों स्वीकार नहीं कर सकते हैं। –

+4

ट्रैवर्सबल लाइक में, मौजूद है संक्षिप्त सर्किट है। – ziggystar

+0

मुझे आश्चर्य है कि 'तर्क' में कोई तर्क नहीं है या नहीं। –

2
  1. नहीं, यह उन नामों के साथ पूर्वनिर्धारित नहीं है। आप ट्रैवर्सबल पैकेज से exists का उपयोग कर सकते हैं।
  2. अपने कार्यान्वयन का सबसे बड़ा नुकसान यह है कि वसीयत आवश्यक अपने traversible, के सभी उपभोग जब, any के लिए, यदि कोई हो सच है, यदि पहले से ही आप अपने जवाब दे सकता है। यह all के लिए जाता है। लेकिन कोई आसानी से इसे कार्यान्वित कर सकता है ताकि यह पूरे अनुक्रम का मूल्यांकन न करे। एक और समाधान इस प्रकार के ऑपरेशन के लिए एक मोनैड को लागू करना होगा। तो फिर तुम कहेंगे:

    a and b and c जो बराबर है a.and(b).and(c) को

  3. यह सही है।

बीटीडब्ल्यू, मुझे लगता है कि एक और समारोह है जो sum फ़ंक्शन है।

+0

धन्यवाद, जैसे ही स्टैकओवरफ्लो मुझे ऐसा करने देता है, मैं इसे स्वीकार करूंगा। जल्दी बाहर निकलने पर संकेत के लिए डबल धन्यवाद। एक विचार यह कैसे सुन्दर तरीके से करना है? –

+0

और 'someTraversable.reduceLeft (_ + _) '' someTraversable.sum' की तुलना में थोड़ा अधिक है, लेकिन मुझे नहीं लगता कि यह एक फ़ंक्शन को परिभाषित करने योग्य है (' किसी भी 'और' all' के विपरीत, जो प्रतीत होता है) काफी लंबा)। ध्यान दें कि मैं * 'sum',' product' और 'scala.Predef' में सामान देखना चाहता हूं, केवल तभी मैं इसे स्वयं परिभाषित नहीं करता अगर यह वहां नहीं है। –

+2

मानक पुस्तकालय में 'sum' फ़ंक्शन है। ('GenTraversableOnce' में रहता है।) – missingfaktor

1

कैसे exists के बारे में:

scala> List(1,2,3).exists(_ > 2) 
res12: Boolean = true 

यह Traversable पर है।

6

तरीके traversable विशेषता जो any और all के बराबर हैं पर मौजूद हैं:

def all[A](xs: Traversable[A], p: A => Boolean): Boolean = xs forall p 

def any[A](xs: Traversable[A], p: A => Boolean): Boolean = xs exists p 
संबंधित मुद्दे