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

ill*_*out 7 ocaml tooling

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

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

    1. 搜索函数的名称.例如,这里是在Hoogle上搜索一个名为的函数catMaybes.

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

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

    2. 搜索函数的类型.例如,这里是在Hoogle上搜索类型的函数[Maybe a] -> [a].

      此搜索返回多个具有相似类型的函数,第一个函数是catMaybes.它还返回包和模块catMaybes的定义.

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

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

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

    > import Data.Maybe
    > :info catMaybes
    catMaybes :: [Maybe a] -> [a]   -- Defined in ‘Data.Maybe’
    >
    
    Run Code Online (Sandbox Code Playgroud)

    :info显示它的类型catMaybes和定义的位置.


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

例如,我正在阅读Real World OCaml.我使用该函数遇到了一些代码|>.我想知道是否有一个<|以相反方式编写的功能.但是,我不知道有任何搜索函数的方法<|.另外,我不知道如何确定|>定义的位置.

根据上面的链接代码,我猜想|>要么必须在Pervasives中,要么在Jane Street的Core中,但是如果有一个工具可以提供确切的位置,那就太好了.

Dru*_*rup 9

awesome-ocaml有一个关于开发工具的部分,应该会有所帮助.

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

PS您正在寻找的功能是@@,它在标准库中.


ivg*_*ivg 5

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

$ ocp-index locate '|>'
/home/ivg/.opam/devel/build/ocaml/stdlib/pervasives.ml:39:0
Run Code Online (Sandbox Code Playgroud)

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

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

说到基于网络的搜索,有一个隐语文档生成器,它有一个 API 搜索引擎,具有类型搜索、全文搜索和正则表达式的功能。一个项目有点被废弃,不能与最新的 OCaml 一起使用。

我们分叉了它,更新到最新的 OCaml,修复了一些错误,并增强了统一过程以获得更好的类型搜索。结果可以在这里找到。

主要功能之一是按类型清单进行搜索,它忽略诸如函数中的参数排序、字段名称、记录名称和元组之间的差异(例如,string * int与 相同{name : string; age : int})和别名等不相关的事物。例如,在我们的项目中,有相当多的别名,例如type bil = stmt list = Stmt.t list = Stmt.t Core_kernel.Std.list = .... 您在搜索时可以选择任何名称(使用类型清单),因为算法将正确统一所有别名。