какой приоритет инфикса аннотации типа (: :)

Каков приоритет ::, есть ли у оператора даже более низкий приоритет?

Кажется, что приоритет :: меньше, чем $, потому что оба выражения ниже возвращают "ab"

map head $ ["alice", "bob"] :: String
map head ["alice", "bob"] :: String

Ответы

Ответ 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