2016-08-08 9 views
5

मैंने देखा है कि, अगर मैं एक सामान्य समारोह है कि किसी भी प्रकार की एक सूची को स्वीकार करने और एक बूलियन लौट सकते हैं करना चाहते हैं, मैं एक समारोह घोषणा के लिए निम्न सिंटैक्स का उपयोग कर सकते हैं:स्काला प्रकार सिंटेक्स

def someFunction[A](l:List[A]):Boolean 

हालांकि, मैं इस वाक्य रचना के साथ एक बराबर समारोह घोषणा के रूप में अच्छी तरह से प्राप्त कर सकते हैं:

def someFunction(l:List[_]):Boolean 

बाद वाक्य रचना मेरे लिए समझ में आता है; अंडरस्कोर किसी भी प्रकार की सूची के लिए वाइल्डकार्ड इंगित करता है। हालांकि पूर्व उलझन में है; दो प्रकार के वाक्यविन्यास के बीच अर्थपूर्ण अंतर क्या है, यदि कोई भी है तो? नोट: मैंने देखा कि मैं पहले वाक्यविन्यास उदाहरण में "[ए]" के स्थान पर [बी] या [सी] या यहां तक ​​कि [%] का उपयोग कर सकता हूं।

उत्तर

6

A एक "प्रकार पैरामीटर" है। एक मान पैरामीटर की तरह, जैसे कि l पास पैरामीटर, यह कुछ प्रकार के लिए "नाम" या प्लेस धारक है, जो अलग-अलग समय पर भिन्न हो सकता है (यानी विधि के विभिन्न आमंत्रणों के साथ)।

अपने उदाहरण में A अप्रयुक्त तो, हाँ, _ का उपयोग कर अधिक समझ में आता है और स्पष्ट है, लेकिन यदि आप सूची में से एक तत्व वापस आना था तो विधि वापसी प्रकार होगा A (या जो भी नाम आप करना चाहते हैं उस पैरामीटर दें)। रिटर्न प्रकार के रूप में _ का उपयोग करने से कोई मतलब नहीं होगा।

1

List[_] एक अनजान existential type और List[X] forSome {type X <: Any} (जो जावा में List<?> की तरह है) के लिए शॉर्टेंड है।

इस मामले में, मुझे लगता है कि फ़ंक्शन प्रकार (स्कैला सिंटैक्स में नहीं) forall A. List[A] -> Boolean और (exists A. List[A]) -> Boolean समान चीजों को इंगित करते हैं, क्योंकि दोनों स्थितियों में आप केवल सूची के "आकार" का निरीक्षण कर सकते हैं; शायद उन प्रकारों के बीच एक समानता है।

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