Question

Je viens de PÖTTERING à propos avec un excellent Tony Morris exercice sur catamorphisme , quand je réfléchissais à ce qui se passait dans la situation suivante ...

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

Permettez-moi maintenant appeler cette méthode comme suit:

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

Je me demandais si le type inferencer détermine le type de _ => trueto être A => Boolean ou Any => Boolean. En raison du fait que Function1 est contra-variante dans son paramètre d'entrée, à la fois de la compilation suivante très bien:

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

La question est, est-ce le type inferencer venir avec # 1 ou # 2?

Était-ce utile?

La solution

J'ai essayé ceci:


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

et compilé avec cette scalac -Xprint:types. Cela a donné le résultat suivant:


[[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)
  }
}

Alors les regards de celui-ci, le type inferencer est venu avec l'option 1.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top