Okay, I found something which I&#39;m sure already exists somewhere:<br><br>{-# LANGUAGE TypeFamilies, TypeOperators, EmptyDataDecls #-}<br><br>data True<br>type family a `Or` b :: *<br>type instance True `Or` a = True<br>

type instance a `Or` True = True<br><br>type family Ctx ref impl :: *<br>data Foo<br>data Bar<br>type instance Ctx Foo Foo = True<br>type instance Ctx Bar Bar = True<br><br>runFoo :: MyIO Foo a -&gt; IO a<br>runBar :: MyIO Bar a -&gt; IO a<br>

<br>fooCtxAction :: (Ctx Foo c) ~ True =&gt; MyIO c ()<br><br>bothCtxAction :: (Ctx Foo c `Or` Ctx Bar c) ~ True =&gt; MyIO c ()<br><br>allCtxAction :: MyIO c ()<br><br><br><div class="gmail_quote">2011/3/5 Yves Parès <span dir="ltr">&lt;<a href="mailto:limestrael@gmail.com">limestrael@gmail.com</a>&gt;</span><br>

<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">But I don&#39;t have an explicit type to put.<br>I cound do:<br><br>data CtxFooInst<br>instance CtxFoo CtxFooInst<br>

<br>and declare runFoo as this:<br><br>runFoo :: MyIO CtxFooInst a -&gt; IO a<br><br>But I loose the ability to make functions that can run several contexts.<br>
<br><br><div class="gmail_quote">2011/3/5 Ivan Lazar Miljenovic <span dir="ltr">&lt;<a href="mailto:ivan.miljenovic@gmail.com" target="_blank">ivan.miljenovic@gmail.com</a>&gt;</span><div><div></div><div class="h5"><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">


<div><div></div><div>On 5 March 2011 10:45, Yves Parès &lt;<a href="mailto:limestrael@gmail.com" target="_blank">limestrael@gmail.com</a>&gt; wrote:<br>
&gt; Hello,<br>
&gt;<br>
&gt; For testing purposes, I am trying to make an overlay to IO which carries a<br>
&gt; phantom type to ensure a context.<br>
&gt; I define contexts using empty type classes :<br>
&gt;<br>
&gt; class CtxFoo c<br>
&gt; class CtxBar c<br>
&gt;<br>
&gt; The overlay :<br>
&gt;<br>
&gt; newtype MyIO c a = MyIO (IO a)<br>
&gt;<br>
&gt; Then I define some methods that run only a specific context :<br>
&gt;<br>
&gt; runFoo :: (CtxFoo c) =&gt; MyIO c a -&gt; IO a<br>
&gt; runFoo (MyIO x) = x<br>
&gt;<br>
&gt; runBar :: (CtxBar c) =&gt; MyIO c a -&gt; IO a<br>
&gt; runBar (MyIO x) = x<br>
&gt;<br>
&gt; And then an action that runs in context &#39;Foo&#39; :<br>
&gt;<br>
&gt; someAction :: (CtxFoo c) =&gt; MyIO c ()<br>
&gt; someAction = putStrLn &quot;FOO&quot;<br>
&gt;<br>
&gt; Then I run it :<br>
&gt;<br>
&gt; main = runFoo someAction<br>
&gt;<br>
&gt; But obiously, GHC complains that my type &#39;c&#39; remains uninstantiated :<br>
&gt;<br>
&gt;     Ambiguous type variable `c&#39; in the constraint:<br>
&gt;       (CtxFoo c) arising from a use of `runFoo&#39;<br>
&gt;     Probable fix: add a type signature that fixes these type variable(s)<br>
&gt;     In the expression: runFoo someAction<br>
&gt;     In an equation for `main&#39;: main = runFoo someAction<br>
&gt;<br>
&gt;<br>
&gt; Is there a way to deal with this ?<br>
<br>
</div></div>Provide an explicit type signature for either runFoo or someAction;<br>
this is the same problem as doing &quot;show . read&quot; in that GHC can&#39;t tell<br>
which instance to use.<br>
<font color="#888888"><br>
--<br>
Ivan Lazar Miljenovic<br>
<a href="mailto:Ivan.Miljenovic@gmail.com" target="_blank">Ivan.Miljenovic@gmail.com</a><br>
<a href="http://IvanMiljenovic.wordpress.com" target="_blank">IvanMiljenovic.wordpress.com</a><br>
</font></blockquote></div></div></div><br>
</blockquote></div><br>