Scala Language
टाइप-स्तरीय प्रोग्रामिंग
खोज…
टाइप-स्तरीय प्रोग्रामिंग का परिचय
यदि हम एक विषम सूची पर विचार करते हैं, जिसमें सूची के तत्वों के विविध लेकिन ज्ञात प्रकार होते हैं, तो तत्वों के प्रकार की जानकारी को समाप्त किए बिना सामूहिक रूप से सूची के तत्वों पर संचालन करने में सक्षम होना वांछनीय हो सकता है। निम्न उदाहरण एक साधारण विषम सूची में एक मानचित्रण ऑपरेशन को लागू करता है।
क्योंकि तत्व प्रकार भिन्न होता है, संचालन हम प्रदर्शन कर सकते हैं के वर्ग, प्रकार प्रक्षेपण के कुछ फार्म के लिए प्रतिबंधित है तो हम एक विशेषता को परिभाषित Projection
सार होने type Apply[A]
प्रक्षेपण का परिणाम प्रकार कंप्यूटिंग, और def apply[A](a: A): Apply[A]
प्रक्षेपण के परिणाम मूल्य की गणना।
trait Projection {
type Apply[A] // <: Any
def apply[A](a: A): Apply[A]
}
लागू करने के type Apply[A]
हम टाइप स्तर पर प्रोग्रामिंग कर रहे हैं (मूल्य स्तर के विपरीत)।
हमारी विषम सूची प्रकार वांछित प्रक्षेपण के साथ-साथ प्रक्षेपण के प्रकार द्वारा एक map
संचालन को परिभाषित करता है। मानचित्र संचालन का परिणाम सार है, वर्ग और प्रक्षेपण को लागू करने से भिन्न होगा, और स्वाभाविक रूप से अभी भी एक HList
होना चाहिए:
sealed trait HList {
type Map[P <: Projection] <: HList
def map[P <: Projection](p: P): Map[P]
}
HNil
के मामले में, खाली HNil
सूची, किसी भी प्रक्षेपण का परिणाम हमेशा स्वयं ही होगा। यहाँ हम घोषित trait HNil
एक सुविधा है, ताकि हम लिख सकते हैं के रूप में HNil
के एवज में एक प्रकार के रूप HNil.type
:
sealed trait HNil extends HList
case object HNil extends HNil {
type Map[P <: Projection] = HNil
def map[P <: Projection](p: P): Map[P] = HNil
}
HCons
गैर-खाली HCons
सूची है। यहाँ हम यह कहते हैं कि मानचित्र संचालन को लागू करते समय, परिणामी सिर प्रकार वह होता है, जो प्रक्षेपण के अनुप्रयोग से लेकर सिर के मूल्य ( P#Apply[H]
) तक होता है, और परिणामी पूंछ का प्रकार वह होता है, जिसका परिणाम मैपिंग से होता है पूंछ पर प्रक्षेपण ( T#Map[P]
), जिसे HList
जाना जाता है:
case class HCons[H, T <: HList](head: H, tail: T) extends HList {
type Map[P <: Projection] = HCons[P#Apply[H], T#Map[P]]
def map[P <: Projection](p: P): Map[P] = HCons(p.apply(head), tail.map(p))
}
सबसे स्पष्ट इस तरह के प्रक्षेपण में रैपिंग ऑपरेशन के कुछ प्रकार का प्रदर्शन करना है - निम्नलिखित उदाहरण से HCons[Option[String], HCons[Option[Int], HNil]]
का एक उदाहरण प्राप्त HCons[Option[String], HCons[Option[Int], HNil]]
:
HCons("1", HCons(2, HNil)).map(new Projection {
type Apply[A] = Option[A]
def apply[A](a: A): Apply[A] = Some(a)
})