Duda sobre asociacion de operadores

Re: Duda sobre asociacion de operadores

de Juan Pablo García Garland -
Número de respuestas: 0

Extrapolando a un caso más familiar: ¿por qué 3+4*5 evalúa a 23 y no a 35? El operador * tiene mayor precedencia que el operador +, por lo que la expresión de parsea como 3 + (4 * 5).

En Haskell los operadores tienen una precedencia y un modo de asociatividad. Si en el intérprete ejecutamos :info (*) o :info (+) se imprime (entre otras cosas) la precedencia de cada operador: infixl 6 + e infixl 7 *. infixl indica que asocian a la izquierda, así que 1 + 2 + 3 se parsea como (1+2)+3.

Si hacés lo mismo con los operadores : y (++) vas a ver que en ambos casos se imprime infixr 5. Quiere decir que tienen el mismo nivel de precedencia y que ambos asocian a la derecha. Como tienen el mismo nivel de precedencia entonces la asociatividad es lo único que nos interesa (como si fueran el mismo operador, digamos), y tenemos que x : xs ++ ys es igual a x : (xs ++ ys)

Todo esto es una cuestión sintáctica, la evaluación perezosa (o cualquier estrategia de evaluación que usaramos) no es lo que importa en este caso.