关于Haskell:在ghci中查看特定类的Typeclass定义

Seeing Typeclass definition in ghci for a specific type

是否可以在ghci中查看特定类型的Typeclass定义?

例如,Maybe的定义如下:

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

我可以在ghci中看到这个吗?

当我在ghci中使用:info时,得到以下信息:

1
2
3
4
5
6
7
8
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中看到它?


不,这不仅对实例而且对任何事物都是不可能的。 GHC仅注册软件包的编译版本,因此ghci通常不会使用源代码。

大概,大多数情况下,您将使用Hackage中的内容;在这种情况下,通过对模块进行定位,查找类或数据声明并单击源来查找此类实例的源代码非常简单。

当您无法访问互联网或出于其他原因无法在线上网时,您首先需要找出该模块包含在哪个程序包中。最简单的方法:

$ ghc-pkg find-module Data.Maybe
/usr/local/haskell/lib/ghc-7.6.2/package.conf.d
???base-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' | head -n1 | xargs firefox

这将打开与hoogle链接的等效项(但在本地HD上),您还可以在其中以一种用户友好的方式浏览源代码。