I know that Haskell\'s
do
x <- [1, 2, 3]
y <- [7, 8, 9]
let z = (x + y)
return z
can be expressed in Scala as
for
Yes, that translation is valid.
do { x <- m; n }
is equivalent to m >>= \x -> n
, and do { m; n }
is equivalent to m >> n
. Since m >> n
is defined as m >>= \_ -> n
(where _
means "don't bind this value to anything"), that is indeed a valid translation; do { m; n }
is the same as do { _ <- m; n }
, or do { unusedVariable <- m; n }
.
A statement without a variable binding in a do
block simply disregards the result, usually because there's no meaningful result to speak of. For instance, there's nothing interesting to do with the result of putStrLn "Hello, world!"
, so you wouldn't bind its result to a variable.
(As for monads being black magic, the best realisation you can have is that they're not really complicated at all; trying to find deeper meaning in them is not generally a productive way of learning how they work. They're simply an interface to compose computations that happen to be particularly common. I recommend reading the Typeclassopedia to get a solid grasp on Haskell's abstract typeclasses, though you'll need to have read a general Haskell introduction to get much out of it.)