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.