Hello everybody,<br><br>I&#39;m trying to implement the type protection used by ST to prevent a monad from returning a certain type.<br>There&#39;s my code:<br><br><span class="corners-bottom"><span></span></span><span class="corners-bottom"><span></span></span><span class="corners-bottom"><span></span></span><span class="corners-bottom"><span></span></span>import Control.Monad.Identity<br>
<br>newtype SomeMonad s a = SomeMonad { unSome :: Identity a }<br>  deriving (Monad)<br><br>newtype SomeType s = SomeType Int<br><br>runSomeMonad :: (forall s. SomeMonad s a) -&gt; a<br>runSomeMonad (SomeMonad x) = runIdentity x<br>
<br>And when compiled, I got this error:<br>phantom.hs:10:14:<br>    Couldn&#39;t match expected type `forall s. PwetMonad s a&#39;<br>           against inferred type `PwetMonad s a1&#39;<br>    In the pattern: PwetMonad x<br>
    In the definition of `runPwetMonad&#39;:<br>        runPwetMonad (PwetMonad x) = runIdentity x<br><br>But when I change line 10 to:<br>runSomeMonad x = runIdentity . unSome $ x<br><br>then it works, so obviously, the trouble is about pattern matching.<br>
What was I doing wrong?<br><span class="corners-bottom"><span></span></span><span class="corners-bottom"><span></span></span>