मैं मजेदार के लिए स्कैला 2.8 के साथ गड़बड़ कर रहा था और pimp को परिभाषित करने की कोशिश कर रहा था जो एक मज़ेदार से दूसरे में कनवर्ट करने की अनुमति देने वाले रचनाकारों को टाइप करने के लिए "as" विधि जोड़ता है (कृपया इस तथ्य को नजरअंदाज करें कि मैं जरूरी नहीं कि यहां मज़दूरों से निपटना पड़े)। तो उदाहरण के लिए, आप इसे इस तरह इस्तेमाल कर सकते हैं:"पैरामीटरयुक्त प्रकार से अस्तित्व में सार नहीं हो सकता है ..."
val array:Array[T]
val list:List[T] = array.as[List]
तो यहाँ
है मैं करने की कोशिश की क्या:
object Test {
abstract class NatTrans[F[_], G[_]] {
def convert[T](f:F[T]):G[T]
}
implicit def array2List:NatTrans[Array, List] = new NatTrans[Array, List] {
def convert[T](a:Array[T]) = a.toList
}
// this next part gets flagged with an error
implicit def naturalTransformations[T, F[_]](f:F[T]) = new {
def as[G[_]](implicit n:NatTrans[F, G]) = n convert f
}
}
तथापि naturalTransformations
की परिभाषा त्रुटि "existentially सार नहीं कर सकते हैं के साथ चिह्नित कर देने पर पैरामीटरकृत प्रकार जी [टी] " पर। इसे ठीक करने के लिए, मैं एक अतिरिक्त वर्ग Transformable
के साथ naturalTransformations
पुनर्लेखन कर सकते हैं ताकि तरह:
class Transformable[T, F[_]](f:F[T]) {
def as[G[_]](implicit n:NatTrans[F, G]) = n convert f
}
implicit def naturalTransformations[T, F[_]](f:F[T]) = new Transformable[T, F](f)
और यह काम करने के लिए प्रकट होता है। लेकिन ऐसा लगता है कि मेरा पहला प्रयास समकक्ष होना चाहिए था, इसलिए मुझे उत्सुकता है कि यह क्यों विफल रहा और त्रुटि संदेश का क्या अर्थ है।
मुझे त्रुटि देखने के लिए उपयोग किया जाता है "संरचनात्मक परिष्करण में पैरामीटर प्रकार समान परिस्थितियों में परिभाषित किए गए एक सार प्रकार को संदर्भित नहीं कर सकता है। यह प्रतिबंध प्रतिबिंब, आईआईआरसी के साथ जेवीएम पर संरचनात्मक प्रकार लागू किए जाने के तरीके से संबंधित है। http://stackoverflow.com/questions/2685804/scala-parameter-type-in-structural-refinement-may-not-refer-to-an-abstract-type – retronym