
Thank you, Brandon.
I changed the code like belows and it works.
('x':'x':name2) -> do vv <- case value of
"client_ip_addr" ->
return $ clientIp request
"now" -> do utcTime
<- currentUTCTime
return $
formatRFC1123 utcTime
_ -> return value
let prev = clientReqHdr obj
return obj { clientReqHdr =
((name2, vv) : prev) }
2014-07-23 23:22 GMT+09:00 Brandon Allbery
On Wed, Jul 23, 2014 at 10:18 AM, 양철웅
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
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners