Take the humble identity function in Haskell, 

```
id :: forall a. a -> a

```

Given that Haskell supposedly supports impredicative polymorphism, it seems reasonable that I should be able to "restrict" `id` to the type `(forall a. a -> a) -> (forall b. b -> b)` via type ascription. But this doesn't work:

```
Prelude> id :: (forall a. a -> a) -> (forall b. b -> b)

<interactive>:1:1:
    Couldn't match expected type `b -> b'
                with actual type `forall a. a -> a'
    Expected type: (forall a. a -> a) -> b -> b
      Actual type: (forall a. a -> a) -> forall a. a -> a
    In the expression: id :: (forall a. a -> a) -> (forall b. b -> b)
    In an equation for `it':
        it = id :: (forall a. a -> a) -> (forall b. b -> b)

```

It's of course possible to define a new, restricted form of the identity function with the desired signature:

```
restrictedId :: (forall a. a -> a) -> (forall b. b -> b)
restrictedId x = x

```

However defining it in terms of the general `id` doesn't work:

```
restrictedId :: (forall a. a -> a) -> (forall b. b -> b)
restrictedId = id -- Similar error to above

```

So what's going on here? It seems like it might be related to difficulties with impredicativity, but enabling `-XImpredicativeTypes` makes no difference.