[Haskell-cafe] A Typing Dilemma
John Goerzen
jgoerzen at complete.org
Fri Oct 8 09:57:03 EDT 2004
Thanks so much for all the help many of you have provided. I have one
(heh) more question:
I have this code:
defaultHandler :: LogHandler b => IO (a -> IORef b)
defaultHandler = do
h <- (streamHandler stdout WARNING)
r <- newIORef h
return (\x -> r)
The idea is to create a new IORef to something in the LogHandler class
and return a function that returns it. The thing returned by that call
to streamHandler is in the LogHandler class. Specifically, its
declaration looks like this:
instance LogHandler (GenericHandler a) where
...
and streamHandler returns a "GenericHandler Handle" object.
Now, when compiling that defaultHandler code, the compiler complains:
Cannot unify the type-signature variable `b'
with the type `MissingH.Logging.Handler.Simple.GenericHandler
Handle'
Expected type: IORef b
Inferred type: IORef
(MissingH.Logging.Handler.Simple.GenericHandler
Handle)
In a lambda abstraction: \ x -> r
In the first argument of `return', namely `(\ x -> r)'
I'm stumped. Can anyone shed some light on that for me?
Thanks,
-- John
More information about the Haskell-Cafe
mailing list