Pourquoi Haskell est-il valide à 2 + x = 7?

Quand j’essaie de comstackr

main = putStrLn $ show x where 2 + x = 7 

GHC se plaint

 error: Variable not in scope: x | 1 | main = putStrLn $ show x | ^ 

Il semble donc que 2 + x = 7 soit en lui-même syntaxiquement valide, bien qu’il ne définisse pas réellement x . Mais pourquoi c’est comme ça?

Il est valide car il définit plutôt + .

 main = print (3 + 4) where -- silly redefinition of `+` follows 0 + y = y x + y = x * ((x-1) + y) 

Au-dessus, la fonction Prelude (+) est masquée par une liaison locale. Le résultat sera 24 , pas 7 , par conséquent.

L’activation des avertissements devrait indiquer que l’observation est dangereuse.

 :11:6: warning: [-Wname-shadowing] This binding for '+' shadows the existing binding 

Vous définissez une fonction locale appelée + .

2 + x = 7 équivaut à (+) 2 x = 7 , ce qui équivaut à

 (+) yx | y == 2 = 7 

x est un paramètre (inutilisé) et la fonction est uniquement définie si le premier argument est 2 . Ce n’est pas très utile, mais cela explique pourquoi x n’est pas visible à l’extérieur.