Как искать функции OCaml по имени и типу
В Haskell есть два основных способа поиска информации о функциях.
Такие сайты, как Hoogle и Stackage. Эти сайты предоставляют два основных типа поиска:
Поиск по названию функции. Например, вот поиск в Google для функции под названием
catMaybes
,Этот поиск возвращает тип
catMaybes
функция, а также пакет и модуль, в котором она определена.Основной вариант использования для этого типа поиска - когда вы видите функцию, используемую где-то, и хотите знать ее тип и в каком пакете она определена.
Поиск типа функции. Например, вот поиск в Google для функции типа
[Maybe a] -> [a]
,Этот поиск возвращает несколько функций схожего типа, первая из которых
catMaybes
, Он также возвращает пакет и модульcatMaybes
определяется в.Основной вариант использования для этого типа поиска происходит, когда вы пишете код. Вы знаете тип функции, которая вам нужна, и вам интересно, если она уже где-то определена. Например, у вас есть список
Maybe
s, и вы хотите вернуть список со всемиNothing
с удален. Вы знаете, что функция будет иметь тип[Maybe a] -> [a]
,
Прямо из
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 = ...
, Вы можете выбрать любое имя при поиске (используя манифест типа), так как алгоритм правильно объединит все псевдонимы.
Одиг может быть полезным. После установки вы можете просматривать по пакетам и функциям.