2011-03-16 13 views
8

मुझे टाइपिंग मामले के साथ स्कैला में एक छोटी सी समस्या है। हास्केल में, मैं यह कर सकता हूँ:स्कैला टाइपिंग: संख्यात्मक प्रकार कैसे सुनिश्चित करें

:

add :: (Num a) => (a,a) -> (a,a) -> (a,a) 

इस तरह, मैं add में किसी भी प्रकार कि एक अंकीय है और समर्थन करता है + आदि मैं एक स्काला वर्ग के लिए एक ही चाहते हैं, इसलिए की तरह फेंक कर सकते हैं

case class NumPair[A <: Numeric](x: A, y: A) 

लेकिन ऐसा लगता है कि यह काम नहीं करता है। लेकिन स्काला डॉक्स के कारण, Numeric[T] है केवल विशेषता है कि इन कार्यों के लिए अनुमति देता है, और लगता है Int द्वारा बढ़ाया जा करने के लिए, Float आदि

किसी भी सुझाव दिए गए?

उत्तर

11
case class NumPair[A](x:A, y:A)(implicit num:Numeric[A]) 

Numeric उदाहरण ही Int, Float, आदि के लिए बढ़ा दी है, लेकिन यह एक अंतर्निहित वस्तु के रूप में प्रदान की जाती है। लंबी व्याख्या के लिए, here देखें।

+0

मुझे यकीन नहीं है कि मुझे 'निहित' होना चाहिए - यदि आप काम को सहेजना चाहते हैं तो वे काफी अच्छे हैं, लेकिन अक्सर वे टाइप अनुमान को अस्पष्ट करके टाइपिंग सिस्टम को नष्ट कर देते हैं। – Lanbo

+1

किस तरह से अस्पष्ट प्रकार अनुमान लगाया जाएगा? - यदि आप चाहें, तो आप 'न्यूमेरिक' उदाहरण को एक स्पष्ट पैरामीटर बना सकते हैं, लेकिन फिर आपको इसे स्पष्ट रूप से पारित करना होगा, जो 'Int', 'Float' आदि जैसे प्रकारों के लिए वास्तव में अनावश्यक है। उदाहरण के साथ, आप इस बात का विकल्प है कि आप इसे स्पष्ट रूप से पास करना चाहते हैं या नहीं। – Madoc

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