Sib*_*ibi 11 haskell typeclass ghci
有没有办法在ghci中查看特定类型的Typeclass定义?
例如,Maybe定义如下:
instance Functor Maybe where
fmap f (Just x) = Just (f x)
fmap f Nothing = Nothing
Run Code Online (Sandbox Code Playgroud)
我能在ghci看到这个吗?
当我:info在ghci中使用时,我得到了这个:
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'
Run Code Online (Sandbox Code Playgroud)
在上面的输出中,我想看看它是如何在Data.Maybe中定义的Functor.无论如何在ghci中看到它?
lef*_*out 12
不,这是不可能的 - 不只是为了实例,而是为了任何事情.GHC仅注册包的编译版本,因此源代码通常不可用于ghci.
也许,大多数情况下你会使用Hackage的东西; 在这种情况下,通过对模块进行hoogling,查找类或数据声明以及单击source来查找此类实例的源代码非常简单.
当您无法访问互联网或其他任何无法在线获取的原因时,您首先需要找出包含该模块的软件包.最简单的方法:
$ 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 0.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链接到你的东西(但在本地高清上),你也可以用户友好的方式浏览源代码.