Duda sobre asociacion de operadores

Duda sobre asociacion de operadores

de Rodrigo Sebastian Gallardo Negrín -
Número de respuestas: 1

Buenas!

Haciendo ejercicios me surgió la siguiente duda. Si tengo una expresión: x : xs ++ ys , que se evaluá primero y en que orden?

Podría ser (x : xs) ++ ys o x : (xs ++ ys) y creo que cualquiera de las dos podría ser valida. Me inclino mas por la segunda ya que por lazy evaluation se intentara evaluar la expresión de mas a la izquierda primero (el operador :) y este mismo asocia a la derecha. Sin embargo no estoy muy seguro de ese razonamiento.

Espero su respuesta! Desde ya muchas gracias.

Saludos,

Rodrigo

En respuesta a Rodrigo Sebastian Gallardo Negrín

Re: Duda sobre asociacion de operadores

de Juan Pablo García Garland -

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.