this question की पंक्तियों के साथ की सबसे बड़ी आम उप-प्रकार का पता लगाएं, मैं दो प्रकार के सबसे बड़ा आम उप प्रकार अनुमान लगाने के लिए ए और बीदो स्काला प्रकार
"एक तरह स्काला संकलक पाने के लिए एक रास्ता खोजने के लिए कोशिश कर रहा हूँ बी ", जहां परिभाषा है बिना:
(A without B = C) === (A = C with B)
या एक प्रकार समारोह है कि सी, रिटर्न जहां:
संपादित करें:
A <: C && C <:!< B
यानी। ए सी और सी का उप प्रकार बी
वास्तव में मुझे उम्मीद है कि यह "सबसे बड़ा आम उप प्रकार" जैसा नहीं होगा, क्योंकि मुझे वास्तव में A <: B
की आवश्यकता नहीं है।
उपयोग:
trait Syntax
trait ANYSYNTAX extends Syntax
trait NUMERIC extends ANYSYNTAX
trait DISCRETE extends ANYSYNTAX
trait POSITIVE extends ANYSYNTAX
trait CONST extends ANYSYNTAX
type NUMCONST = NUMERIC with CONST
type POSCONST = POSITIVE with CONST
type ORDINALCONST = DISCRETE with CONST
type INTEGER = NUMERIC with DISCRETE
type POSNUM = POSITIVE with NUMERIC
type POSINT = POSNUM with INTEGER
type INTCONST = INTEGER with NUMCONST with ORDINALCONST
type POSNUMCONST = POSNUM with POSCONST with NUMCONST
type POSINTCONST = POSNUMCONST with INTCONST with POSINT
तब मैं, इस प्रकार प्रकार की कमी का प्रचार करने में सक्षम होना चाहते हैं:
abstract class Expression[+R](val args: Expression[_]*)
case class Add[A <: R, R <: NUMERIC](arg1: Expression[A], arg2: Expression[A]) extends Expression[R] {
case class Subtract[A <: R, R : A without POSITIVE](arg1: Expression[A], arg2: Expression[A]) extends Expression[R] {
case class Multiply[A <: R, R <: NUMERIC](arg1: Expression[A], arg2: Expression[A]) extends Expression[R]{
case class Divide[A <: R, R : A without DISCRETE](arg1: Expression[A], arg2: Expression[A]) extends Expression[R] {
मैं उधार कुछ प्रकार की कमी का उपयोग कर कुछ के साथ आने की कोशिश कर रहा है अन्य एसओ उत्तरों से:
sealed class =!=[A,B]
trait LowerPriorityImplicits {
implicit def equal[A]: =!=[A, A] = sys.error("should not be called")
}
object =!= extends LowerPriorityImplicits {
implicit def nequal[A,B](implicit same: A =:= B = null): =!=[A,B] =
if (same != null) sys.error("should not be called explicitly with same type")
else new =!=[A,B]
}
// Encoding for "A is not a subtype of B"
trait <:!<[A, B]
// Uses ambiguity to rule out the cases we're trying to exclude
implicit def nsub[A, B] : A <:!< B = null
implicit def nsubAmbig1[A, B >: A] : A <:!< B = null
implicit def nsubAmbig2[A, B >: A] : A <:!< B = null
मेरे पास कुछ परीक्षण मामले हैं:
implicitly[POSINT <:!< CONST]
implicitly[POSITIVE <:!< OPINION]
implicitly[DOGMA <:!< CONST]
implicitly[POSINTCONST <:< POSITIVE with CONST]
implicitly[POSINTCONST <:< POSCONST]
implicitly[POSITIVE with CONST <:!< POSINTCONST]
implicitly[POSITIVE =:= POSCONST without CONST]
implicitly[NUMERIC =:= INTEGER without DISCRETE]
implicitly[POSINT =:= POSINTCONST without CONST]
ये असफल चाहिए:
implicitly[POSINT =:= POSINTCONST without OPINION]
implicitly[POSINT with OPINION =!= POSINTCONST without OPINION]
मुझे यकीन नहीं है कि मैं आपकी परिभाषा को समझता हूं। ऐसा लगता है कि 'ए <: बी', फिर' सी' मौजूद नहीं है, और अन्यथा 'सी' केवल 'ए' है। –
@TravisBrown उदाहरण के लिए, 'सी: पॉजिंट', 'बी: कॉन्स्ट'। फिर 'ए: सी बी के साथ = POSINTCONST। मेरी पहली परिभाषा के अनुसार, 'POSINTCONST बिना CONST =: = POSINT'। यदि दूसरी ओर 'ए <:! <बी', उदाहरण के लिए। 'NUMCONST बिना सकारात्मक 'तो मैं कहूंगा कि' सी: NUMCONST' जैसा कि आप कहते हैं। – RealName
असल में @ ट्रेविस मैंने अपनी दूसरी परिभाषा में एक त्रुटि की है (अब मुझे उम्मीद है)। – RealName