मुझे स्कैला में टाइपक्लास के साथ कुछ समस्याएं आ रही हैं और एक टाइपक्लास उदाहरण नहीं मिलने पर संकलन समय में त्रुटियों के साथ ठीक है। आइए मान लें कि मेरे पास टाइपक्लास TC
और ऑब्जेक्ट B[C]
है जिसमें TC
का उदाहरण है, केवल C
में TC
का उदाहरण है। स्कैला में इसे implicit def btc[C](implicit ctc: TC[C]) = new TC[B[C]] { ... }
लिखा जा सकता है। जब आपको C
के लिए TC[B[C]]
की आवश्यकता होती है जिसके लिए स्केलैक को TC[C]
कोई उदाहरण नहीं मिल रहा है, तो स्केलैक यह कहने में त्रुटि देगा कि उसे TC[B[C]]
नहीं मिल रहा है। हालांकि यह सच है, त्रुटि संदेश में कारण है कि स्केलैक TC[B[C]]
नहीं ढूंढ सकता है, यह है कि यह TC[C]
नहीं ढूंढ सकता है।स्कैला के निहित नॉटफॉउंड एनोटेशन को अधिक सटीक बनाएं
समस्या समझने के लिए, मैं एक छोटे से खिलौना उदाहरण है जहाँ TC
PrettyPrintable
है बनाने का फैसला किया, C
Unit
है और B
Option
है:
import scala.annotation.implicitNotFound
@implicitNotFound("Cannot pretty print instances of the type ${T}")
trait PrettyPrintable[T] {
def prettyPrint(t: T): String
}
object PrettyPrintable {
def apply[T](implicit pp: PrettyPrintable[T]): PrettyPrintable[T] = pp
implicit def optPP[T](implicit opp: PrettyPrintable[T]) = new PrettyPrintable[Option[T]] {
override def prettyPrint(ot: Option[T]): String = ot.fold("")(opp.prettyPrint)
}
}
object Main extends App {
println(PrettyPrintable[Option[Unit]].prettyPrint(None)) // error
}
अगर मैं आवेदन चलाने के लिए, मैं त्रुटि मिलती है:
[error] /home/rief/prog/scala/implicitNotFoundTest/Main.scala:24: Cannot pretty print instances of the type Option[Unit]
[error] println(PrettyPrintable[Option[Unit]].prettyPrint(None))
यह निश्चित रूप से सच है: स्केलैक Option[Unit]
प्रकार के लिए एक सुंदर प्रिंट उदाहरण नहीं ढूंढ सकता है। समस्या यह है कि त्रुटि स्वयं बहुत उपयोगी नहीं है क्योंकि बिंदु यह नहीं है कि स्केलेक को टाइप क्लास का उदाहरण नहीं मिल रहा है, लेकिन इसे और क्यों नहीं मिल रहा है। इस मामले में, Option[Unit]
का एक सुंदर प्रिंट उदाहरण नहीं है क्योंकि Unit
में एक सुंदर प्रिंट उदाहरण नहीं है लेकिन अधिक जटिल मामलों के लिए यह एक दुःस्वप्न हो सकता है।
मेरा प्रश्न है: क्या अंतर्निहित त्रुटियों को त्रुटियों को और सटीक नहीं पाया जा सकता है?
यह एक अच्छा है। मैंने एक बार विचार किया था कि एनोटेशन स्ट्रिंग के लिए एक इंटरपोलेटर को किस संदर्भ में उजागर करना है, लेकिन मैंने स्पष्ट खोज इतिहास के बारे में सोचा नहीं था। https://issues.scala-lang.org/browse/SI-7411 –