2014-10-04 7 views
6

विभिन्न Lisps में, यह मुझे के रूप में यदि वे सिर्फ सामान्य मूल्यों गया था कार्यों का एक दृश्य बनाने के लिए संभव है:स्कैला में एक ही धर्मार्थ के कार्यों की सूची को परिभाषित करने के लिए कैसे?

(def ops [+ - * /]) 

कौन सा मैं तो के माध्यम से पुनरावृति कर सकते हैं, फिर से, के रूप में यदि वे सिर्फ सामान्य मूल्यों थे :

(doseq [op ops] // (doseq (op ops) is like for (op <- ops) in scala 
    (println (op 1 2 3 4))) 

अब, मैं स्काला में कुछ बातें की कोशिश की है, उन सभी को नाकाम रहने:

scala> List(+, -, *, /) 
<console>:1: error: illegal start of simple expression 
     List(+, -, *, /) 
      ^

scala> List[Double => Double](+, -, *, /) 
<console>:1: error: illegal start of simple expression 
     List[Double => Double](+, -, *, /) 
          ^

scala> List[Double => Double](+_, -_, *_, /_) 
<console>:8: error: not found: value * 
       List[Double => Double](+_, -_, *_, /_) 
              ^
<console>:8: error: not found: value/
       List[Double => Double](+_, -_, *_, /_) 
               ^

तो सूची निर्धारित की सही प्रक्रिया क्या है स्कैला में कार्यों/ऑपरेटरों का?

+0

नीचे अच्छा जवाब नहीं है, लेकिन, जैसा कि आप देख सकते हैं, आप केवल * एक ही टाइप * कार्यों इस तरह से परिभाषित कर सकते हैं: प्रदान की ype), तो आपको अच्छा अंडरस्कोर सिंटैक्स का उपयोग कर सकते हैं। यदि आप अलग-अलग टाइप किए गए कार्यों को स्टोर करना चाहते हैं तो आपको * विषम * संरचनाओं (उदाहरण के लिए सूची) का उपयोग करना होगा। – DaunnC

+0

@DaunnC क्या आप सवाल के दूसरे जवाब में * विविध विषम संरचनाओं * के उपयोग पर विस्तार से ध्यान देंगे? में सहारना करता। –

उत्तर

11

समस्या यह है कि ये फ़ंक्शन बाइनरी ऑपरेटर हैं, यानी, वे दो ऑपरेंड लेते हैं और एक को वापस लेते हैं। तो अगर आप का उपयोग करने के:

List[(Double, Double) => Double](_ + _, _ - _, _ * _, _/_) 
1

स्काला में, सबसे अधिक मूल्य स्तर के ऑपरेटरों वास्तव में कर रहे एकल उदाहरण तरीकों (शायद सब यकीन है कि अगर वहाँ counterexmaples हैं, नहीं)। तो जब आप बात करते हैं, तो कहें, Double के दो मानों के अतिरिक्त, आप वास्तव में पहले मान के a method का जिक्र कर रहे हैं जो पैरामीटर के रूप में दूसरा मान लेता है। परिचित इंफिक्स ऑपरेटर सिंटैक्स is just sugar

scala> 5.7.+(6.3) 
res1: Double = 12.0 

As @bluenote10 already mentioned, आप गुमनाम समारोह है कि दोनों पहले उदाहरण और मानकों और रिटर्न के रूप में अपनी संकार्य ले बनाने के द्वारा इन ऑपरेटरों पर कब्जा कर सकते हैं: दूसरे शब्दों में,

scala> 5.7 + 6.3 
res0: Double = 12.0 

वास्तव में के लिए सिर्फ एक अच्छा आशुलिपि है + विधि का परिणाम:

scala> (lhs: Double, rhs: Double) => lhs + rhs 
res2: (Double, Double) => Double = <function2> 

या @ bluenote10 के उदाहरण के रूप में, प्रकार टी के साथ सूची में अनुमान लगाया जा सकता है, तो (जैसे

scala> val doublePlus: (Double, Double) => Double = _ + _ 
doublePlus: (Double, Double) => Double = <function2> 
संबंधित मुद्दे

 संबंधित मुद्दे