
I'm a somewhat experienced coder but I am relatively new to Haskell. I've got a question about whether a usage of do notation is idiomatic, or whether it's better to use pattern matching. I've got two functions which take an input and return Maybe SomeType. If either returns Nothing, I also want to return Nothing. If they both return something, then I'll return something unrelated. With do notation, I can write something like this: do foo <- callFoo x bar <- callBar x return (baz) Alternatively, there's a straightforward pattern match. After binding foo, bar in a couple of where clauses: case (foo,bar) of (Just x, Just y) -> baz _ -> Nothing So which approach is more idiomatic, do you think? Thanks, - Matthew

The do notation in this instance yields a nice advantage: if you want to
switch to a different monad to encapsulate failure you will meely need to
swap out the type signature and your function will need no further work.
On Aug 4, 2012 7:35 AM, "Matthew"
I'm a somewhat experienced coder but I am relatively new to Haskell. I've got a question about whether a usage of do notation is idiomatic, or whether it's better to use pattern matching.
I've got two functions which take an input and return Maybe SomeType. If either returns Nothing, I also want to return Nothing. If they both return something, then I'll return something unrelated.
With do notation, I can write something like this:
do foo <- callFoo x bar <- callBar x return (baz)
Alternatively, there's a straightforward pattern match. After binding foo, bar in a couple of where clauses:
case (foo,bar) of (Just x, Just y) -> baz _ -> Nothing
So which approach is more idiomatic, do you think?
Thanks, - Matthew
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

Also if you don't need foo and bar you can write:
callFoo >> callBar >> return baz
//Johan
On Aug 4, 2012 8:36 AM, "Matthew"
I'm a somewhat experienced coder but I am relatively new to Haskell. I've got a question about whether a usage of do notation is idiomatic, or whether it's better to use pattern matching.
I've got two functions which take an input and return Maybe SomeType. If either returns Nothing, I also want to return Nothing. If they both return something, then I'll return something unrelated.
With do notation, I can write something like this:
do foo <- callFoo x bar <- callBar x return (baz)
Alternatively, there's a straightforward pattern match. After binding foo, bar in a couple of where clauses:
case (foo,bar) of (Just x, Just y) -> baz _ -> Nothing
So which approach is more idiomatic, do you think?
Thanks, - Matthew
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

On Fri, Aug 3, 2012 at 11:34 PM, Matthew
I'm a somewhat experienced coder but I am relatively new to Haskell. I've got a question about whether a usage of do notation is idiomatic, or whether it's better to use pattern matching.
I've got two functions which take an input and return Maybe SomeType. If either returns Nothing, I also want to return Nothing. If they both return something, then I'll return something unrelated.
With do notation, I can write something like this:
do foo <- callFoo x bar <- callBar x return (baz)
Alternatively, there's a straightforward pattern match. After binding foo, bar in a couple of where clauses:
case (foo,bar) of (Just x, Just y) -> baz _ -> Nothing
So which approach is more idiomatic, do you think?
The short answer is to write a "one liner" using (>>=) and (>>), unless you need to bind more than one value to a variable. In that case, you should use an applicative interface, if available and otherwise possible, and finally do-notation.

On Sat, Aug 4, 2012 at 7:05 AM, Alexander Solla
On Fri, Aug 3, 2012 at 11:34 PM, Matthew
wrote: I'm a somewhat experienced coder but I am relatively new to Haskell. I've got a question about whether a usage of do notation is idiomatic, or whether it's better to use pattern matching.
I've got two functions which take an input and return Maybe SomeType. If either returns Nothing, I also want to return Nothing. If they both return something, then I'll return something unrelated.
With do notation, I can write something like this:
do foo <- callFoo x bar <- callBar x return (baz)
Alternatively, there's a straightforward pattern match. After binding foo, bar in a couple of where clauses:
case (foo,bar) of (Just x, Just y) -> baz _ -> Nothing
So which approach is more idiomatic, do you think?
The short answer is to write a "one liner" using (>>=) and (>>), unless you need to bind more than one value to a variable. In that case, you should use an applicative interface, if available and otherwise possible, and finally do-notation.
Aha. I'd forgotten all about >>. Thanks, everyone! I'm going with callFoo >> callBar >> return baz.

On Sat, Aug 4, 2012 at 7:05 AM, Alexander Solla
On Fri, Aug 3, 2012 at 11:34 PM, Matthew
wrote: ... With do notation, I can write something like this:
do foo <- callFoo x bar <- callBar x return (baz)
... The short answer is to write a "one liner" using (>>=) and (>>), unless you need to bind more than one value to a variable. In that case, you should use an applicative interface, if available and otherwise possible, and finally do-notation.
But the longer answer would be, it depends! Right? The `do' notation is clear and easy to follow; it's low maintenance - even if you have nothing to bind right now, if that comes up in the future, it will drop right into that `do' block; it's classic Haskell that doesn't need any explaining to (hardly) anyone. Maybe it's your last choice, maybe it's my first. Donn
participants (5)
-
Alexander Solla
-
Benjamin Edwards
-
Donn Cave
-
Johan Holmquist
-
Matthew