+1.

It is a little bit harder to read for new comers but not really a big deal.




On Dec 26, 2013, at 2:33 PM, Mark Hamstra <m...@clearstorydata.com> wrote:

> In code added to Spark over the past several months, I'm glad to see more
> use of `foreach`, `for`, `map` and `flatMap` over `Option` instead of
> pattern matching boilerplate.  There are opportunities to push `Option`
> idioms even further now that we are using Scala 2.10 in master, but I want
> to discuss the issue here a little bit before committing code whose form
> may be a little unfamiliar to some Spark developers.
> 
> In particular, I really like the use of `fold` with `Option` to cleanly an
> concisely express the "do something if the Option is None; do something
> else with the thing contained in the Option if it is Some" code fragment.
> 
> An example:
> 
> Instead of...
> 
> val driver = drivers.find(_.id == driverId)
> driver match {
>  case Some(d) =>
>    if (waitingDrivers.contains(d)) { waitingDrivers -= d }
>    else {
>      d.worker.foreach { w =>
>        w.actor ! KillDriver(driverId)
>      }
>    }
>    val msg = s"Kill request for $driverId submitted"
>    logInfo(msg)
>    sender ! KillDriverResponse(true, msg)
>  case None =>
>    val msg = s"Could not find running driver $driverId"
>    logWarning(msg)
>    sender ! KillDriverResponse(false, msg)
> }
> 
> ...using fold we end up with...
> 
> driver.fold
>  {
>    val msg = s"Could not find running driver $driverId"
>    logWarning(msg)
>    sender ! KillDriverResponse(false, msg)
>  }
>  { d =>
>    if (waitingDrivers.contains(d)) { waitingDrivers -= d }
>    else {
>      d.worker.foreach { w =>
>        w.actor ! KillDriver(driverId)
>      }
>    }
>    val msg = s"Kill request for $driverId submitted"
>    logInfo(msg)
>    sender ! KillDriverResponse(true, msg)
>  }
> 
> 
> So the basic pattern (and my proposed formatting standard) for folding over
> an `Option[A]` from which you need to produce a B (which may be Unit if
> you're only interested in side effects) is:
> 
> anOption.fold
>  {
>    // something that evaluates to a B if anOption = None
>  }
>  { a =>
>    // something that transforms `a` into a B if anOption = Some(a)
>  }
> 
> 
> Any thoughts?  Does anyone really, really hate this style of coding and
> oppose its use in Spark?

Reply via email to