Ответ 1
::
часть называется аннотацией типа.
Сообщение в списке рассылки указывает на тот же вывод, который поддерживается грамматикой:
https://mail.haskell.org/pipermail/beginners/2012-December/011017.html
Это не бинарный оператор.
Это часть синтаксиса, поэтому он не имеет точного приоритета, но, поскольку вы спрашиваете об этом, я предполагаю, что вас не интересуют объявления типа
foo :: Int -> Double foo = sin . fromIntegral
а скорее в сигнатурах типа выражения. Производство в контекстно-свободном синтаксисе
exp → infixexp :: [context =>] type
поэтому подпись предназначена для всего выражения infix:
Prelude> toEnum . floor $ 12.7 + toEnum 73 :: Char 'U'
следовательно, если бы он имел приоритет, он был бы ниже 0 (приоритет ($)).
Но имейте в виду, что
"Грамматика неоднозначна относительно масштабов лямбда-абстракций, выражений и условностей. Неоднозначность устраняется мета-правилом, что каждая из этих конструкций простирается как можно дальше вправо".
таким образом
Prelude> (\x -> x + x :: Int -> Int) 2 <interactive>:16:10: No instance for (Num (Int -> Int)) arising from a use of '+' Possible fix: add an instance declaration for (Num (Int -> Int)) In the expression: x + x :: Int -> Int In the expression: \ x -> x + x :: Int -> Int In the expression: (\ x -> x + x :: Int -> Int) 2
сигнатура типа здесь распространяется только на
x + x
, так как она анализируется как часть лямбда-абстракции[
\x → (x + x :: Int → Int)
продолжается дальше справа, чем просто\x → x + x
]Поэтому, если вы хотите предоставить подпись типа для абстракции лямбда, вам нужны явные скобки:
Prelude> ((\x -> x + x) :: Int -> Int) 2 4