2013-08-18 36 views
9

有沒有辦法在ghci中查看特定類型的Typeclass定義?在ghci中查看特定類型的定義

例如,Maybe定義是這樣的:

instance Functor Maybe where 
    fmap f (Just x) = Just (f x) 
    fmap f Nothing = Nothing 

我可以看到這個在ghci中?

的時候,我在ghci中使用:info,我得到這個:

Prelude> :i Maybe 
data Maybe a = Nothing | Just a  -- Defined in `Data.Maybe' 
instance Eq a => Eq (Maybe a) -- Defined in `Data.Maybe' 
instance Monad Maybe -- Defined in `Data.Maybe' 
instance Functor Maybe -- Defined in `Data.Maybe' 
instance Ord a => Ord (Maybe a) -- Defined in `Data.Maybe' 
instance Read a => Read (Maybe a) -- Defined in `GHC.Read' 
instance Show a => Show (Maybe a) -- Defined in `GHC.Show' 

在上面的輸出,我想看看它是如何在Data.Maybe定義爲實例Functor。無論如何看到在ghci?

回答

11

不,這是不可能的 - 不僅僅是爲了實例,而是爲了任何事情。 GHC只註冊一個包的編譯版本,所以源代碼一般不會提供給ghci。

可能多數情況下,你會使用Hackage的東西;在這種情況下,通過hoogling the module查找這些實例的源代碼非常簡單,找到類或數據聲明並單擊source

當您沒有互聯網接入或任何其他原因你無法在線上網時,你首先需要找出該模塊是否包括在內。最簡單的方法做到這一點:

$ GHC-PKG找到模塊Data.Maybe
/usr/local/haskell/lib/ghc-7.6.2/package.conf.d
基地 - 4.6 .0.1
haskell2010-1.1.1.0
〜/ .ghc/x86_64的-Linux的7.6.2/package.conf.d

然後,如我說,GHC不知道在哪裏的源代碼到這些軟件包的位置 - 實際上它甚至可能不在您的系統上!但是如果你已經安裝了cabal install的軟件包(或者依賴它的軟件包),它將會在那裏,默認情況下在~/.cabal/packages/hackage.haskell.org/PᴀᴄᴋᴀɢᴇNᴀᴍᴇ(作爲一個壓縮存檔,但這不是一個很大的障礙)。在包項目文件夾中,您可以通過代表模塊層次結構的目錄結構簡單地找到模塊。

其他軟件包,例如Data.Maybe(軟件包haskell2010)的示例,可能在您安裝GHC後即可正常使用。 Haskell平臺。在這種情況下,我相信最簡單的事情就是在那裏搜索Haddock文檔文件。在我的情況下,

$ find/usr/local/haskell -name'Data-Maybe.html'|頭-n1 | xargs firefox

這將打開相當於hoogle鏈接到您(但在本地HD)的內容,您還可以通過用戶友好的方式瀏覽源代碼。

+0

在您自己的機器上運行hoogle相當簡單('cabal install; hoogle data')。 – aavogt

+0

@aavogt:對,但命令行搜索不會給你很好的鏈接,像在線版本的黑線鱈。將它用作本地服務器並不那麼簡單。 – leftaroundabout

+1

爲了搜索'data Double'和它的實現,比如說'+'符合'Num',這個方法仍然沒有提供一種查看源代碼的方法。 hoogle中的'Maybe'示例提供了一個與源代碼的鏈接,但是一般來說它並不是。 – ely