Question

List("This","is","Scala").foreach(a => print(a+" "))

compiles bien, mais

List("This","is","Scala").foreach(print(_+" "))

échoue se plaignant de type de paramètre manquant. Je ne pouvais pas comprendre pourquoi il échoue.

EDIT:. Je voulais dire imprime pas println - pas que cela fait la différence logique

Était-ce utile?

La solution

Le problème est que ce

List("This","is","Scala").foreach(print(_+" "))

ne correspond pas à

List("This","is","Scala").foreach(a => print(a+" "))

mais

List("This","is","Scala").foreach(print(a => a+" "))

Maintenant, nous allons voir la signature de type de foreach:

def foreach [B] (f: (A) ⇒ B) : Unit

A est le paramètre de type de la List lui-même. Puisque nous avons un List[String], le compilateur sait que l'on doit passer à un foreach Function[String, B].

Dans a => print(a+" ") le type de a est déjà connu alors. String

En print(a => a+" ") il y a un problème, comme print est pas un Function. Cependant, le compilateur n'a pas considéré que encore - il essaie toujours de compiler a => a+" ". Alors le regard de laisser au type de Predef.print:

def print (x: Any) : Unit

a => a+" " doit être de type Any, qui, bien sûr, signifie qu'il peut être quelque chose. Il ne permet pas le compilateur à affirmer ce que le type de a est. Ce qui ne compte pas vraiment, parce que vous ne vouliez pas imprimer un Function en premier lieu.

Autres conseils

Scala se lit comme (_+" ") x => x+" ". Mais println ne contient aucune information de type pour aider l'estimation du compilateur quel type x peut-être, il donne cette erreur.

Qu'est-ce que vous vouliez faire était avis que println n'a pas fonctionné et en arrière recurse et essayer à nouveau pour foreach. Mais il ne peut pas le faire. println peut prendre un argument, y compris une fonction, donc x => x+" " est une chose parfaitement valable pour println d'essayer d'imprimer

(Et même dans le cas où il pourrait en backtrack la théorie, il ne généralement pas.)

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