I am getting a "binding shadows the existing binding" error similar to the one from this question.
Prelude Api.Facility Control.Monad.IO.Class> let t = getBadgesNot 1 (Nothing) (Just 1) <interactive>:55:5: warning: [-Wname-shadowing] This binding for ‘t’ shadows the existing binding defined at <interactive>:39:5
I defined the existing binding earlier in the session, and am now trying to redefine it. Is there a way to remove the existing binding so that I can redefine t
?
I notice that in other circumstances ghci does not error when redefining an existing binding. For example
Prelude> let t = 1 Prelude> let t = 2 Prelude> let t = "there"
Why does ghci error when redefining an existing binding in some cases and not in others?
Is there a way to remove the existing binding so that I can redefine t
?
No, you cannot remove the existing binding. However, you can redefine t
at any time, no problem.
Why does ghci error when redefining an existing binding in some cases and not in others?
Because you ran ghci with different warning/error settings; e.g. by passing -Wname-shadowing
on the command line (perhaps because you ran ghci through cabal or stack, and the associated project specifies this option in its .cabal file). N.B. -Wname-shadowing
should not prevent you from redefining t
unless combined with -Werror
to turn the mere warning into a full-blown error.
The behavior also appears to differ depending on whether you use let
or not; this is probably a bug:
% ghci -Wname-shadowing -Werror > let t=3 > let t=4 <interactive>:3:5: warning: [-Wname-shadowing] This binding for ‘t’ shadows the existing binding defined at <interactive>:1:5 <no location info>: error: Failing due to -Werror. > t 3 > t=4 > t 4