2012-04-16 9 views
6

Estoy empezando a estudiar el lenguaje de programación Scala. He alguna comprensión de las lenguas de PF como Erlang y Haskell y tengo una duda sobre el significado de la expresión para/rendimiento, como:¿El 'rendimiento' en Scala es equivalente a la función de mapa?

for (arg <- args) yield arg.length 

Este recogería una matriz con las longitudes de cualquier argumento de entrada. Por lo que he entendido esto parece la función de mapa en la programación normal FP:

map (\a -> a * 2) [1, 2, 3] (in Haskell) 

Sé que la biblioteca Scala contiene el método scala.collection.map, así que me gustaría saber: ¿hay alguna diferencia o limitación en el uso de cualquier estilo, o son exactamente iguales?

+1

posible duplicado de (http://stackoverflow.com/questions/1052476/can-alguien-explique-scalas-rendimiento) –

+2

Scala para la comprensión son similares a la notación 'do 'de Haskell. –

+1

#Daniel, pero no estoy pidiendo el significado 'yield', sino las similitudes con otras expresiones FP. –

Respuesta

14

for ... yield comprensión en la Scala es traducida por el compilador a las map, flatMap y withFilter llamadas a métodos. for sin yield se traduciría a la llamada al método foreach. Se pueden encontrar algunos ejemplos y más información aquí: [? Puede alguien explicar el rendimiento de Scala]

http://tataryn.net/2011/10/whats-in-a-scala-for-comprehension/

y aquí

http://adamwojtuniak.wordpress.com/2010/09/24/scala-for-comprehensions/

+4

Y así, flatMap y withFilter son equivalentes a concat y select ... Realmente deberían definir un sistema de nombres estándar para estos patrones funcionales;) –

6

for/yield expresiones de Scala son completamente equivalentes a las listas por comprensión/monad en Haskell, y tienen exactamente las mismas capacidades, siempre y cuando usted se pega a un tipo por for expresión. (No sé acerca de Erlang, sin embargo.)

En particular, el ejemplo se traduce exactamente a [length arg | arg <- args], traduciendo el método llamado Scala x.f a la aplicación de la función Haskell f x.

+1

¿'yield' genera salida incremental, o toda la lista de una vez? –

+1

Buen ejemplo Ptharien, ¡Haskell siempre ha estado adelantado! Sobre el rendimiento incremental de rendimiento, creo que es importante cuando quieres paralelizar el código, por lo que recuerdo Scala tiene una colección paralela y un método .par para eso en 2.9. –

3

El for-yield se compila en mapas, está en el libro Programming in Scala.

Cuestiones relacionadas