在ghci中,如何删除现有的绑定?

时间:2017-07-03 21:35:08

标签: haskell ghci

我得到一个"绑定阴影现有的绑定"错误类似于this问题中的错误。

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

我在会话的早期定义了现有的绑定,现在我正在尝试重新定义它。 有没有办法删除现有的绑定,以便我可以重新定义t

我注意到在其他情况下,重新定义现有绑定时ghci不会出错。例如

Prelude> let t = 1
Prelude> let t = 2
Prelude> let t = "there"

为什么在某些情况下重新定义现有绑定而非其他情况下ghci会出错?

1 个答案:

答案 0 :(得分:3)

  

有没有办法删除现有的绑定,以便我可以重新定义t

不,您无法删除现有绑定。但是,您可以随时重新定义t,没问题。

  

为什么在某些情况下重新定义现有绑定而不在其他情况下重新定义ghci会出错?

因为您运行了具有不同警告/错误设置的ghci;例如通过在命令行上传递-Wname-shadowing(可能是因为您通过cabal或堆栈运行ghci,并且关联的项目在其.cabal文件中指定了此选项)。注: -Wname-shadowing不应该阻止您重新定义t,除非与-Werror合并,将仅仅警告变成一个完整的错误。

根据您是否使用let,行为似乎也有所不同;这可能是一个错误:

% 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