Chapter 7. for Comprehensions in Depth
We described for
comprehensions in “Scala for Comprehensions”. At this point, they look like a nice, more flexible version of the venerable for
loop, but not much more. In fact, lots of sophistication lies below the surface, sophistication that has useful benefits for writing concise code with elegant solutions to a number of design problems.
In this chapter, we’ll dive below the surface to really understand for
comprehensions. We’ll see how they are implemented in Scala and how your own container types can exploit them.
We’ll finish with an examination of how many Scala container types use for
comprehensions to address several common design problems, such as error handling during the execution of a sequence of processing steps. As a final step, we’ll extract a well-known functional technique for a recurring idiom.
Recap: The Elements of for Comprehensions
for
comprehensions contain one or more generator expressions, plus optional guard expressions (for filtering), and value definitions. The output can be “yielded” to create new collections or a side-effecting block of code can be executed on each pass, such as printing output. The following example demonstrates all these features. It removes blank lines from a text file:
// src/main/scala/progscala2/forcomps/RemoveBlanks.scala
package
progscala2.forcomps
object
RemoveBlanks
{
/*
*
*
Remove blank lines from the specified input file.
*/
def
apply
(
path
:
String
,
compressWhiteSpace
:
Boolean ...
Get Programming Scala, 2nd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.