2011-10-03 22 views
6

यदि मेरे पास 5 * 5.0 जैसे कोड हैं तो परिणाम सबसे सटीक प्रकार, Double में परिवर्तित हो जाता है।वैल्यू [टी: न्यूमेरिक] "अनबॉक्स किए गए" समकक्षों की तरह अधिक "लचीला" का उपयोग करके कोड कैसे बनाएं?

लेकिन इस तरह

case class Value[T : Numeric](value: T) { 
    type This = Value[T] 
    def +(m: This) = Value[T](implicitly[Numeric[T]].plus(value, m.value)) 
    ... 
} 

implicit def numToValue[T : Numeric](v: T) = Value[T](v) 

कोड के साथ काम नहीं लगता है वहाँ someIntValue + double काम तरह बातें करने के लिए एक रास्ता है, जहां someIntValueValue[Int] और doubleDouble है?

पीएस: बहुत कम से कम सही शीर्षक के लिए खेद है। मैं बेहतर शब्दों के लिए सुझाव के लिए आभारी हूँ ...

+1

http://stackoverflow.com/questions/3088979/how-to-set-up-implicit-conversion-to-allow-arithmetic-between-numeric-types भी उपयोगी हो सकता है। –

उत्तर

5

आप बनाने निहित ऑपरेटरों द्वारा (busywork का एक बहुत के साथ) कर सकते हैं:

abstract class Arith[A,B,C] { 
    def +(a: A, b: B): C 
    def -(a: A, b: B): C 
    def *(a: A, b: B): C 
    def /(a: A, b: B): C 
} 
implicit object ArithIntLong extends Arith[Int,Long,Long] { 
    def +(a: Int, b: Long) = a+b 
    def -(a: Int, b: Long) = a-b 
    def *(a: Int, b: Long) = a*b 
    def /(a: Int, b: Long) = a/b 
} 
... 
def f[A,B,C](a: A, b: B)(implicit arith: Arith[A,B,C]) = arith.*(a,b) 


scala> f(5,10L) 
res46: Long = 50 

लेकिन तुम सच में के बाद से है कि अधिक से अधिक करने के लिए, है आपको अकेले ए और बी के लिए संख्यात्मक समकक्ष की आवश्यकता है, और असममित परिचालनों को दोनों तरीकों से परिभाषित करने की आवश्यकता है। और यह वास्तव में व्यावहारिक नहीं है कि तीन प्रकार शामिल हैं।

+0

एमएचएच .... क्या यह वास्तव में असामान्य समस्या है कि कोई बेहतर समाधान नहीं है? इस समाधान के साथ एक और बड़ी समस्या यह है कि हम वास्तव में 'संख्यात्मक [टी]' के अनुरूप सभी प्रकारों (और इसलिए कवर) नहीं जानते हैं। – soc

+1

@soc - यह वास्तव में बुरा है। समस्या यह है कि 'न्यूमेरिक' तीन प्रकार के सापेक्ष परिशुद्धता को बताने का कोई तरीका नहीं प्रदान करता है। आप 'एथ 'या' बी' से 'सी' तक कनवर्टर' एरिथ 'बना सकते हैं, और उसके बाद' सी'' न्यूमेरिक 'हो सकता है, और अपने सभी गणित को' सी 'के रूप में कर सकते हैं। इससे बॉयलरप्लेट कम हो जाएगा, लेकिन आपको अभी भी निहित कन्वर्टर्स लिखना होगा। –