मुझे लगता है कि दाऊद Soergel के विवरण अनिवार्य रूप से सही है: यदि प्रकार T
स्ट्रिंग के लिए एक अंतर्निहित रूपांतरण तो है val bar = foo(3, _:T)
है वैध, प्रकार T => Int
, जो String => Int
से संबंधित नहीं है के एक समारोह दे रही है।
क्यों संकलक एक समझदार धारणा (स्पष्ट टाइपिंग की अनुपस्थिति में) नहीं बनाता है कि वास्तव में विधि विधि (जो आपके प्रश्न का सार है) जैसा ही है, मुझे नहीं पता - मैं केवल अनुमान लगा सकता हूं क्योंकि यह भाषा की कल्पना को जटिल करेगा।
जहां कोई प्रकार निर्दिष्ट कर रहे हैं, अर्थात val bar = foo(_, _)
, यह संकलक यह व्याख्या के रूप में सरल ईटा-रूपांतरण, val bar = foo _
के रूप में ही है, जो एक String => Int
देता है लगता है।
मेरे पसंदीदा मुहावरा बाएं हाथ की ओर समारोह प्रकार है, जो आप की अनुमति देता है को लाभ मिलता है देने के लिए किया जाएगा आसानी से bar
के प्रकार को देखने के लिए:
val bar: String => Int = foo(3, _)
आप फिर से एलर्जी हो, तो String
शब्द टाइप करके, आप
val bar = (foo _).curried(3)
स्रोत
2011-12-18 06:23:13
नाम सुधार के लिए धन्यवाद लिख सकते हैं। लेकिन 'def foo (num: int) = 1; वैल बार = foo (_) 'ठीक संकलित करता है। इसलिए मुझे नहीं लगता कि विरासत या निहित रूपांतरण त्रुटियों का कारण बनते हैं। – xiefei
हू - क्षमा करें, आगे प्रतिबिंब पर implicits के बारे में मेरा तर्क वैसे भी कोई मतलब नहीं है। कंपाइलर वास्तव में स्ट्रिंग होने के लिए बार तर्क के प्रकार का अनुमान लगा सकता है, और उसके बाद सामान्य रूप से बार को कॉल करते समय implicits को अनुमति देता है। –