यहां एक साधारण प्रजननकर्ता है, जहां मैं एक "कम्यूटिव" जोड़ी प्रकार को परिभाषित करता हूं जो एक निहित रीडरिंग रूपांतरण के साथ आता है। f
फ़ंक्शन करने के लिए तर्क पूर्व-मौजूदा नामित मान (उदाहरण में t
) में लागू होने पर तर्क को संकलक द्वारा लागू किया गया है। हालांकि, अगर मैं f
को सीधे शाब्दिक CommutativePair
पर कॉल करने का प्रयास करता हूं, तो यह एक प्रकार की त्रुटि के साथ विफल रहता है। संकलक उस मामले में अंतर्निहित पुनरीक्षण रूपांतरण लागू नहीं कर रहा है।स्कैला अंतर्निहित रूपांतरण कुछ शर्तों के तहत आवेदन कर रहा है लेकिन अन्य नहीं
object repro {
import scala.language.implicitConversions
case class CommutativePair[A, B](a: A, b: B)
object CommutativePair {
// Support a kind of commutative behavior via an implicit reordering
implicit def reorderPair[B, A](pair: CommutativePair[B, A]) =
CommutativePair(pair.b, pair.a)
}
// The idea is to allow a call to 'f' with Pair[Int, String] as well,
// via implicit reorder.
def f(p: CommutativePair[String, Int]) = p.toString
val t = CommutativePair(3, "c")
// This works: the implicit reordering is applied
val r1 = f(t)
// This fails to compile: the implicit reordering is ignored by the compiler
val r2 = f(CommutativePair(3, "c"))
}
टाइप अनुमान विफल होने लगता है; जब आप CommutativePair में [Int, String] जोड़ते हैं तो यह फिर से संकलित होता है। –
@LodewijkBogaards, सहमत हैं, मैं इसे स्कैला कंपाइलर बग के रूप में रिपोर्ट करने पर विचार कर रहा हूं, लेकिन यह देखने का इंतजार कर रहा हूं कि मुझे किस प्रकार के उत्तर मिलते हैं। – eje
आपको करना चाहिए। मैंने 2.11.7 में अपना कोड चलाया और मुझे एक ही समस्या मिली। हालांकि मैं कल्पना कर सकता हूं कि संकलक को इससे परेशानी हो रही है, इसे काम करना चाहिए। –