
On Wed, Jul 23, 2014 at 10:18 AM, 양철웅
('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