Как может eta-сокращение хорошо типизированной функции привести к ошибке типа?

Я играл с линзами van Laarhoven и столкнулся с проблемой, когда средство проверки типов отклоняет eta-уменьшенную форму хорошо типизированной функции:

{-# LANGUAGE RankNTypes #-}

import Control.Applicative

type Lens c a = forall f . Functor f => (a -> f a) -> (c -> f c)

getWith :: (a -> b) -> ((a -> Const b a) -> (c -> Const b c)) -> (c -> b)
getWith f l = getConst . l (Const . f)

get :: Lens c a -> c -> a
get lens = getWith id lens

Вышеуказанные проверки типов, но если я это-уменьшитьget в

get :: Lens c a -> c -> a
get = getWith id

Тогда GHC (7.4.2) жалуется, что

Couldn't match expected type `Lens c a'
            with actual type `(a0 -> Const b0 a0) -> c0 -> Const b0 c0'
Expected type: Lens c a -> c -> a
  Actual type: ((a0 -> Const b0 a0) -> c0 -> Const b0 c0)
               -> c0 -> b0
In the return type of a call of `getWith'
In the expression: getWith id

Я могу понять, что если функция неу нас нет явной сигнатуры типа, тогда eta-редукция в сочетании с ограничением мономорфизма может привести к путанице в выводе типа, особенно когда мы имеем дело с типами более высокого ранга, но в этом случае яя не уверен чтопродолжается

Что заставляет GHC отклонять форму с сокращенным eta и является ли это ошибкой / ограничением в GHC или какой-то фундаментальной проблемой с типами более высокого ранга?

Ответы на вопрос(2)

Ваш ответ на вопрос