haskell - protocolar - ¿Cuál es la precedencia de ~, y por qué?
reglas de precedencia excel (1)
El siguiente fragmento compila:
{-# LANGUAGE TypeFamilies #-}
type family Foo a b
f :: (Foo a b ~ Int) => a -> b -> b
f = error ""
pero los operadores de tipo infijo parecen comportarse de manera diferente:
{-# LANGUAGE TypeFamilies #-}
type family a // b
f :: (a // b ~ Int) => a -> b -> b
f = error ""
GHC se queja de que el segundo argumento de //
debería tener el tipo *
, pero b ~ Int
tiene el tipo Constraint
. Por supuesto, esto se puede arreglar con parens, pero me pregunto si hay otra manera.
He intentado establecer la prioridad de mi operador con la declaración de infixl 9 //
, pero eso no soluciona el problema, lo que indica que la prioridad de ~
es al menos 9 (si lo interpreto correctamente). Intenté usar el truco de esta respuesta para hacer que GHCi me dijera la precedencia de ~
, pero no funcionó.
Técnicamente hablando, ~
probablemente no sea un operador de tipo, es más una construcción léxica similar a, pero las preguntas siguen en pie:
- ¿Por qué los operadores de infijo y prefijo exhiben un comportamiento diferente?
- ¿Por qué
~
une tan fuerte? - ¿Hay algo que pueda hacer para que mis propios operadores se unan aún más?
(Nota: esta pregunta se refiere a la prioridad de las funciones de tipo, pero no dice nada acerca de ~
.)
~
no es un operador, es una palabra clave, como module
o case
, así que creo que solo se puede alterar la precedencia utilizando paréntesis.
Vea más aquí: https://wiki.haskell.org/Keywords#.7E