[Haskell-cafe] Use of uninstantiated type class

Ivan Lazar Miljenovic ivan.miljenovic at gmail.com
Sat Mar 5 00:49:19 CET 2011


On 5 March 2011 10:45, Yves Parès <limestrael at gmail.com> wrote:
> Hello,
>
> For testing purposes, I am trying to make an overlay to IO which carries a
> phantom type to ensure a context.
> I define contexts using empty type classes :
>
> class CtxFoo c
> class CtxBar c
>
> The overlay :
>
> newtype MyIO c a = MyIO (IO a)
>
> Then I define some methods that run only a specific context :
>
> runFoo :: (CtxFoo c) => MyIO c a -> IO a
> runFoo (MyIO x) = x
>
> runBar :: (CtxBar c) => MyIO c a -> IO a
> runBar (MyIO x) = x
>
> And then an action that runs in context 'Foo' :
>
> someAction :: (CtxFoo c) => MyIO c ()
> someAction = putStrLn "FOO"
>
> Then I run it :
>
> main = runFoo someAction
>
> But obiously, GHC complains that my type 'c' remains uninstantiated :
>
>     Ambiguous type variable `c' in the constraint:
>       (CtxFoo c) arising from a use of `runFoo'
>     Probable fix: add a type signature that fixes these type variable(s)
>     In the expression: runFoo someAction
>     In an equation for `main': main = runFoo someAction
>
>
> Is there a way to deal with this ?

Provide an explicit type signature for either runFoo or someAction;
this is the same problem as doing "show . read" in that GHC can't tell
which instance to use.

-- 
Ivan Lazar Miljenovic
Ivan.Miljenovic at gmail.com
IvanMiljenovic.wordpress.com



More information about the Haskell-Cafe mailing list