16 karma · joined January 15, 2014
computation1.flatMap { result1 =>
computation2.flatMap { result2 =>
computation3.map { result3 =>
result2 + result3
}
}
}
Becomes... val foobar = for {
result1 <- computation1
result2 <- computation2(result1)
result3 <- computation3(result2)
} yield {
result2 + result3
}
Or, since I'm using the async Postgres module which returns Futures, to make them run in parallel you need to create the futures beforehand. I often have something like this... val fProject = Project.findById(projectId)
val fTask = Task.findById(taskId)
for {
projectOption <- fProject
taskOption <- fTask
students <- projectOption match {
case Some(project) => Student.findByProject(projectId)
case None => Future.successful(IndexedSeq[Student]())
}
result <- (projectOption, taskOption) match {
case (Some(project), Some(task)) => {
/* do something with project, task and students */
}
case (None, _) => Future.successful(NotFound(s"Project $projectId not found"))
case (_, None) => Future.successful(NotFound(s"Task $taskId not found"))
}
}
yield result
By creating the futures first, they both run in parallel and their results are 'collected' by the for comprehension. In the first example, the computations necessarily run in sequence.I'm using Play framework, for me, these for comprehensions are usually found in my controllers and the final result is an HTTP result.
Passing along failure can still be tricky but I find this much more organized than nesting callbacks.
Why is there ever any incentive to do anything with BTC besides hoarding?
If I build an application in Java and Python, with the same database backend, running the exact same set of SQL queries, the Java application should perform better.
I used to work with Java on the server-side, but I'm programming almost entirely in Scala now (I'm at a small shop where I was lucky enough to convince the boss to let me give it a go on a project last year) and I've got to say that it's completely changed the way I think about and solve problems. I learned Haskell in university and I'm trying to learn more, but I don't see it ever being accepted in our office.
The Scala syntax does (especially when working with async programming / Futures) suffer from problems, like the nested callback problem that Javascript also has, but there is an elegant solution in the language... you just have to know how to use it. But on the other hand, it doesn't look like a completely foreign language to Java developers and it's not too hard to get our new hires productive with it.
Also, see: http://www.logicalfallacies.info/relevance/fallacists/
I used it for a while, on a large project, and eventually came to hate it. I try to write as clean code as ppossible but still found the resulting mess of words, commas and arrows floating around at differing indentation levels to be much harder to read.
To me, even though javascripts syntax can be annoying, it's parentheses provide a certain amount of structure to the code.
I'm using one called Activate (http://activate-framework.org/) in a few of my latest projects and it's really simplified things. There's also Squeryl, ReactiveMongo, Slick...
Is such a challenge possible in the USA?