48 votes

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

Quand j'essaie de compiler

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

Le CGH se plaint

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

Il semble donc que 2 + x = 7 est en soi syntaxiquement valide, bien qu'il ne définisse pas réellement l'option x . Mais pourquoi en est-il ainsi ?

4 votes

Haskell signale souvent la première erreur fatale, seulement. Mettez un chiffre à l'endroit où la première erreur hors de portée x est de voir des erreurs supplémentaires, c'est-à-dire, x hors sujet

10 votes

C'est de mieux en mieux. Par exemple, let 1+1 = 3 in 1+1 .

2 votes

@Alec En effet ! Encore mieux, let 1+1=3 in 1+1 évalue à 3 (pas 2 ), tandis que let 2=3 in 2 évalue à 2 (pas 3 ). Et, dans l'ancien Haskell, let x+2=7 in x utilisé pour évaluer à 5 contrairement à let 2+x=7 in x (heureusement, ce n'est plus le cas).

70voto

chi Points 8104

Elle est valide parce qu'elle définit + à la place.

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 de l'UE est assombrie par un lien local. Le résultat sera 24 pas 7 par conséquent.

L'activation des avertissements devrait signaler les ombres dangereuses.

<interactive>:11:6: warning: [-Wname-shadowing]
    This binding for ‘+’ shadows the existing binding

37voto

melpomene Points 5675

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

2 + x = 7 est équivalent à (+) 2 x = 7 ce qui est équivalent à

(+) y x | y == 2 = 7

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X