2012-10-04 19 views
10

आप समानता के लिए दो स्कैला फ़ंक्शन मानों की तुलना कैसे कर सकते हैं। उपयोग का मामला यह है कि मेरे पास फ़ंक्शंस की एक सूची है जहां सूची में डुप्लिकेट हो सकते हैं और मैं केवल एक बार प्रत्येक फ़ंक्शन निष्पादित करना चाहता हूं।समानता के लिए स्कैला फ़ंक्शन मानों की तुलना कैसे करें

तो मेरे पास है:

scala> object A { 
    | def a {} 
    | } 
defined module A 

scala> val f1 = A.a _ 
f1:() => Unit = <function0> 

scala> val f2 = A.a _ 
f2:() => Unit = <function0> 

अगर मैं या तो == या eq साथ समारोह तुलना करने की कोशिश, मैं दोनों ही मामलों में false मिल जाएगा:

scala> f1 == f2 
res0: Boolean = false 

scala> f1 eq f2 
res1: Boolean = false 
+10

यह सामान्य रूप से एक अनिश्चित समस्या है। http://en.wikipedia.org/wiki/First-class_function#Equality_of_functions – missingfaktor

उत्तर

15

लघु जवाब: यह संभव नहीं है।

लंबा उत्तर: आपके पास कुछ प्रकार का फ़ंक्शन फैक्ट्री हो सकता है जो सुनिश्चित करता है कि "समान" फ़ंक्शंस एक ही वस्तु है। आपके आवेदन की वास्तुकला के आधार पर, हालांकि यह संभव नहीं हो सकता है।

8

मैं किम के उत्तर पर थोड़ी सी सीमा चाहता हूं और फ़ंक्शन मानों की सीमित तुलनात्मकता को प्राप्त करने का एक उदाहरण देता हूं।

यदि आपके पास अपने कार्य की कुछ प्रकार की वर्णनात्मक परिभाषा है, तो इस विवरण पर समानता की जांच करना संभव है। इस सेटअप है, जहां एक ArthFun अपने वर्ग और सदस्यों द्वारा परिभाषित किया गया है के साथ आप समानता के लिए जाँच कर सकते हैं

sealed trait ArthFun extends (Double => Double) 
case class Mult(x: Double) extends ArthFun {def apply(y: Double) = x * y} 
case class Add(x: Double) extends ArthFun {def apply(y: Double) = x + y} 

, उदाहरण के लिए, आप साधारण अंकगणित कार्यों के एक वर्ग (नहीं एक ऊ वर्ग) निम्नलिखित तरीके से परिभाषित कर सकते हैं ArthFun के मानों की संख्या केवल वस्तु वर्ग द्वारा परिभाषित वस्तु समानता द्वारा टाइप करें।

scala> trait ArthFun extends (Double => Double) 
defined trait ArthFun 

scala> case class Mult(y: Double) extends ArthFun { def apply(x: Double) = x * y; override def toString = "*" + y} 
defined class Mult 

scala> case class Add(y: Double) extends ArthFun { def apply(x: Double) = x + y; override def toString = "+" + y } 
defined class Add 

scala> Seq(Mult(5),Mult(4),Add(4),Add(3),Mult(5)).distinct 
res4: Seq[Product with ArthFun with Serializable] = List(*5.0, *4.0, +4.0, +3.0) 
+0

मुझे यह जवाब पसंद है, लेकिन हर ऑपरेटर के लिए कक्षा को परिभाषित करना पसंद नहीं है। क्या कोई ऐसा प्रकार का मैक्रो जादू है जो ऐसा कर सकता है (यह समानता जैसे विभिन्न सजावट के साथ कक्षा वस्तुओं में अभिव्यक्ति को बदल देता है।) – user48956

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