如何按名称和类型搜索OCaml函数

时间:2017-02-02 13:27:47

标签: ocaml tooling

在Haskell中,有两种主要方法可以查找函数信息。

  1. HoogleStackage等网站。这些网站提供两种主要的搜索类型:

    1. 搜索功能名称。例如,here is a search on Hoogle表示名为catMaybes的函数。

      此搜索返回catMaybes函数的类型,以及它所定义的包和模块。

      此类搜索的主要用例是当您看到某个地方使用的函数并且您想知道它的类型以及它所定义的包时。

    2. 搜索功能的类型。例如,对于[Maybe a] -> [a]类型的函数,here is a search on Hoogle

      此搜索返回多个具有相似类型的函数,第一个函数为catMaybes。它还返回包,模块catMaybes在。

      中定义

      当您编写代码时,会发生此类搜索的主要用例。您知道所需功能的类型,并且您想知道它是否已在某处定义。例如,您有一个Maybe的列表,并且您希望返回一个列表,其中删除了所有Nothing个。您知道该函数将具有类型[Maybe a] -> [a]

  2. 直接来自ghci。在ghci中,只要函数已经在您的环境中,就可以很容易地使用:info命令获取有关函数的信息。

    例如,这是一个ghci会话,显示如何获取有关catMaybes函数的信息。请注意您必须首先导入Data.Maybes模块:

    > import Data.Maybe
    > :info catMaybes
    catMaybes :: [Maybe a] -> [a]   -- Defined in ‘Data.Maybe’
    >
    

    :info显示catMaybes的类型及其定义位置。

  3. 在OCaml中,可以使用哪些网站/工具来搜索名称或类型的功能?

    例如,我正在阅读Real World OCaml。我使用|>函数遇到some code。我想知道是否有一个函数<|用于组合相反的方式。但是,我不知道搜索名为<|的函数的任何方法。另外,我也不知道如何确定|>的定义。

    基于linked code above,我想|>要么必须在Pervasives中,要么在Jane Street的Core中,但是如果有一个工具可以提供给它确切的位置。

3 个答案:

答案 0 :(得分:9)

awesome-ocaml有a section on dev tools应该有帮助。

  • ocamloscopegithub)有点像OCaml的Hoogle。按名称搜索效果很好。按类型搜索不太好。
  • 对于按名称进行本地搜索,ocp-browser提供了方便的TUI。
  • 在您的编辑器中,merlin和ocp-index可以执行查找到定义和查找文档。
  • 有一个带有很多(但不是全部)包的odig here的WIP公共实例。您也可以在本地使用odig,如另一个答案中所述。

P.S。您要查找的功能是@@,它位于标准库中。

答案 1 :(得分:3)

ocp-index包提供了搜索API函数的基本工具,例如

{name : string; age : int}

ocp-browser是这个实用程序的漂亮界面。

它们都与Emacs(以及其他流行的文本编辑器)集成在一起。说到文本编辑器和IDE,Merlin是一个杀手级功能,没有它我无法想象OCaml编码。它能够直接跳转到定义,提取文档和增量类型检查。

说到基于网络的搜索,有一个argot文档生成器,它有一个API搜索引擎,具有类型搜索,全文搜索和正则表达式。一个项目有点被抛弃,并不适用于最新的OCaml。

我们forked,更新到最新的OCaml,修复了一些错误,并增强了统一程序以获得更好的类型搜索。结果可以找到here

其中一个主要功能是按类型清单搜索,忽略了诸如函数中的参数排序,字段名称,记录名称和元组之间的差异等无关紧要的事情(例如,type bil = stmt list = Stmt.t list = Stmt.t Core_kernel.Std.list = ...与{{1}相同}和)别名。例如,在我们的项目中有很多别名,例如myentry。您可以在搜索时选择任何名称(使用类型清单),因为算法将正确统一所有别名。

答案 2 :(得分:2)

odig可能会有所帮助。安装后,您可以按包和按功能进行浏览。