F# API Search Engine é um mecanismo de pesquisa que permite pesquisar APIs F# por assinatura ou nome.
nome do projeto | visão geral |
---|---|
FSharpApiSearch | Corpo do mecanismo de pesquisa |
FSharpApiSearch.Database | Ferramenta de criação de banco de dados de mecanismo de pesquisa |
FSharpApiSearch.Console | Front-end do mecanismo de pesquisa (aplicativo de console) |
Baixe o arquivo zip da página de lançamento e extraia-o.
Primeiro, execute FSharpApiSearch.Database.exe para criar um banco de dados.
FSharpApiSearch.Database.exe
Os assemblies que podem ser pesquisados por padrão são FSharp.Core
, mscorlib
, System
e System.Core
. Você pode adicionar alvos de pesquisa especificando um assembly ao criar um banco de dados. Você pode especificar o diretório para procurar assemblies com a opção --lib
. Especifique também as montagens das quais a montagem especificada depende.
FSharpApiSearch.Database.exe --lib:TargetAssemblyDirectory TargetAssembly1 TargetAssembly2 DependentAssembly
Se você executar FSharpApiSearch.Console.exe sem fazer uma consulta, ele será iniciado no modo interativo. Digite #q
para sair do modo interativo.
FSharpApiSearch.Console.exe
Se você passar uma consulta como argumento, a pesquisa será realizada apenas uma vez.
FSharpApiSearch.Console.exe "int -> int"
Use --target
para realmente usar o banco de dados criado para pesquisa.
FSharpApiSearch.Console.exe --target:TargetAssembly1 --target:TargetAssembly2
Se você usar --target
, o padrão FSharp.Core
, mscorlib
, System
e System.Core
não serão incluídos no alvo de pesquisa, portanto, se você quiser incluí-los no alvo de pesquisa, especifique-os explicitamente.
FSharpApiSearch.Console.exe --target:TargetAssembly1 --target:TargetAssembly2 --target:FSharp.Core --target:mscorlib --target:System --target:System.Core
respect-name-difference
Se respect-name-difference
estiver habilitada, a pesquisa respeitará as diferenças nos nomes de diferentes variáveis de tipo e curingas nomeados na consulta. Nomes diferentes não correspondem ao mesmo tipo. Por exemplo, a consulta ?a -> ?a
corresponde à assinatura int -> int
, mas a consulta ?a -> ?b
não corresponde int -> int
.
Se esta opção estiver desabilitada, a consulta ?a -> ?b
corresponderá int -> int
.
greedy-matching
Se a opção greedy-matching
estiver habilitada, as variáveis de tipo e outros tipos serão correspondidos individualmente e os resultados serão classificados e exibidos em ordem decrescente de correspondência. Além disso, as restrições de tipo agora são levadas em consideração nas pesquisas.
ignore-param-style
Existem dois tipos de formatos de argumentos para funções e métodos: formato curried ( arg1 -> arg2 -> returnType
) e formato tuple ( arg1 * arg2 -> returnType
). Se ignore-param-style
estiver habilitada, a correspondência ignora os formatos curry e tuple.
ignore-case
Se a opção ignore-case
estiver habilitada, case será ignorado ao combinar nomes de API e nomes de tipo.
substring
Se substring
estiver habilitada, pesquisa por substring.
swap-order
Se swap-order
estiver habilitada, a pesquisa trocará a ordem dos argumentos e tuplas. Por exemplo, a consulta a -> b -> c
corresponde b -> a -> c
.
complement
Se complement
estiver habilitada, completa e procura argumentos ausentes e elementos de tupla. Por exemplo, a consulta a * c
corresponde a * b * c
.
single-letter-as-variable
Se single-letter-as-variable
estiver habilitada, os nomes de tipos de letras únicas serão tratados como nomes de variáveis de tipo. Por exemplo, a consulta t list
é igual a 't list
.
language
Alterna consultas, pesquisas e exibição de resultados para a linguagem de programação especificada pela opção language
. Esta opção aceita F# e C#.
xmldoc
Se xmldoc
estiver habilitada, exibe documentos XML nos resultados da pesquisa.
As consultas F# são basicamente iguais às assinaturas F#. Apenas a extensão do FSharpApiSearch será explicada em detalhes.
>
é o prompt quando você inicia FSharpApiSearch.Console.exe no modo interativo.
API | Exemplo de consulta |
---|---|
Funções e valores do módulo | int -> string |
registro, campo de estrutura | Ref<'a> -> 'a |
união discriminada | 'a -> Option<'a> |
membro | 'a list -> int |
construtor | Uri : _ Uri.new : _ Uri..ctor : _ |
Nome (nome da função, nome do membro, etc.) | head : 'a list -> 'a head |
padrão ativo | (||) : ... -> Expr -> ? |
Tipos, abreviações de tipo, módulos | List<'T> |
expressão de cálculo | { let! } : Async<'T> |
Pesquisa de subtipo | #seq<'a> -> 'a |
Para pesquisar por nome, escreva name : signature
ou name
. Se você não especificar uma assinatura, especifique _
na parte da assinatura.
> 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
Use o asterisco ( *
) para procurar correspondências parciais. Por exemplo, FSharp.Core.String.* : _
exibe todas as APIs do módulo 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
...
Normalmente, variáveis de tipo como 'a
e nomes de tipo como int
não correspondem. No entanto, você pode querer pesquisar os dois casos ao mesmo tempo. Nesses casos, você pode usar o curinga ?
ou _
.
> ? -> 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
...
Além disso, ao nomear curingas, você pode adicionar uma condição para que o mesmo nome de tipo apareça nas posições curinga com o mesmo nome. Por exemplo, ? -> ?
corresponde a todas as seguintes funções:
'a -> 'a
int -> int
'a -> int
int -> string
No entanto, se você nomeá-lo como ?a -> ?a
, o exemplo acima não corresponderá 'a -> int
ou int -> string
.
Uma pesquisa de subtipo é uma restrição que especifica tipos compatíveis com um tipo base ou interface especificado.
Para usar a pesquisa de subtipo em uma consulta, escreva #type
. Você pode especificar o nome do tipo e o nome da interface na parte type
. Parâmetros de tipo e curingas não podem ser especificados no nome do tipo.
Por exemplo, ? -> #seq<'T>
pode procurar funções que herdam de seq<'T>
retornar tipos como List<'T>
, IList<'T>
e 'T[]
.
Para procurar membros da instância, escreva receiver -> signature
.
Ao procurar um método, escreva receiver -> arg -> returnType
.
Para pesquisar métodos com vários argumentos, escreva receiver -> arg1 -> arg2 -> returnType
ou receiver -> arg1 * arg2 -> returnType
. Normalmente, os argumentos do método são pesquisados no formato tupla ( arg1 * arg2
) e formato curried ( arg1 -> arg2
) sem distinção entre eles. Se você deseja pesquisar por formato de argumento, desative ignore-param-style
.
Para procurar uma propriedade, escreva receiver -> propertyType
. As propriedades indexadas são escritas como receiver -> index -> propertyType
.
Membros estáticos podem ser pesquisados com as mesmas consultas que valores e funções em módulos. Métodos multi-argumentos são escritos como métodos de instância arg1 -> arg2 -> returnType
ou arg1 * arg2 -> returnType
.
Para procurar um padrão ativo, escreva (||) : (args ->) inputType -> returnType
. Para procurar um padrão parcialmente ativo, escreva (|_|) : (args ->) inputType -> returnType
.
Na parte inputType
, especifique o tipo tratado pelo padrão ativo. Por exemplo, se você deseja pesquisar padrões ativos para Expr
escreva (||) : ... -> Expr -> ?
Especifique os argumentos do padrão ativo na parte args
. Se você deseja procurar padrões ativos com argumentos, escreva (||) : arg1 -> arg2 -> inputType -> returnType
. Se você deseja procurar padrões ativos sem argumentos, escreva (||) : inputType -> returnType
. Se quiser pesquisar sem distinguir entre a presença ou ausência de argumentos, use a palavra-chave ...
na parte do argumento e escreva (||) : ... -> inputType -> returnType
.
A parte retyrnType
especifica o tipo retornado pela função, que é o padrão ativo real. O valor de retorno da função de padrão ativo é diferente para padrões únicos, múltiplos e parcialmente ativos. Especifique qualquer tipo correspondente, option<_>
, Choice<_,...,_>
. Geralmente é recomendado usar curingas ( ?
).
Para procurar uma expressão de cálculo, escreva { syntax } : type
. Encontra um construtor que pode manipular a sintaxe e o tipo especificados.
syntax
pode incluir let!
yield
, yield!
return
, return!
use!
use
if/then
, for
, while
, try/with
, try/finally
e qualquer nome de operação personalizada. Se você quiser especificar múltiplas syntax
, separe-as com ;
e escreva { s1; s2 } : type
As consultas C# têm sintaxe diferente das assinaturas C#.
API | Exemplo de consulta |
---|---|
membro | object -> () -> string string -> int |
construtor | Uri : _ Uri..ctor : _ |
parâmetro de tipo | List<T> -> int Dictionary<tkey, tvalue> <TKey, TValue> : Dictionary<TKey, TValue> |
Nome (nome do membro, etc.) | Length : string -> int Length |
mofo | List |
Pesquisa de subtipo | <T> : #IEnumerable<T> -> T |
Para procurar um membro ou digitar por nome, escreva name : signature
ou name
. Se você não especificar uma assinatura, especifique _
na parte da assinatura.
> 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
...
Use o asterisco ( *
) para procurar correspondências parciais. Por exemplo, System.String.* : _
exibe todas as APIs do tipo 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
...
Existem três tipos de descrições de parâmetros de tipo:
formatar | exemplo | parâmetro de tipo | observações |
---|---|---|---|
<t> : signature | <TKey, TValue> : Dictionary<TKey, TValue> | TKey , TValue | Letras maiúsculas podem ser usadas em parâmetros de tipo de forma detalhada |
tudo em minúsculas | Dictionary<tkey, tvalue> | tkey , tvalue | Se todas as letras estiverem minúsculas, você pode omitir a parte <T> . |
um personagem | List<T> -> int | T | Se for um caractere único, a parte <T> pode ser omitida. |
No entanto, mesmo que estejam todos em letras minúsculas, os tipos integrados, como int e string, não são tratados como parâmetros de tipo.
O nome do parâmetro de tipo na consulta não precisa corresponder ao nome do parâmetro de tipo que está sendo pesquisado. Por exemplo, a consulta List<A>
corresponde ao tipo System.Collections.Generics.List<T>
.
Normalmente, parâmetros de tipo como T
e nomes de tipo como int
não correspondem. No entanto, você pode querer pesquisar os dois casos ao mesmo tempo. Nesses casos, você pode usar ?
.
> <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
...
Além disso, ao nomear curingas, você pode adicionar uma condição para que o mesmo nome de tipo apareça nas posições curinga com o mesmo nome. Por exemplo, ? -> ?
corresponde a todos os seguintes:
static T F1<T>(T x)
static int F2 (int x)
static T F3<T>(int x)
static int F4 (string x)
No entanto, se você nomeá-lo como ?a -> ?a
, o exemplo acima não corresponderá F2
ou F4
.
Uma pesquisa de subtipo é uma restrição que especifica tipos compatíveis com um tipo base ou interface especificado.
Para usar a pesquisa de subtipo em uma consulta, escreva #type
. Você pode especificar o nome do tipo e o nome da interface na parte type
. Parâmetros de tipo e curingas não podem ser especificados no nome do tipo.
Por exemplo, <T> : ? -> #IEnumerable<T>
pode procurar métodos que herdam de IEnumerable<T>
e retornar tipos como List<T>
, IList<T>
e T[]
.
Para procurar um método, escreva receiver -> (arg) -> returnType
. Métodos multi-argumentos são escritos como receiver -> (arg1, arg2) -> returnType
. Os parênteses na parte do argumento podem ser omitidos. Se você deseja pesquisar APIs que não possuem argumentos ou valores de retorno, use ()
e 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
...
Para procurar uma propriedade, escreva receiver -> propertyType
. As propriedades indexadas são escritas como 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
...
Para procurar um método, escreva (arg) -> returnType
. Ao procurar uma propriedade, escreva propertyType
.
> string -> int
System.Convert.ToInt32(string value) : int, static method, mscorlib
System.Int32.Parse(string s) : int, static method, mscorlib
...
Desta forma, o tipo ao qual o membro pertence não é indicado na consulta do membro estático.