web-dev-qa-db-ja.com

なぜ `2 + x = 7`が有効なHaskellなのですか?

コンパイルしようとすると

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

GHCからの不満

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

したがって、2 + x = 7自体は構文的に有効であるように見えますが、実際にはxを定義していません。しかし、なぜそうなのでしょうか?

48
Fred Miller

代わりに+を定義しているため有効です。

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

上記では、Prelude (+)関数はローカルバインディングによってシャドウされています。結果は、24ではなく7になります。

警告をオンにすると、危険なシャドウイングが指摘されるはずです。

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

+というローカル関数を定義しています。

2 + x = 7(+) 2 x = 7と同等です。

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

xは(未使用の)パラメーターであり、関数は最初の引数が2の場合にのみ定義されます。これはあまり有用ではありませんが、xが外から見えない理由を説明しています。

37
melpomene