2013-08-18 25 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