Thank you all for kind replies.

But I'm not sure whether I grasp the gist.
Actual code is as follows.
I want to scan the query argument of HTTP get method and
build response object according to the query arguments.
I use fold and the scanQuery function should return IO object
for some reason.

Since parseHeader function is fold function and uses query and request
variable at the same time, I cannot write as a separate function.

scanQuery :: Request -> IO Object
scanQuery request = do
        let (p, query) = parseUrl (path request)
        foldM parseHeader defObject query
            where parseHeader obj (name, Just value) =
                      case name of
                        "len" -> return obj { contentLength = read value }
                        "type" -> return obj { contentType = parseContentType value }
                        "rate" -> return obj { rate = Just value }
                        "status" -> return obj { httpStatus = read value }
                        ('x':'x':name2) -> return obj { clientReqHdr = ((name2, vv) : prev) }
                           where prev = clientReqHdr obj
                                 vv = case value of
                                        "client_ip_addr" -> clientIp request
                                        "now" -> do utcTime <- currentUTCTime
                                                    return $ formatRFC1123 utcTime
                                        _ -> value
                        _ -> return obj

However, above code does not compile also :-( 
*Main> :l test
[1 of 1] Compiling Main             ( test.hs, interpreted )

test.hs:101:64:
    Couldn't match expected type `[t0]' with actual type `IO UTCTime'
    In a stmt of a 'do' block: utcTime <- currentUTCTime
    In the expression:
      do { utcTime <- currentUTCTime;
           return $ formatRFC1123 utcTime }
    In a case alternative:
        "now"
          -> do { utcTime <- currentUTCTime;
                  return $ formatRFC1123 utcTime }
Failed, modules loaded: none.

Obviously outer do-block is inside IO monad, as the type of scanQuery is 
Request -> IO Object. But GHC puts inner do-block (in "now" case)  inside list monad,
doesn't it? Why does ghc look for List monad?

Lost in monad,

Chul-Woong





2014-07-23 21:33 GMT+09:00 Kim-Ee Yeoh <ky3@atamo.com>:

On Wed, Jul 23, 2014 at 7:08 PM, 양철웅 <cwyang@aranetworks.com> wrote:
Since the return type of foo Func is IO String and
first case statement has "return timedVal", 
I think that ghc expects the type of timedVal as String.
However, the error message shows that
ghc expects timedVal should have type IO b0.

It's not really about timedVal nor the case 'statement'. (The scare quotes are because there are only expressions, not statements, in haskell.)

Consider the difference between

do { putStrLn "hello"; True; }

and

do { putStrLn "hello"; return True; }

Which one throws an error and why?


-- Kim-Ee

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners