(1, 2, 3, 4, 5, 6)
est un 6 tuple valeur, qui n'a pas le foldRight
, mais Array(1, 2, 3, 4, 5, 6)
fait.
ArrayLike
est un trait avec le sous-classement des séquences indexées accès élément efficace, ce qui signifie qu'il a certaines méthodes optimisées, y compris par exemple foldRight
. Chaque tableau est implicitement converti en une sous-classe du trait ArrayLike
. De tronc Scala:
@tailrec
private def foldr[B](start: Int, end: Int, z: B, op: (A, B) => B): B =
if (start == end) z
else foldr(start, end - 1, op(this(end - 1), z), op)
bytecode:
private static java.lang.Object foldr(scala.collection.IndexedSeqOptimized, int, int, java.lang.Object, scala.Function2);
...
Code:
Stack=6, Locals=6, Args_size=5
0: iload_1
1: iload_2
2: if_icmpne 7
5: aload_3
6: areturn
7: aload_0
8: iload_2
9: iconst_1
10: isub
11: aload 4
13: aload_0
14: iload_2
15: iconst_1
16: isub
17: invokeinterface #21, 2; //InterfaceMethod scala/collection/SeqLike.apply:(I)Ljava/lang/Object;
22: aload_3
23: invokeinterface #72, 3; //InterfaceMethod scala/Function2.apply:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
28: astore_3
29: istore_2
30: astore_0
31: goto 0
LineNumberTable:
line 68: 0
line 67: 6
line 69: 7
EDIT: La méthode bytecode est itérative, ce qui signifie que le compilateur doit avoir appliqué une optimisation d'appel de la queue.
Sans accès élément efficace (soit une méthode apply
efficace) le meilleur peut faire est génériquement en utilisant itérateurs et une fonction récursive non-queue pour mettre en œuvre foldRight
, ou inverser la collection en construisant un nouveau et faire une foldLeft
sur ce (Ce dernier est fait, actuellement). Dans le cas de toutes les séquences avec un accès aléatoire efficace, ce comportement est surchargé et optimisé.
http://www.scala-lang.org/node/5945 –
'foldRight' et' reduceRight' sont en fait récursifs pour Array. Il est fondamentalement converti en un 'foldLeft' où l'indice varie dans l'autre sens. – huynhjl
Il y a la raison triviale que '(1,2,3,4,5,6)' est un tuple, pas un tableau. Si vous voulez un tableau, appelez-le un tableau: 'Array (1,2,3,4,5,6)'. D'autres ont déjà répondu aux questions algorithmiques intéressantes. –