سؤال الاستدلال نوع سكالا
-
04-10-2019 - |
سؤال
كنت مجرد تخويف مع تمرين توني موريس الممتاز على كاتارفامورفيس, ، عندما كنت أفكر في ما كان يحدث في الموقف التالي ...
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.
لا تنتمي إلى StackOverflow