Является ли это ошибкой в проверке типов?
Prelude> let (x :: forall a. a -> a) = id in x 3
<interactive>: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
приводит меня к мысли, что "слабая конверсия prenex" (см. стр. 23 of этот документ) может быть каким-то образом связана. Вложение a forall
в контравариантное положение, в котором он не может быть "выплыл", кажется, защищает его от этой странной ошибки.