在ghci中查看特定类型的Typeclass定义

时间:2013-08-18 23:41:33

标签: haskell typeclass ghci

有没有办法在ghci中查看特定类型的Typeclass定义?

例如,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中看到它?

1 个答案:

答案 0 :(得分:11)

不,这是不可能的 - 不仅仅是针对实例而是针对任何事情。 GHC只注册包的编译版本,因此源代码通常不能用于ghci。

可能,大多数情况下你会使用Hackage的东西;在这种情况下,通过hoogling the module查找此类实例的源代码非常简单,找到类或数据声明,然后单击source

当您无法访问互联网或其他任何无法在线获取的原因时,您首先需要了解包含该模块的。最简单的方法:

  

$ ghc-pkg find-module 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链接到你的内容(但在你的本地高清上),你也可以用户友好的方式浏览源代码。