Scala méthode la carte de la syntaxe
Le code ci-dessous à partir de http://www.scalaclass.com/book/export/html/1 à faire de la matrice de produit scalaire.
Je ne comprends pas la syntaxe entre les accolades.
- Pourquoi les accolades utilisés, et non pas la méthode des parenthèses?
- Est t une méthode anonyme?
- Qu'est-ce que ._1 et ._2?
Grâce.
type Row = List[Double]
type Matrix = List[Row]
def dotProd(v1:Row, v2:Row) =
v1.zip(v2).map{ t:(Double, Double) => t._1 * t._2 }.reduceLeft(_ + _)
OriginalL'auteur Nabegh | 2012-05-03
Vous devez vous connecter pour publier un commentaire.
Certaines personnes préfèrent utiliser d'accolades, lorsque le paramètre est une fonction anonyme. Pour une chose, les accolades activer le filtrage des fonctions anonymes, alors que les parenthèses ne sont pas. Dans cet exemple particulier, il n'y a pas besoin d'accolades.
Voici un exemple où les accolades sont obligatoires (à cause de la
case
pattern matching):Noter que la fonction ci-dessus accomplit la même chose que celui de la question, de manière un peu différente.
t
une méthode anonyme?Non, c'est un paramètre. Tout comme
v1
etv2
sont des paramètres pourdotProd
,t
est un paramètre de la fonction anonyme, d'être passée àmap
.._1
et._2
?Méthodes sur
t
. Le paramètret
a été défini comme étant un n-uplet (plus précisément,Tuple2[Double, Double]
, qui peut être écrit comme(Double, Double)
), et les tuples vous permettent d'extraire chaque membre de la n-uplet avec des méthodes telles que:_1
,_2
,_3
, etc.Un
Tuple2
seulement a_1
et_2
, bien sûr. Notez que le premier paramètre est_1
, pas_0
, en raison de l'influence d'autres langages fonctionnels.De toute façon, le
zip
méthode de convertirRow
(List[Double]
) dans unList[(Double, Double)]
. La méthodemap
prend une fonction qui convertit les éléments de la liste (qui sont(Double, Double)
tuples) en quelque chose d'autre.._1
et._2
vraiment des méthodes deTuple2
? Je les connaissais pour être des champs (comme dansTupleN
auraN
champs de_1
à_N
, chacune étant d'un certain typeTi
.Bien sûr, ils sont des méthodes. Scala accès à quasiment tous les domaines grâce à des méthodes, à moins qu'ils ne soient déclarés
private [this]
.Oups. Vous avez absolument raison. Transparent, les propriétés ont tendance à confondre les gens explicite accesseurs/mutateurs en Java, comme moi :P. Merci de me le rappeler encore une fois, si...
OriginalL'auteur Daniel C. Sobral
Dans ce cas particulier, les accolades ont aucun avantage par rapport à la plaine de l'ancienne syntaxe, mais en général, la douce chose au sujet de l'aide d'accolades, c'est qu'ils vous permettent d'écrire la correspondance de motif expressions à l'intérieur de
map ...
:donc je peut réécrire cette
dans ce
mais ce ne sera pas compiler:
._1, ._2 permet d'accéder à la première, deuxième, ... N élément de N-tuple, Lee a dit.
OriginalL'auteur om-nom-nom
Vous pouvez trouver une très bonne réponse à la différences entre accolades {} et les parenthèses () dans cette question: Quelle est la différence formelle en Scala entre les accolades et les parenthèses, et quand doivent-elles être utilisées?
Pour la _1, _2, voir Sens de l'_2 signe dans le langage scala.
Et oui,
t:(Double, Double) => t._1 * t._2
est une fonction anonyme (pas une méthode réellement). La différence entre la méthode et la fonction de Scalat
est un paramètre, pas une fonction anonyme.Oui, bien sûr, vous avez raison, je veux dire l'ensemble de la construction est une fonction anonyme.
OriginalL'auteur Matthew Farwell
Les accolades indiquent une fonction anonyme qui a le type
Tuple2[Double,Double] => Double
. L'argument est donné le nom localt
, donct
est un tuple de deux lits doubles.t._1
désigne le premier élément ett._2
la seconde.Donc
map
donne une liste de l'élément-sage des produits des composantes des deux vecteurs, etreduceLeft
sommes de ces produits afin de calculer le produit scalaire.List(1,2,3).map(x => x + 1)
dans ce cas, il n'y a pas de différence.
OriginalL'auteur Lee