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

how to search for OCaml functions by name and type

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

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

    1. 正在搜索函数名称。例如,here is a search on Hoogle 对应一个名为 catMaybes.

      的函数

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

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

    2. 正在搜索函数的类型。例如,here is a search on Hoogle 表示 [Maybe a] -> [a].

      类型的函数

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

      此类搜索的主要用例发生在您编写代码时。您知道所需函数的类型,并且想知道它是否已在某处定义。例如,您有一个 Maybe 的列表,并且您想要 return 一个删除所有 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 的类型及其定义位置。


在OCaml中,什么sites/tools可以用来通过名称或类型搜索函数?

例如,我正在使用 |> 函数通读 Real World OCaml. I came across some code。我想知道是否有函数 <| 用于以相反的方式组合。但是,我不知道有什么方法可以搜索名为 <| 的函数。另外,我不知道有什么方法可以找出 |> 的定义位置。

根据 linked code above,我猜想 |> 要么必须在 Pervasives 中,要么必须在 Jane Street 的核心中的某个地方,但是如果有一个工具可以给出准确的位置就更好了.

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

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

  • ocamloscope (github) 有点像 OCaml 的 Hoogle。按名称搜索效果很好。按类型搜索不太好。
  • 对于按名称进行本地搜索,ocp-browser 提供了方便的 TUI。
  • 在您的编辑器中,merlin 和 ocp-index 可以执行 lookup-to-definition 和 lookup-documentation。
  • 本地也有一个 odig here with a lot (but not all) packages. You can use odig 的 WIP public 实例,如另一个答案所述。

P.S。您要查找的函数是 @@,它在标准库中。

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

$ ocp-index locate '|>'
/home/ivg/.opam/devel/build/ocaml/stdlib/pervasives.ml:39:0

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

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

说到 web-based 搜索,有一个 argot 文档生成器,它有一个 API 搜索引擎,具有类型搜索、full-text 搜索和正则表达式。一个项目有点被遗弃并且不能使用最新的 OCaml。

我们forked it, update to the latest OCaml, fixed a few bugs, and enhanced the unification procedure to get a better type search. The result can be found here.

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