Поисковая система F# API — это поисковая система, которая позволяет выполнять поиск API-интерфейсов F# по сигнатуре или имени.
название проекта | обзор |
---|---|
FSharpApiSearch | Тело поисковой системы |
FSharpApiSearch.База данных | Инструмент создания базы данных поисковых систем |
FSharpApiSearch.Console | Интерфейс поисковой системы (консольное приложение) |
Загрузите zip-файл со страницы выпуска и распакуйте его.
Сначала запустите FSharpApiSearch.Database.exe, чтобы создать базу данных.
FSharpApiSearch.Database.exe
По умолчанию можно искать сборки FSharp.Core
, mscorlib
, System
и System.Core
. Вы можете добавить цели поиска, указав сборку при создании базы данных. Вы можете указать каталог для поиска сборок с помощью опции --lib
. Также укажите сборки, от которых зависит указанная сборка.
FSharpApiSearch.Database.exe --lib:TargetAssemblyDirectory TargetAssembly1 TargetAssembly2 DependentAssembly
Если вы запустите FSharpApiSearch.Console.exe без запроса, он запустится в интерактивном режиме. Введите #q
, чтобы выйти из интерактивного режима.
FSharpApiSearch.Console.exe
Если вы передадите запрос в качестве аргумента, поиск будет выполнен только один раз.
FSharpApiSearch.Console.exe "int -> int"
Используйте опцию --target
, чтобы фактически использовать созданную базу данных для поиска.
FSharpApiSearch.Console.exe --target:TargetAssembly1 --target:TargetAssembly2
Если вы используете опцию --target
, стандартные FSharp.Core
, mscorlib
, System
и System.Core
не будут включены в цель поиска, поэтому, если вы хотите включить их в цель поиска, укажите их явно.
FSharpApiSearch.Console.exe --target:TargetAssembly1 --target:TargetAssembly2 --target:FSharp.Core --target:mscorlib --target:System --target:System.Core
respect-name-difference
Если включена опция respect-name-difference
, при поиске учитываются различия в именах переменных разных типов и именованных подстановочных знаках в запросе. Разные имена не соответствуют одному и тому же типу. Например, запрос ?a -> ?a
соответствует сигнатуре int -> int
, но запрос ?a -> ?b
не соответствует int -> int
.
Если эта опция отключена, запрос ?a -> ?b
будет соответствовать int -> int
.
greedy-matching
Если включена опция greedy-matching
, переменные типа и другие типы будут сопоставляться индивидуально, а результаты будут отсортированы и отображены в порядке убывания соответствия. Кроме того, при поиске теперь учитываются ограничения типов.
ignore-param-style
Существует два типа форматов аргументов для функций и методов: каррированный формат ( arg1 -> arg2 -> returnType
) и формат кортежа ( arg1 * arg2 -> returnType
). Если опция ignore-param-style
включена, при сопоставлении игнорируются форматы каррирования и кортежей.
ignore-case
Если опция ignore-case
включена, регистр игнорируется при сопоставлении имен API и имен типов.
substring
Если опция substring
включена, поиск осуществляется по подстроке.
swap-order
Если опция swap-order
включена, поиск поменяет порядок аргументов и кортежей. Например, запрос a -> b -> c
соответствует b -> a -> c
.
complement
вариант Если опция complement
включена, завершает работу и ищет недостающие аргументы и элементы кортежа. Например, запрос a * c
соответствует a * b * c
.
single-letter-as-variable
Если включен параметр single-letter-as-variable
, однобуквенные имена типов рассматриваются как имена переменных типа. Например, запрос t list
аналогичен 't list
.
language
вариант Переключает запросы, поиск и отображение результатов на язык программирования, указанный в параметре language
. Этот вариант принимает F# и C#.
xmldoc
Если опция xmldoc
включена, в результатах поиска отображаются XML-документы.
Запросы F# по сути аналогичны сигнатурам F#. Подробно будет объяснено только расширение FSharpApiSearch.
>
— это запрос при запуске FSharpApiSearch.Console.exe в интерактивном режиме.
API | Пример запроса |
---|---|
Функции и значения модуля | int -> string |
запись, поле структуры | Ref<'a> -> 'a |
дискриминируемый профсоюз | 'a -> Option<'a> |
член | 'a list -> int |
конструктор | Uri : _ Uri.new : _ Uri..ctor : _ |
Имя (имя функции, имя члена и т. д.) | head : 'a list -> 'a head |
активный шаблон | (||) : ... -> Expr -> ? |
Типы, сокращения типов, модули | List<'T> |
выражение вычисления | { let! } : Async<'T> |
Поиск подтипа | #seq<'a> -> 'a |
Для поиска по имени напишите name : signature
или name
. Если вы не указываете подпись, укажите _
в части подписи.
> id : 'a -> 'a
Microsoft.FSharp.Core.Operators.id: 'T -> 'T, module value, FSharp.Core
> choose
Microsoft.FSharp.Collections.Array.Parallel.choose: ('T -> option<'U>) -> 'T[] -> 'U[], module value, FSharp.Core
Microsoft.FSharp.Collections.Array.choose: ('T -> option<'U>) -> 'T[] -> 'U[], module value, FSharp.Core
Microsoft.FSharp.Collections.List.choose: ('T -> option<'U>) -> list<'T> -> list<'U>, module value, FSharp.Core
Microsoft.FSharp.Collections.Seq.choose: ('T -> option<'U>) -> seq<'T> -> seq<'U>, module value, FSharp.Core
Microsoft.FSharp.Control.Event.choose: ('T -> option<'U>) -> IEvent<'Del, 'T> -> IEvent<'U>, module value, FSharp.Core
when 'Del : delegate and 'Del :> Delegate
Microsoft.FSharp.Control.Observable.choose: ('T -> option<'U>) -> IObservable<'T> -> IObservable<'U>, module value, FSharp.Core
> choose : _
Microsoft.FSharp.Collections.Array.Parallel.choose: ('T -> option<'U>) -> 'T[] -> 'U[], module value, FSharp.Core
Microsoft.FSharp.Collections.Array.choose: ('T -> option<'U>) -> 'T[] -> 'U[], module value, FSharp.Core
Microsoft.FSharp.Collections.List.choose: ('T -> option<'U>) -> list<'T> -> list<'U>, module value, FSharp.Core
Microsoft.FSharp.Collections.Seq.choose: ('T -> option<'U>) -> seq<'T> -> seq<'U>, module value, FSharp.Core
Microsoft.FSharp.Control.Event.choose: ('T -> option<'U>) -> IEvent<'Del, 'T> -> IEvent<'U>, module value, FSharp.Core
when 'Del : delegate and 'Del :> Delegate
Microsoft.FSharp.Control.Observable.choose: ('T -> option<'U>) -> IObservable<'T> -> IObservable<'U>, module value, FSharp.Core
Используйте звездочку ( *
) для поиска частичных совпадений. Например, FSharp.Core.String.* : _
отображает все API модуля FSharp.Core.String
.
> FSharp.Core.String.* : _
Microsoft.FSharp.Core.String.collect: (char -> string) -> string -> string, module value, FSharp.Core
Microsoft.FSharp.Core.String.concat: string -> seq<string> -> string, module value, FSharp.Core
Microsoft.FSharp.Core.String.exists: (char -> bool) -> string -> bool, module value, FSharp.Core
Microsoft.FSharp.Core.String.filter: (char -> bool) -> string -> string, module value, FSharp.Core
...
Обычно переменные типа, такие как 'a
, и имена типов, такие как int
не совпадают. Однако вы можете поискать оба случая одновременно. В таких случаях вы можете использовать подстановочный знак ?
или _
.
> ? -> list<?> -> ?
Microsoft.FSharp.Collections.List.append: list<'T> -> list<'T> -> list<'T>, module value, FSharp.Core
Microsoft.FSharp.Collections.List.averageBy: ('T -> 'U) -> list<'T> -> 'U, module value, FSharp.Core
when 'U : (static member op_Addition : 'U * 'U -> 'U) and 'U : (static member DivideByInt : 'U * int -> 'U) and 'U : (static member get_Zero : unit -> 'U)
Microsoft.FSharp.Collections.List.choose: ('T -> option<'U>) -> list<'T> -> list<'U>, module value, FSharp.Core
Microsoft.FSharp.Collections.List.chunkBySize: int -> list<'T> -> list<list<'T>>, module value, FSharp.Core
...
Кроме того, называя подстановочные знаки, вы можете добавить условие, согласно которому одно и то же имя типа будет помещено в позицию подстановочного знака с тем же именем. Например, ? -> ?
соответствует всем следующим функциям:
'a -> 'a
int -> int
'a -> int
int -> string
Однако, если вы назовете его как ?a -> ?a
, приведенный выше пример не будет соответствовать 'a -> int
или int -> string
.
Поиск подтипа — это ограничение, определяющее типы, совместимые с указанным базовым типом или интерфейсом.
Чтобы использовать поиск по подтипам в запросе, напишите #type
. В части type
можно указать имя типа и имя интерфейса. В имени типа нельзя указывать параметры типа и подстановочные знаки.
Например, ? -> #seq<'T>
может искать функции, которые наследуются от seq<'T>
возвращают такие типы, как List<'T>
, IList<'T>
и 'T[]
.
Для поиска участников экземпляра напишите receiver -> signature
.
При поиске метода напишите receiver -> arg -> returnType
.
Для поиска методов с несколькими аргументами напишите receiver -> arg1 -> arg2 -> returnType
или receiver -> arg1 * arg2 -> returnType
. Обычно аргументы метода ищутся без различия между форматом кортежа ( arg1 * arg2
) и форматом каррирования ( arg1 -> arg2
). Если вы хотите выполнять поиск по формату аргумента, отключите опцию ignore-param-style
.
Для поиска свойства напишите receiver -> propertyType
. Индексированные свойства записываются как receiver -> index -> propertyType
.
Статические члены можно искать теми же запросами, что и значения и функции в модулях. Методы с несколькими аргументами записываются как методы экземпляра arg1 -> arg2 -> returnType
или arg1 * arg2 -> returnType
.
Для поиска активного шаблона напишите (||) : (args ->) inputType -> returnType
. Чтобы найти частично активный шаблон, напишите (|_|) : (args ->) inputType -> returnType
.
В части inputType
укажите тип, обрабатываемый активным шаблоном. Например, если вы хотите найти активные шаблоны для Expr
напишите (||) : ... -> Expr -> ?
Укажите аргументы активного шаблона в args
. Если вы хотите искать активные шаблоны с аргументами, напишите (||) : arg1 -> arg2 -> inputType -> returnType
. Если вы хотите искать активные шаблоны без аргументов, напишите (||) : inputType -> returnType
. Если вы хотите выполнить поиск, не различая наличие или отсутствие аргументов, используйте ключевое слово ...
в части аргумента и напишите (||) : ... -> inputType -> returnType
.
Часть retyrnType
указывает тип, возвращаемый функцией, который является фактическим активным шаблоном. Возвращаемое значение функции активного шаблона различно для одного, нескольких и частично активных шаблонов. Укажите любой соответствующий тип, option<_>
, Choice<_,...,_>
. Обычно рекомендуется использовать подстановочные знаки ( ?
).
Чтобы найти выражение вычисления, напишите { syntax } : type
. Находит построитель, который может обрабатывать указанный синтаксис и тип.
В syntax
можно указать любое имя операции: let!
yield
, yield!
return
return!
use
, use!
if/then
, for
, while
, try/with
, try/finally
. Если вы хотите указать несколько syntax
, разделите их с помощью ;
и напишите { s1; s2 } : type
.
Синтаксис запросов C# отличается от синтаксиса сигнатур C#.
API | Пример запроса |
---|---|
член | object -> () -> string string -> int |
конструктор | Uri : _ Uri..ctor : _ |
тип параметра | List<T> -> int Dictionary<tkey, tvalue> <TKey, TValue> : Dictionary<TKey, TValue> |
Имя (имя участника и т. д.) | Length : string -> int Length |
форма | List |
Поиск подтипа | <T> : #IEnumerable<T> -> T |
Чтобы найти участника или ввести его по имени, напишите name : signature
или name
. Если вы не указываете подпись, укажите _
в части подписи.
> Length : string -> int
System.String.Length : int, instance property with get, mscorlib
> Length
int Array.Length { get; }, instance property, mscorlib
int BitArray.Length { get; set; }, instance property, mscorlib
long BufferedStream.Length { get; }, instance property, mscorlib
long FileInfo.Length { get; }, instance property, mscorlib
...
> Length : _
int Array.Length { get; }, instance property, mscorlib
int BitArray.Length { get; set; }, instance property, mscorlib
long BufferedStream.Length { get; }, instance property, mscorlib
long FileInfo.Length { get; }, instance property, mscorlib
...
Используйте звездочку ( *
) для поиска частичных совпадений. Например, System.String.* : _
отображает все API типа System.String
.
> System.String.* : _
System.Array.Length : int, instance property with get, mscorlib
System.Collections.BitArray.Length : int, instance property with get set, mscorlib
System.ComponentModel.DataObjectFieldAttribute.Length : int, instance property with get, System
System.ComponentModel.MaskedTextProvider.Length : int, instance property with get, System
...
Существует три типа описаний параметров типа:
формат | пример | тип параметра | замечания |
---|---|---|---|
<t> : signature | <TKey, TValue> : Dictionary<TKey, TValue> | TKey , TValue | Прописные буквы можно использовать в параметрах типа в подробной форме. |
все строчные буквы | Dictionary<tkey, tvalue> | tkey , tvalue | Если все буквы строчные, часть <T> можно опустить. |
один персонаж | List<T> -> int | T | Если это один символ, часть <T> можно опустить. |
Однако даже если все они написаны строчными буквами, встроенные типы, такие как int и string, не рассматриваются как параметры типа.
Имя параметра типа в запросе не обязательно должно совпадать с именем искомого параметра типа. Например, запрос List<A>
соответствует типу System.Collections.Generics.List<T>
.
Обычно параметры типа, такие как T
, и имена типов, такие как int
не совпадают. Однако вы можете поискать оба случая одновременно. В таких случаях вы можете использовать ?
.
> <T> : List<T> -> ? -> int
System.Collections.Generic.List<T>.BinarySearch(T item) : int, instance method, mscorlib
System.Collections.Generic.List<T>.FindIndex(Predicate<T> match) : int, instance method, mscorlib
System.Collections.Generic.List<T>.FindLastIndex(Predicate<T> match) : int, instance method, mscorlib
System.Collections.Generic.List<T>.IndexOf(T item) : int, instance method, mscorlib
...
Кроме того, называя подстановочные знаки, вы можете добавить условие, согласно которому одно и то же имя типа будет появляться в позициях подстановочных знаков с тем же именем. Например, ? -> ?
соответствует всему следующему:
static T F1<T>(T x)
static int F2 (int x)
static T F3<T>(int x)
static int F4 (string x)
Однако если вы назовете его как ?a -> ?a
, приведенный выше пример не будет соответствовать F2
или F4
.
Поиск подтипа — это ограничение, определяющее типы, совместимые с указанным базовым типом или интерфейсом.
Чтобы использовать поиск по подтипам в запросе, напишите #type
. В части type
можно указать имя типа и имя интерфейса. В имени типа нельзя указывать параметры типа и подстановочные знаки.
Например, <T> : ? -> #IEnumerable<T>
может искать методы, которые наследуются от IEnumerable<T>
и возвращают такие типы, как List<T>
, IList<T>
и T[]
.
Для поиска метода напишите receiver -> (arg) -> returnType
. Методы с несколькими аргументами записываются как receiver -> (arg1, arg2) -> returnType
. Круглые скобки в аргументной части можно опустить. Если вы хотите найти API, у которых нет аргументов или возвращаемых значений, используйте ()
и void
.
> <T> : List<T> -> T -> int
System.Collections.Generic.List<T>.BinarySearch(T item) : int, instance method, mscorlib
System.Collections.Generic.List<T>.IndexOf(T item) : int, instance method, mscorlib
...
Для поиска свойства напишите receiver -> propertyType
. Индексированные свойства записываются как receiver -> index -> propertyType
.
> <T> : List<T> -> int
System.Collections.Generic.List<T>.Capacity : int, instance property with get set, mscorlib
System.Collections.Generic.List<T>.Count : int, instance property with get, mscorlib
...
Для поиска метода напишите (arg) -> returnType
. При поиске свойства напишите propertyType
.
> string -> int
System.Convert.ToInt32(string value) : int, static method, mscorlib
System.Int32.Parse(string s) : int, static method, mscorlib
...
Таким образом, тип, к которому принадлежит элемент, не указывается в запросе статического члена.