reglas protocolar procedencia precedencia orden operator operadores operaciones nivel las asociatividad aritmeticos haskell

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:

  1. ¿Por qué los operadores de infijo y prefijo exhiben un comportamiento diferente?
  2. ¿Por qué ~ une tan fuerte?
  3. ¿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