web-dev-qa-db-fra.com

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

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?

48
Fred Miller

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
69
chi

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.

37
melpomene