पैरामीटर के बाहरी प्रकार के एक समारोह के रिटर्न फ़ंक्शन के क्लेराइज़िंग कॉन्ट्रैविरियस नेचर को एक बाहरी कन्ट्रिएन्ट कंटेनर के फंक्शन के रूप में

Nov 23 2020

विकल्प में हमारे पास है

def getOrElse[B >: A](default: => B): B = this match {
        case None => default
        case Some(a) => a
    }
def orElse[B >: A](obj: => Option[B]): Option[B] = this match {
        case None => obj
        case _ => this
    }

या तो हमारे पास है:

def flatMap[EE >: E, B](f: A => Either[EE, B]): Either[EE, B]

मैं समझता हूं कि क्या हो रहा है और क्यों, बल्कि एक विस्तारित उदाहरण यह हो सकता है

ORElse ({विकल्प [B]})। नक्शा {....} यदि B ऐसा है कि A:> B, तो यदि कुछ (a) से आपको कुछ मिलता है (a) .map (f: B =>> ??? ) तो कबूम

आमतौर पर मुझे लगता है कि मैं विचरण के साथ ठीक हूं। मैंने जो नहीं देखा या पता नहीं लगाया, वह यह नहीं है कि सह-प्रसरण और विरोधाभास का सरल उदाहरण क्या उपयोग के मामलों के रूप में व्याख्या करता है, और यहां पुष्टि करना चाहते हैं:

पैरामीटर के रूप में एक फ़ंक्शन का रिटर्न प्रकार बाहरी कंटेनर की प्रसरण स्थिति के लिए जाँच की जाती है।

आमतौर पर उदाहरण होगा

Container[+A] {
  def outerfunction[B](value: A): B
}

फिर हमें समझाया जाता है, क्या नहीं कर सकता, ए। के लिए गर्भ-विचरण स्थिति मैं पूर्ण विवरण के लिए फिर से नहीं करूँगा क्यों। मान लेते हैं कि हम सभी इसे समझते हैं।

आमतौर पर जो समझाया नहीं जाता वह है:

Container[+A] {
      def outerfunction(f: ??? => A): A
    }

यह केवल टाइप ए के पैरामीटर को नहीं ले रहा है, बल्कि ए को वापस लेने वाले किसी भी फ़ंक्शन पैरामीटर को भी ले रहा है। ए कंपाइलर लंबाई की जांच करता है। मुझे आश्चर्य है कि अगर यह यहां रुकता है, या अगर यह कुछ भी है जो कंटेनर के एक फ़ंक्शन के पैरामीटर के रूप में ए का उत्पादन कर सकता है।

जवाब

1 slouc Nov 23 2020 at 22:17

आपकी समझ पूरी तरह से सही है। ईमानदार होने के लिए, मुझे यकीन नहीं है कि वास्तव में सवाल क्या है, लेकिन मैं यह मान लूंगा - कौन से स्थान एक मामले में संकलक की जांच करते हैं:

trait Container[+A] {
  def outerfunction(f: String => A): A
}

और जवाब है - सब के सब।

इसलिए जब कंपाइलर देखता है trait Container[+A], तो यह उसके शरीर की जाँच करेगा कि Containerसभी घटनाओं के लिए A, यह देखने के लिए कि क्या वे इसमें हैं:

  • पैरामीटर स्थिति (जो कंट्रावेरेंट आवश्यकता लाता है)
  • वापसी प्रकार की स्थिति (सहसंयोजक आवश्यकता)
  • दोनों (अपरिवर्तनीय आवश्यकता)
  • न तो (तथाकथित प्रेत विचरण )।

इसके मामले में Container[+A], यह आवश्यकता होगी कि सभी घटनाएं Aसहसंयोजी स्थिति में हों, जिसका अर्थ है कि इसके साथ एक समस्या होगी String => A

यह इतना सरल है। कोई फर्क नहीं पड़ता अगर यह एक "आंतरिक कार्य" या "बाहरी कार्य" है।