haskell - sufijo - palabras morfemas
¿Cuál es la prioridad de infijo de la anotación de tipo(::) (1)
La parte ::
se llama una anotación de tipo.
Un mensaje en la lista de correo apunta exactamente a la misma conclusión, apoyada por la gramática:
https://mail.haskell.org/pipermail/beginners/2012-December/011017.html
No es realmente un operador binario.
Es parte de la sintaxis, por lo que no tiene una prioridad exacta, pero como lo pregunta, supongo que no está interesado en las declaraciones de tipo
foo :: Int -> Double foo = sin . fromIntegral
sino más bien en expresiones de tipo firma. La producción en la sintaxis libre de contexto es
exp → infixexp :: [context =>] type
por lo que la firma es para toda la expresión de infijo:
Prelude> toEnum . floor $ 12.7 + toEnum 73 :: Char ''U''
por lo tanto, si tuviera una precedencia, estaría por debajo de 0 (la precedencia de ($)).
Pero ten en cuenta que
"La gramática es ambigua con respecto a la extensión de las abstracciones lambda, las expresiones y los condicionales. La ambigüedad se resuelve con la meta-regla de que cada una de estas construcciones se extiende lo más a la derecha posible".
así
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
La firma de tipo aquí se extiende solo sobre
x + x
, ya que se analiza como parte de la abstracción lambda[
/x -> (x + x :: Int -> Int)
extiende más hacia la derecha que solo/x -> x + x
]Entonces, si desea dar una firma de tipo a una abstracción lambda, necesita paréntesis explícitos:
Prelude> ((/x -> x + x) :: Int -> Int) 2 4
¿Cuál es la prioridad de ::
, hay algún operador que tenga incluso una prioridad más baja?
Parece que la prioridad de ::
es menor que $
, porque las dos expresiones a continuación devuelven "ab"
map head $ ["alice", "bob"] :: String
map head ["alice", "bob"] :: String