سؤال

كنت مجرد تخويف مع تمرين توني موريس الممتاز على كاتارفامورفيس, ، عندما كنت أفكر في ما كان يحدث في الموقف التالي ...

def cata[X](some: A => X, none: => X): X

اسمحوا لي الآن أن أسمي هذه الطريقة على النحو التالي:

def isDefined: Boolean = cata( _ => true, false)

كنت أتساءل ما إذا كان النوع الاستدلال يحدد نوع _ => trueأن تكون A => Boolean أو Any => Boolean. يرجع ذلك إلى حقيقة أن Function1 هو المتغير المتغير في معلمة الإدخال الخاصة به ، كلا التجميع التالي على ما يرام:

def isDefined: Boolean = cata( (_: A) => true, false)    //#1
def isDefined: Boolean = cata( (_: Any) => true, false)  //#2

لذا فإن السؤال هو ، هل يظهر نوع الاستدلال إلى رقم 1 أو رقم 2؟

هل كانت مفيدة؟

المحلول

جربت هذا:


trait MyOption[+A] {
   def cata[X](some: A => X, none: => X): X
   def isDefined: Boolean = cata( _ => true, false)
}

وجمع هذا مع scalac -Xprint:types. هذا أعطى الإخراج التالي:


[[syntax trees at end of typer]]// Scala source: myoption.scala
package  {
  abstract trait MyOption[A >: Nothing : Nothing  X, none: => X): X;
    def isDefined: Boolean = MyOption.this.cata[Boolean](((x$1: A) => true), false)
  }
}

لذا ، من خلال مظهره ، توصل النوع الاستدلالي إلى الخيار رقم 1.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top