2017-07-03 51 views
4

我收到了一個類似於this問題的「綁定陰影現有綁定」錯誤。在ghci中,如何刪除現有的綁定?

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的錯誤現有的在某些情況下,而不是在別人綁定?

+3

嘗試'前奏>:unset -Wname-shadowing'。它在那裏說「警告」,而不是「錯誤」。 –

回答

3

有沒有辦法刪除現有的綁定,以便我可以重新定義t

不,您不能刪除現有的綁定。不過,您可以隨時重新定義t,沒問題。

爲什麼在某些情況下重新定義現有綁定時出現ghci錯誤,而在其他情況下卻不存在?

因爲你用不同的警告/錯誤設置運行ghci;例如通過在命令行上傳遞-Wname-shadowing(可能是因爲您通過cabal或stack運行ghci,並且關聯的項目在其.cabal文件中指定了此選項)。注: -Wname-shadowing不應阻止您重新定義t,除非與-Werror合併將純粹的警告轉變爲全面的錯誤。

此行爲也會有所不同,具體取決於您是否使用let;這可能是一個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 
+0

'let'在ghci中是可選的嗎? – Cubic

+1

@Cubic是:https://ghc.haskell.org/trac/ghc/ticket/7253 – Shersh

相關問題