Как искать функции OCaml по имени и типу

В Haskell есть два основных способа поиска информации о функциях.

  1. Такие сайты, как Hoogle и Stackage. Эти сайты предоставляют два основных типа поиска:

    1. Поиск по названию функции. Например, вот поиск в Google для функции под названием catMaybes,

      Этот поиск возвращает тип catMaybes функция, а также пакет и модуль, в котором она определена.

      Основной вариант использования для этого типа поиска - когда вы видите функцию, используемую где-то, и хотите знать ее тип и в каком пакете она определена.

    2. Поиск типа функции. Например, вот поиск в Google для функции типа [Maybe a] -> [a],

      Этот поиск возвращает несколько функций схожего типа, первая из которых catMaybes, Он также возвращает пакет и модуль catMaybes определяется в.

      Основной вариант использования для этого типа поиска происходит, когда вы пишете код. Вы знаете тип функции, которая вам нужна, и вам интересно, если она уже где-то определена. Например, у вас есть список Maybes, и вы хотите вернуть список со всеми 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. Я наткнулся на некоторый код, использующий |> функция. Я задавался вопросом, была ли функция <| для составления противоположного пути. Тем не менее, я не знаю ни одного способа поиска функции под названием <|, Кроме того, я не знаю ни одного способа выяснить, где |> определено.

На основании приведенного выше кода, я думаю, |> Либо должно быть в Pervasives или где-то в ядре Джейн Стрит, но было бы неплохо иметь инструмент, который дал бы точное местоположение.

3 ответа

Решение

У awesome-ocaml есть раздел, посвященный инструментам разработки, которые должны быть полезны.

  • ocamloscope ( github) является своего рода Hoogle для OCaml. Поиск по названию работает хорошо. Поиск по типу менее хорош.
  • Для локального поиска по имени, ocp-browser предоставляет удобный TUI.
  • В вашем редакторе merlin и ocp-index могут выполнять поиск по определению и документацию по поиску.
  • Здесь есть публичный экземпляр WIP ODIG с большим количеством (но не со всеми) пакетами. Вы также можете использовать odig локально, как указано в другом ответе.

PS Функция, которую вы ищете @@ и это в стандартной библиотеке.

Пакет 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.

Мы добавили его, обновили до последней версии OCaml, исправили несколько ошибок и усовершенствовали процедуру унификации, чтобы улучшить поиск типов. Результат можно найти здесь.

Одной из основных функций является поиск по манифесту типа, который игнорирует такие не относящиеся к делу вещи, как упорядочение параметров в функциях, имена полей, различия между именами записей и кортежами (например, string * int такой же как {name : string; age : int}) и псевдонимы. Например, в нашем проекте довольно много псевдонимов, например, type bil = stmt list = Stmt.t list = Stmt.t Core_kernel.Std.list = ..., Вы можете выбрать любое имя при поиске (используя манифест типа), так как алгоритм правильно объединит все псевдонимы.

Одиг может быть полезным. После установки вы можете просматривать по пакетам и функциям.

Другие вопросы по тегам