2009-03-27 5 views
14

मैं एक ऐसा फ़ंक्शन लिखना चाहता हूं जो किसी भी स्काला प्रकार पर कुल ऑर्डरिंग के साथ काम करता है (यानी मैं इसे '<' पर उपयोग कर सकता हूं)। इसके लिए वाक्यविन्यास क्या है? सबसे अच्छा मैं के साथ आ गया हैऑर्डर्ड [ए] के किसी भी प्रकार के उप-प्रकार को लेने वाले फ़ंक्शन के लिए स्कैला वाक्यविन्यास क्या है?

def lessThan[T <: Ordered[T]](x: T, Y: T) = x < y 

काम यही कारण है कि यह नहीं है, हालांकि, जब मैं आरईपीएल से इसे आज़माएं:

scala> lessThan(1, 2) 
<console>:8: error: inferred type arguments [Int] do not conform to method lessThan's type parameter bounds [T <: Ordered[T]] 
     lessThan(1, 2) 
    ^

scala> import runtime._ 
import runtime._ 

scala> lessThan(new RichInt(1), new RichInt(2)) 
<console>:8: error: inferred type arguments [scala.runtime.RichInt] do not conform to method lessThan's type parameter bounds [T <: Ordered[T]] 
     lessThan(new RichInt(1), new RichInt(2)) 

अनिवार्य रूप से, मेरा मानना ​​है कि मैं इस के बराबर चाहते हैं हास्केल कोड:

lessThan :: (Ord a) => a -> a -> Bool 
lessThan x y = x < y 

मैं डेबियन सिस्टम पर स्कैला 2.7.3 का उपयोग कर रहा हूं।

मुझे क्या याद आ रही है, और कहां?

उत्तर

24

स्कैला में हास्केल के प्रकार वर्गों के समतुल्य implicits के माध्यम से किया जाता है। वहाँ आप क्या चाहते हैं

पहले ऐसा करने के लिए दो तरीके हैं दृश्य सीमा के साथ है

scala> def lessThan[T <% Ordered[T]](x : T, y : T) = x < y 
lessThan: [T](T,T)(implicit (T) => Ordered[T])Boolean 

scala> lessThan(1,2) 
res0: Boolean = true 

दूसरा एक अंतर्निहित पैरामीटर

scala> def lessThan[T](x : T, y : T)(implicit f : T => Ordered[T]) = x < y  
lessThan: [T](T,T)(implicit (T) => Ordered[T])Boolean 

scala> lessThan(4,3) 
res1: Boolean = false 

पूर्व के साथ है बाद में के लिए वाक्यविन्यास चीनी है। बाद में अधिक लचीलापन की अनुमति देता है।

+0

आपको विधि के पैरामीटर के रूप में स्पष्ट रूप से अंतर्निहित क्यों करना है? यदि स्कैला-रनटाइम जानता है कि टी को ऑर्डर करने के लिए निहित रूप से कैसे परिवर्तित किया जाए [टी] मुझे एक अंतर्निहित पैरामीटर क्यों सूचीबद्ध करने की आवश्यकता है? धन्यवाद! – shj

+2

सबसे पहले, आप किसी भी टी को ऑर्डरर्ड [टी] में परिवर्तित नहीं कर सकते हैं। उदाहरण के लिए, एक ऑर्डरिंग को परिभाषित करें (Int => Int)। दूसरा, जब रूपांतरण संभव हो, रनटाइम को कन्वर्ट करने का तरीका नहीं पता है। इसके बजाए, संकलक जानता है कि रनटाइम पर रूपांतरण करने के लिए फ़ंक्शन कैसे डालें। –

+0

ऐसा लगता है कि पहली विधि को बहिष्कृत किया गया है [एसआई -7629] (https://issues.scala-lang.org/browse/SI-7629) –