forall a . a -> b
- это тип функции f
, которая может преобразовать значение любого типа a
в некоторое значение типа b
. Обратите внимание, что f
должен быть готов принимать абсолютно все в качестве входных данных, то есть все они должны проверять тип
f ()
f 32
f True
f 'a'
f "hello"
f (True, [2], False)
length
не удовлетворяет этому требованию, например, length ()
напечатан плохо - length
хочет в качестве входных данных складывать (например, список), а ()
не в порядке.
Следовательно, tupleF2 length
плохо напечатано.
Прагматично, обратите внимание, что f
может быть только постоянной функцией, как
f x = True -- assuming b = Bool
Действительно, параметричность гарантирует, что только постоянная функция может иметь тип forall a . a -> b
. Вы можете попробовать tupleF2 (const True) ((),"hello")
и получить (True, True)
.