コンパイルしようとすると
main = putStrLn $ show x where
2 + x = 7
GHCからの不満
error: Variable not in scope: x
|
1 | main = putStrLn $ show x
| ^
したがって、2 + x = 7
自体は構文的に有効であるように見えますが、実際にはx
を定義していません。しかし、なぜそうなのでしょうか?
代わりに+
を定義しているため有効です。
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
+
というローカル関数を定義しています。
2 + x = 7
は(+) 2 x = 7
と同等です。
(+) y x | y == 2 = 7
x
は(未使用の)パラメーターであり、関数は最初の引数が2
の場合にのみ定義されます。これはあまり有用ではありませんが、x
が外から見えない理由を説明しています。