如何在ghci中查找实例信息?

3

我可以在ghci中看到Maybe的数据构造函数和实例:

Prelude Control.Applicative> :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'
instance Applicative Maybe -- Defined in `Control.Applicative'
instance Alternative Maybe -- Defined in `Control.Applicative'

我可以在ghci中看到Applicative类型类的定义:

Prelude Control.Applicative> :i Applicative
class Functor f => Applicative f where
  pure :: a -> f a
  (<*>) :: f (a -> b) -> f a -> f b
  (*>) :: f a -> f b -> f b
  (<*) :: f a -> f b -> f a
    -- Defined in `Control.Applicative'
instance Applicative [] -- Defined in `Control.Applicative'
instance Applicative ZipList -- Defined in `Control.Applicative'
instance Monad m => Applicative (WrappedMonad m)
  -- Defined in `Control.Applicative'
instance Applicative Maybe -- Defined in `Control.Applicative'
instance Applicative IO -- Defined in `Control.Applicative'
instance Applicative (Either e) -- Defined in `Control.Applicative'
instance Applicative ((->) a) -- Defined in `Control.Applicative'

但是我该如何查找关于特定实例(例如instance Alternative Maybe)的信息呢?

1
我认为你可能无法提取实际代码,因为 GHCi 可能无法访问它。您想要看到什么? - daniel gratzer
@jozefg 你去看看 Haskell 的开发人员是如何实现那个接口的? - thkang
不仅仅是在 GHCi 中,为了进行本地搜索,“cabal get base” 将会给你一个标准库最新版本的源代码副本,可以使用 grep 进行搜索(GHC/Base.hs 文件的第 685 行可以找到 instance Alternative Maybe)。然而,GHCi 只能处理多种编译后的代码表示方式,所以遗憾的是,你无法通过向它请求打印实例的源代码来得到太多帮助。 - daniel gratzer
1
另外,在我经常使用的Haskell库的Haddock页面上有一个“查看源代码”链接。现在它甚至具有不那么糟糕的语法高亮 :) 如果您使用emacs,它也可以在类似w3m的工具中使用。 - daniel gratzer
1个回答

4

ghci 没有任何命令可以显示函数和实例的底层源代码,虽然如果有这样的功能会很不错。

我找到这些东西的方法是在 hackage 上找到它们(对于 base 中的内容,使用 hoogle 是正确的选择)。然后 haddocks 从文档中包含链接到源代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接