Why does this function that uses a scoped type variable in a where clause not typecheck?
<p>I have a function that has a value defined in a <code>where</code> clause, and I want to give it an explicit type annotation. The annotation needs to use a type variable from the top-level function, so it was my understanding that I needed to use <code>ScopedTypeVariables</code>. Here is a minimal reduction of the problem:</p>

<pre><code>{-# LANGUAGE ScopedTypeVariables #-}

import Control.Monad.Trans.Except
import Data.Functor.Identity

f :: ExceptT String Identity a -&gt; Maybe a
f m = Nothing
  where x :: Identity (Either String a)
        x = runExceptT m
</code></pre>

<p>This code does <em>not</em> typecheck. It fails with the following error message:</p>

<pre class="lang-none prettyprint-override"><code>Couldn't match type ‘a’ with ‘a1’
  ‘a’ is a rigid type variable bound by
      the type signature for f :: ExceptT String Identity a -&gt; Maybe a
      at src/Lib.hs:20:6
  ‘a1’ is a rigid type variable bound by
       the type signature for x :: Identity (Either String a1)
       at src/Lib.hs:22:14
Expected type: ExceptT String Identity a1
  Actual type: ExceptT String Identity a
Relevant bindings include
  x :: Identity (Either String a1) (bound at src/Lib.hs:23:9)
  m :: ExceptT String Identity a (bound at src/Lib.hs:21:3)
  f :: ExceptT String Identity a -&gt; Maybe a
    (bound at src/Lib.hs:21:1)
In the first argument of ‘runExceptT’, namely ‘m’
In the expression: runExceptT m
</code></pre>

<p>Why does this fail? I do not understand why this would cause problems—it seems like a textbook use of scoped type variables. For reference, I am using GHC 7.10.3.</p>