If one parameter is not enough, you always can add more:<br><br>Test m a b = Test { f :: m IO a -&gt; IO b }<br><br>This way, if<br><br>run :: m IO a -&gt; IO a<br><br>then<br><br>Test run :: Test m a a<br><br>But for other type for your run function<br>
<br>run&#39; :: m IO a -&gt; IO b<br><br>you get<br><br>Test run&#39; :: Test m a b<br><br>So you can have different types in input and output. Anyway, your type &#39;m&#39; is applied to other two types (m IO a), so it cannot be a monad, because monads have arity 1 as type constructors, i.e. monads have kind (* -&gt; *). Is perhaps &#39;m&#39; some kind of monad transformer?<br>
<br>Well, that&#39;s all I can say from your explanation of the problem! Hope it helps!<br><br>Daniel Díaz.<br>