Domanda

Stavo pottering circa con Tony Morris' ottimo esercizio sulla catamorphisms , quando stavo riflettendo quello che stava accadendo nella seguente situazione ...

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

Vorrei ora chiamo questo metodo come segue:

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

Mi chiedevo se il tipo inferencer determina il tipo di _ => trueto essere A => Boolean o Any => Boolean. A causa del fatto che Function1 è contra-variante nel suo parametro di ingresso, entrambi seguente compilazione bene:

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

Quindi la domanda è, fa il tipo inferencer venire con 1 o 2 # #?

È stato utile?

Soluzione

ho provato questo fuori:


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

e compilato questo con scalac -Xprint:types. Questo ha dato il seguente risultato:


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

Quindi, gli sguardi di esso, il tipo inferencer si avvicinò con l'opzione # 1.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top