मैं यहाँ पेस्ट लार्स Hupel से जवाब (हां, तो सभी क्रेडिट उसे लागू), जो ज्यादातर बताते हैं कि मैं क्या जानना चाहता था:
मैं यहाँ यह एक चाकू देने के लिए जा रहा हूँ। मुझे लगता है कि सुविधा सदस्यों के बारे में बात करते समय सुविधा का उपयोग साफ़ हो जाता है।
मान लें आप निम्नलिखित विशेषता लागू करने के लिए है:
trait Function {
type Out[In]
def apply[In](x: In): Out[In]
}
यह एक (सामान्य) समारोह जहां वापसी प्रकार इनपुट प्रकार पर निर्भर करता होगा। उदाहरण के लिए एक उदाहरण:
val someify = new Function {
type Out[In] = Option[In] def
apply[In](x: In) = Some(x)
}
someify(3) res0: Some[Int] = Some(3)
अभी तक, बहुत अच्छा है। अब, आप निरंतर कार्य को कैसे परिभाषित करेंगे?
val const0 = new Function {
type Out[In] = Int
def apply[In](x: In) = 0
}
const0(3) res1: const0.Out[Int] = 0
(प्रकार const0.Out[Int]
Int
के बराबर है, लेकिन यह कि जिस तरह से मुद्रित नहीं है।)
नोट कैसे प्रकार पैरामीटर In
वास्तव में नहीं किया जाता है। तो, यहाँ कैसे आप इसे _
साथ लिख सकता है: प्रकार पैरामीटर जो वास्तव में करने के लिए भेजा नहीं किया जा सकता के लिए एक नाम के रूप में उस मामले में _
की
val const0 = new Function {
type Out[_] = Int
def apply[In](x: In) = 0
}
Think।यह प्रकार स्तर पर एक समारोह जो पैरामीटर के बारे में परवाह नहीं है के लिए एक है, बस मूल्य स्तर पर की तरह:
(_: Int) => 3 res4: Int => Int = <function1>
छोड़कर ...
type Foo[_, _] = Int
<console>:7: error: _ is already defined as type _
type Foo[_, _] = Int
की तुलना उस के साथ:
(_: Int, _: String) => 3 res6: (Int, String) => Int = <function2>
तो, निष्कर्ष में:
type F[_] = ConstType // when you have to implement a type member def
foo[_](...) // when you have to implement a generic method but don't
// actually refer to the type parameter (occurs very rarely)
आपके द्वारा उल्लिखित मुख्य बात, class A[_]
, पूरी तरह से पर सममित है, सिवाय इसके कि कोई वास्तविक उपयोग केस नहीं है।
trait FlyingDog[F[_]] { def swoosh[A, B](f: A => B, a: F[A]): F[B] }
अब मान आप अपने सादे वर्ष class A
के लिए FlyingDog
का एक उदाहरण बनाना चाहते:
इस पर विचार करें।
घोषित class A[_]
बजाय:
दो समाधान कर रहे हैं। (ऐसा नहीं है।)
एक प्रकार लैम्ब्डा का उपयोग करें:
new FlyingDog[({ type λ[α] = A })#λ]
या यहाँ तक कि
new FlyingDog[({ type λ[_] = A })#λ]
क्या तुम यहाँ मतलब है एक अस्तित्व प्रकार है, जो नहीं है मेरा मतलब था। – sschaef