<p>I can't quite figure out this syntax problem with a <code>case</code> expression in a <code>do</code> block.</p>

<p>What is the correct syntax? </p>

<p>If you could correct my example and explain it that would be the best.</p>

<pre><code>module Main where 

main = do   
     putStrLn "This is a test"
     s &lt;- foo
     putStrLn s  

foo = do
    args &lt;- getArgs 
    return case args of
                [] -&gt; "No Args"
                [s]-&gt; "Some Args"
</code></pre>

<p>A little update. My source file was a mix of spaces and tabs and it was causing all kinds of problems.
Just a tip for any one else starting in Haskell. If you are having problems check for tabs and spaces in your source code.</p>

return is an (overloaded) function, and it's not expecting its first argument to be a keyword.  You can either parenthesize:
```
```
module Main where 
import System(getArgs)

main = do   
     putStrLn "This is a test"
     s <- foo
     putStrLn s  

foo = do
    args <- getArgs 
    return (case args of
                [] -> "No Args"
                [s]-> "Some Args")
```
```
or use the handy application operator ($):
```
```
foo = do
    args <- getArgs 
    return $ case args of
                [] -> "No Args"
                [s]-> "Some Args"
```
```
Stylewise, I'd break it out into another function:
```
```
foo = do
    args <- getArgs 
    return (has_args args)

has_args [] = "No Args"
has_args _  = "Some Args"
```
```
but you still need to parenthesize or use ($), because return takes one argument, and function application is the highest precedence.