2016-02-19 93 views
0

我得到的模糊警告,有時錯誤,一直。這只是一個明確的例子。我使用的文檔測試:Haskell:處理模糊的進口

$ stack exec doctest -- src/Main.hs 

<interactive>:6:14: 
    Ambiguous occurrence ‘stdout’ 
    It could refer to either ‘Turtle.stdout’, 
         imported from ‘Turtle’ at src/Main.hs:6:1-13 
         (and originally defined in ‘Turtle.Prelude’) 
         or ‘System.IO.stdout’, 
         imported from ‘System.IO’ 
         (and originally defined in ‘GHC.IO.Handle.FD’) 
... 
Examples: 2 Tried: 2 Errors: 0 Failures: 0 

顯然,它的工作原理,至少暫時,但這些警告都是大部頭,討厭,而且很可能危險。

我試圖應付隱藏,像這樣(Main.hs,所有進口):

import Turtle 
import Prelude hiding (FilePath) 
import System.IO hiding (FilePath, stdout, stderr) -- trying to hide std... 
import Text.Regex.TDFA 

,但它沒有什麼區別。

是否有正確的一般方法?

+1

[約翰Tibell問題推薦](https://github.com/tibbe/haskell-style-guide/blob/master/haskell-style.md)爲「[a]總是使用顯式導入列表或合格導入標準和第三方庫」。 – Jubobs

+0

包括Prelude或System.IO在內的所有標準庫是否真的適合顯式導入列表方法? –

+0

@AlexeyOrlov IMO不是前奏 - 但是對於'System.IO'等,它甚至是一個很好的文檔 - 你的用戶可以看到他/她可能不知道的某些功能是從 – Carsten

回答

1

那麼你可以編輯您的.ghci文件,包括

:m - Prelude 

這樣GHCI不應該預裝Prelude但像Jubobs我建議你不要擺在首位重用這些名字或你進口(合格)與

import Turtle hiding (stdout) 
import qualified Turtle as T 
import Turtle (noOverlappingFunc, NonOverlappingType) 

它只是寫

T.stdout 
的小小的不便某種組合

改爲。

恕我直言它不是隱瞞從Prelude到很多東西是一個好主意 - 除了你看到的問題始終存在peaple閱讀你的代碼和他們預期

+0

導入的。它看起來不像'小麻煩'。它看起來像不可能的,因爲在我的源代碼中沒有對stdout的明確引用。 –

+0

err ...如果你不需要它,那麼只需使用'import turtle hiding(stdout)'問題解決了......當然這引發了你爲什麼試圖導入System.IO隱藏(stdout)的問題,因爲顯然你在這種情況下使用了'Turtle.stdout' – Carsten

+0

*不便*預先編寫了'T.',這對程序員IMO – Carsten