Это ошибка в средстве проверки типов?
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
в контравариантную позицию, где его нельзя «выпустить», похоже, предохраняет его от этой странной ошибки.