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

问题描述 投票:0回答:4

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

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

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

      catMaybes
      的函数。

      此搜索返回

      catMaybes
      函数的类型,以及定义它的包和模块。

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

    2. 搜索函数的类型。例如,这里是在 Hoogle 上搜索

      [Maybe a] -> [a]
      类型的函数。

      此搜索返回多个具有相似类型的函数,其中第一个是

      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
    的类型及其定义位置。


在 OCaml 中,哪些站点/工具可用于按 名称或类型搜索函数?

例如,我正在阅读Real World OCaml。我使用 |> 函数遇到了

some code
。我想知道是否有一个函数
<|
可以以相反的方式进行组合。但是,我不知道有什么方法可以搜索名为
<|
的函数。另外,我不知道有什么方法可以找出
|>
的定义位置。

根据上面的链接代码,我猜

|>
要么必须在Pervasives中,要么在Jane Street核心的某个地方,但如果有一个工具能够给出确切的位置那就太好了。

ocaml tooling
4个回答
10
投票

awesome-ocaml 有 有关开发工具的部分应该会有所帮助。

附注您正在寻找的函数是

@@

,它位于标准库中。


5
投票

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

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

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

它们都与 Emacs(和其他流行的文本编辑器)集成。说到文本编辑器和 IDE,

Merlin 是一个杀手级功能,没有它我就无法想象 OCaml 编码了。它能够直接跳转到定义、提取文档和增量类型检查。

说到基于网络的搜索,有一个

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

我们对其进行了

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

主要功能之一是按类型清单进行搜索,它会忽略诸如函数中的参数排序、字段名称、记录名称和元组之间的差异(例如,

string * int

{name : string; age : int}
相同)和别名等不相关的事情。例如,在我们的项目中,有相当多的别名,例如
type bil = stmt list = Stmt.t list = Stmt.t Core_kernel.Std.list = ...
。您在搜索时可以选择任何名称(使用类型清单),因为算法将正确统一所有别名。 



0
投票
最近有这个网站:

https://doc.sherlocode.com/

© www.soinside.com 2019 - 2024. All rights reserved.