Во-первых, что это за символы +> и ~>? Где они документированы и как они называются?
Это инфиксные идентификаторы, точно так же, как если бы вы использовали их в качестве имени функции. Точно так же, будучи эквивалентными строчными идентификаторами (в отличие от операторов, начинающихся с :
, которые эквивалентны буквенно-цифровым идентификаторам верхнего регистра), в сигнатуре типа они просто переменные типа . Другими словами, это эквивалентно этому:
(forall j k . (f a j) -> (g j k) -> (f a k))
-> etc . . .
Но мое замешательство на этом и заканчивается. Я понимаю, что количественное определение описывает потоки типов Thrist, но я не уверен, описывает ли отношение, которое имеет место для первого аргумента, или всей функции, или кто знает ...
Явные квантификаторы ограничены областью применения только в прилагаемых скобках или до конца выражения. В этом случае они описывают только первый аргумент, поскольку введенные переменные типа находятся только в области видимости этого аргумента.
В данном случае это просто означает, что функция, указанная в качестве первого аргумента, должна быть полностью полиморфной в этих типах. Например, функции, чья сигнатура типа начинается с (a -> a) -> ...
, можно было бы задать not
в качестве первого аргумента, объединяя a
с Bool
. В отличие от этого, если сигнатура типа начинается с (forall a. a -> a) -> ...
, для этого потребуется функция, которая работает для всех возможных типов a
, единственной такой функцией является id
.