2011-08-09 26 views
5

que estaba viendo la forma de plegado se define por immutable.Set:¿Por qué fold tiene el siguiente tipo en Scala?

def fold [A1 >: A] (z: A1)(op: (A1, A1) ⇒ A1): A1 

todavía foldLeft se define como:

def foldLeft [B] (z: B)(op: (B, A) ⇒ B): B 

Este se ve raro para mí, al menos a primera vista, ya que esperaba fold para poder cambiar el tipo de la colección que devolvió, al igual que foldLeft.

Imagino que esto se debe a que foldLeft y foldRight garantizan algo sobre el orden en que se pliegan los elementos. ¿Cuál es la garantía dada por fold?

+0

¿Te ayuda la respuesta de Jean-Philippe? Ver http://stackoverflow.com/questions/6253978/difference-between-fold-and-foldleft-or-foldright –

+0

En cierto modo, supongo. Todavía tengo que ver un caso en el que fold devuelva resultados diferentes de foldLeft en la API de recopilación, pero supongo que puede haber algunas implementaciones donde esta distinción sea necesaria. Gracias por el enlace. –

Respuesta

6

Cuando aplica foldLeft, su valor de inicio se combina con el primer elemento de lista. El resultado se combina con el segundo elemento de lista. Este resultado con el tercero y así sucesivamente. Eventualmente, la lista se ha colapsado a un elemento del mismo tipo que su valor de inicio. Por lo tanto, solo necesita algún tipo que pueda combinarse mediante su función con un elemento de lista.
Para foldRight, lo mismo aplica pero en orden inverso.

fold no garantiza el orden en que se realizan las combinaciones. Y no garantiza que comience en una sola posición. Los pliegues pueden suceder en paralelo. Como puede tener el paralelismo, se requiere combinar 2 elementos de lista o valores de retorno; esto agrega una restricción a los tipos.

Con respecto a su comentario de que tiene que ver un caso, el orden tiene un efecto: Suponga que está usando pliegues para concatenar una lista de caracteres y desea tener un texto como resultado. Si su entrada es A, B, C, probablemente le gustaría conservar la orden para recibir ABC en lugar de ACB (por ejemplo).
Por otro lado, si está, digamos, sumando números, el orden no importa. Resumiendo 1, 2, 3 da 6 independiente de la orden de adiciones. En tales casos, usar fold en lugar de foldLeft o foldRight podría conducir a una ejecución más rápida.

+0

Gracias. Pensé que el orden era importante, pero nunca consideré el paralelismo. –

0

Parece que FoldLeft debe devolver B. El método toma un B arg - esto es un acumulador. Los valores de A se usan para "agregar más a" a B. Se devuelve el valor acumulado final. Creo que FoldLeft y FoldRight son lo mismo a este respecto.

Cuestiones relacionadas