如何在Haskell中找到一个类的源代码(实现)

4
我正在阅读IxSet的文档,链接如下http://happstack.com/docs/crashcourse/AcidState.html#ixset ,我想查看从Data.IxSet导入的Indexable类型类的源代码。
于是我查看了Happstack的存储库(darcs get http://patch-tag.com/r/mae/happstack),但这让我更加沮丧。
我看到了happstack/happstack-ixset/src/Happstack/Data/IxSet.hs文件,它创建了一个Happstack.Data.IxSet模块,但我无法找到哪个文件创建了一个Data.IxSet模块(并实现了Indexable类)。

你提供的页面链接指向一个包: "IxSet可以在这里找到hackage". 到达那里后,我们只需要检查两个模块。点击后,我们跳转到Haddock文档页面。在那里,我们可以使用浏览器的“查找”功能。当我们找到它时,在其右侧有一个“源”链接。 - Will Ness
2个回答

5

获取Haskell代码的首选地址是hackage。网站首页方便地提供了Hayoo的链接,这是除Hoogle之外的另一个主要的Haskell搜索引擎。两者各有优劣。

Hayoo索引了hackage上的所有软件包,默认情况下搜索包括hackage上的所有软件包。如果您想要搜索一个已知名称,例如Indexable,那么更方便的引擎是它,特别是如果您不知道该名称来自哪个软件包。目前第五个搜索结果会带您到Data.IxSet.Indexable。在Haddock文档的右侧,您会找到一个Source链接,该链接会带您到hscoloured源代码(在这种情况下,这并不是非常有信息量,因为只有一个类成员,没有默认实现,它对文档没有任何说明)。
Hoogle默认只搜索少量的软件包,如果你想在搜索中包括其他软件包,则需要通过添加+packagename来指定,但这将限制搜索范围。有关Hoogle搜索的更多信息,请参见manual。Hoogle的优势在于按类型搜索。Hoogle按类型搜索对搜索的类型应用更多的转换,因此比Hayoo找到更多的匹配项,如果您不知道确切的类型(然而,这也有缺点,有时会出现许多无关的命中)。例如,如果您搜索Map k a -> k -> Maybe a,Hoogle的第一个结果是最有可能的候选项Data.Map.lookup :: Ord k => k -> Map k a -> Maybe a,而Hayoo没有找到它,因为它不对参数进行排列。
无论哪种方式,两个搜索引擎都会将您带到hackage的Haddock文档中查询的实体(如果搜索成功),从那里Source链接可以带您到代码,如果您愿意的话。

丹尼尔,你知道找到给定实例定义的(好)方法吗? - Will Ness
可能有一种方便的方法,我们只是不知道而已。要找到从:i获取的源文件(如果您在查询时两个类和类型都在范围内),您可以检查本地的haddocks或Hayoo;是的,这并不是很方便,但可以改进。但是要改进它,您必须决定要实现什么,并找到有时间实现它并且足够了解相关源代码的人。这是可能的,但考虑到有限的人力资源,不应该期望在本周内完成。 - Daniel Fischer
@k_bx 是的,如果cabal默认在某个地方解压源代码,我也会很喜欢。但是由haddocking生成的hscoloured源文件可以让我们在不需要实际源文件的情况下走得更远,所以我可以接受这种方式,并在需要查看实际源代码时使用cabal unpack来解压包。 - Daniel Fischer
感谢 cabal unpack,我也会看一下它!(因为查看使用的相同版本源代码始终更好)。 - Konstantine Rybnikov
你是否听说过“来源”这个编程概念?每一位程序员都应该知道代码的来源。如果我只是使用一个包,我不想弄乱源代码 - 我希望它被认为是不属于我的,所以我更喜欢将其放在网络上。只有当我想要修改源代码时,才应该将其变成我的,并将其保存在本地。 - Will Ness
显示剩余7条评论

1

使用 Haddock 文档,可以在本地生成或在线查看。谷歌搜索通常会在最顶部返回相关文档。这些文档交叉链接,因此您可以轻松转到需要的模块。每个定义旁边都有到源代码的链接, 例如

这个特定的模块属于基础库集合。


如果您知道某个名称或类型,但不知道它在哪个包中,Hoogle也是一个很好的起点。 - Davorak
抱歉,我好像不太明白。这是Data.Ix,而不是Data.IxSet(或者我漏看了什么?),你提供的链接页面中没有提到“Indexable”类(因此我看不到它的定义链接)。 - Konstantine Rybnikov
1
好的,我使用了谷歌,在搜索栏中输入 "Data.IxSet" 并找到了 http://hackage.haskell.org/packages/archive/ixset/1.0.2/doc/html/Data-IxSet.html#t:Indexable ,这正是我需要的。但是除了谷歌,有没有其他查找所需内容的方式呢?我的意思是,我知道模块和类名。我该如何找到它的源代码呢?也许在本地某个地方。 - Konstantine Rybnikov
抱歉,链接错误(http://hackage.haskell.org/packages/archive/ixset/1.0.5/doc/html/Data-IxSet.html)。 - n. m.
你可以在本地构建Hoogle和Haddock,并从GHCI中使用它们(参见GOA)。 - n. m.
显示剩余2条评论

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