Ошибка типа при присвоении допустимого типа forall переменной с привязкой к let

Это ошибка в средстве проверки типов?

Prelude> let (x :: forall a. a -> a) = id in x 3

:0:31:
    Couldn't match expected type `forall a. a -> a'
                with actual type `a0 -> a0'
    In the expression: id
    In a pattern binding: (x :: forall a. a -> a) = id

Тот факт, что в приведенном выше примере не удается выполнить проверку типа, но это искажение удается:

Prelude> let (x :: (forall a. a -> a) -> Int) = (\f -> f 3) in x id
3

заставляет меня думать, что "weak предварительное преобразование »(см. стр. 23 этой статьи ) может быть как-то связано. Встраивание forall в контравариантную позицию, где его нельзя «выпустить», похоже, предохраняет его от этой странной ошибки.

14
задан Tom Crockett 18 November 2011 в 23:35
поделиться