On Wed, Jul 23, 2014 at 10:18 AM, 양철웅 <cwyang@aranetworks.com> wrote:
                        ('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?

Because you're treating vv as a pure value when you use it, so ghc looks for a way to treat it as a monad and concludes that it is a List. If you want it to be in IO, you need to use <- on its result, not use it directly.

--
brandon s allbery kf8nh                               sine nomine associates
allbery.b@gmail.com                                  ballbery@sinenomine.net
unix, openafs, kerberos, infrastructure, xmonad        http://sinenomine.net