Quand j'essaye de compiler
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
est syntaxiquement valide par lui-même, bien qu'il ne définisse pas réellement x
. Mais pourquoi est-ce le cas?
Il est valide car il définit +
au lieu.
main = print (3 + 4)
where -- silly redefinition of `+` follows
0 + y = y
x + y = x * ((x-1) + y)
Ci-dessus, le prélude (+)
La fonction est assombrie par une liaison locale. Le résultat sera 24
, ne pas 7
, par conséquent.
L'activation des avertissements doit signaler la dangereuse observation.
<interactive>:11:6: warning: [-Wname-shadowing]
This binding for ‘+’ shadows the existing binding
Vous définissez une fonction locale appelée +
.
2 + x = 7
est équivalent à (+) 2 x = 7
, ce qui équivaut à
(+) y x | y == 2 = 7
x
est un paramètre (non utilisé), et la fonction n'est définie que 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.