Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In ghci, how to remove an existing binding?

Tags:

haskell

ghci

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?

like image 654
mherzl Avatar asked Jul 03 '17 21:07

mherzl


People also ask

How do I disable ghci?

Quits GHCi. You can also quit by typing control-D at the prompt. Attempts to reload the current target set (see :load ) if any of the modules in the set, or any dependent module, has changed.

How do I load a Haskell file into ghci?

Open a command window and navigate to the directory where you want to keep your Haskell source files. Run Haskell by typing ghci or ghci MyFile. hs. (The "i" in "GHCi" stands for "interactive", as opposed to compiling and producing an executable file.)


1 Answers

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
like image 59
Daniel Wagner Avatar answered Oct 29 '22 12:10

Daniel Wagner