inférence de type scala avec _ support place
-
28-09-2019 - |
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
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
où 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.)