खोज…


टाइप-स्तरीय प्रोग्रामिंग का परिचय

यदि हम एक विषम सूची पर विचार करते हैं, जिसमें सूची के तत्वों के विविध लेकिन ज्ञात प्रकार होते हैं, तो तत्वों के प्रकार की जानकारी को समाप्त किए बिना सामूहिक रूप से सूची के तत्वों पर संचालन करने में सक्षम होना वांछनीय हो सकता है। निम्न उदाहरण एक साधारण विषम सूची में एक मानचित्रण ऑपरेशन को लागू करता है।

क्योंकि तत्व प्रकार भिन्न होता है, संचालन हम प्रदर्शन कर सकते हैं के वर्ग, प्रकार प्रक्षेपण के कुछ फार्म के लिए प्रतिबंधित है तो हम एक विशेषता को परिभाषित 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)
})


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow