F# API Search Engine es un motor de búsqueda que le permite buscar API de F# por firma o nombre.
nombre del proyecto | descripción general |
---|---|
FSharpApiBuscar | Cuerpo del motor de búsqueda |
FSharpApiSearch.Base de datos | Herramienta de creación de bases de datos para motores de búsqueda. |
FSharpApiSearch.Consola | Interfaz del motor de búsqueda (aplicación de consola) |
Descargue el archivo zip de la página de lanzamiento y extráigalo.
Primero, ejecute FSharpApiSearch.Database.exe para crear una base de datos.
FSharpApiSearch.Database.exe
Los ensamblados que se pueden buscar de forma predeterminada son FSharp.Core
, mscorlib
, System
y System.Core
. Puede agregar objetivos de búsqueda especificando un ensamblado al crear una base de datos. Puede especificar el directorio para buscar ensamblados con la opción --lib
. Especifique también los conjuntos de los que depende el conjunto especificado.
FSharpApiSearch.Database.exe --lib:TargetAssemblyDirectory TargetAssembly1 TargetAssembly2 DependentAssembly
Si ejecuta FSharpApiSearch.Console.exe sin realizar una consulta, se iniciará en modo interactivo. Escriba #q
para salir del modo interactivo.
FSharpApiSearch.Console.exe
Si pasa una consulta como argumento, la búsqueda se realizará solo una vez.
FSharpApiSearch.Console.exe "int -> int"
Utilice --target
para utilizar la base de datos creada para realizar búsquedas.
FSharpApiSearch.Console.exe --target:TargetAssembly1 --target:TargetAssembly2
Si utiliza --target
, los valores predeterminados FSharp.Core
, mscorlib
, System
y System.Core
no se incluirán en el destino de búsqueda, por lo que si desea incluirlos en el destino de búsqueda, especifíquelos explícitamente.
FSharpApiSearch.Console.exe --target:TargetAssembly1 --target:TargetAssembly2 --target:FSharp.Core --target:mscorlib --target:System --target:System.Core
respect-name-difference
Si respect-name-difference
está habilitada, la búsqueda respeta las diferencias en los nombres de diferentes tipos de variables y comodines con nombre en la consulta. Diferentes nombres no coinciden con el mismo tipo. Por ejemplo, la consulta ?a -> ?a
coincide con la firma int -> int
, pero la consulta ?a -> ?b
no coincide con int -> int
.
Si esta opción está deshabilitada, la consulta ?a -> ?b
coincidirá con int -> int
.
greedy-matching
Si la opción greedy-matching
está habilitada, las variables de tipo y otros tipos coincidirán individualmente, y los resultados se ordenarán y mostrarán en orden descendente de coincidencia. Además, las restricciones de tipo ahora se tienen en cuenta en las búsquedas.
ignore-param-style
Hay dos tipos de formatos de argumentos para funciones y métodos: formato curry ( arg1 -> arg2 -> returnType
) y formato de tupla ( arg1 * arg2 -> returnType
). Si ignore-param-style
está habilitada, la coincidencia ignora los formatos curry y tupla.
ignore-case
Si la opción ignore-case
está habilitada, las mayúsculas y minúsculas se ignoran al hacer coincidir nombres de API y nombres de tipos.
substring
Si substring
está habilitada, busca por subcadena.
swap-order
Si swap-order
está habilitada, la búsqueda intercambiará el orden de los argumentos y las tuplas. Por ejemplo, la consulta a -> b -> c
coincide con b -> a -> c
.
complement
Si complement
está habilitada, completa y busca argumentos y elementos de tupla faltantes. Por ejemplo, la consulta a * c
coincide con a * b * c
.
single-letter-as-variable
Si single-letter-as-variable
está habilitada, los nombres de tipos de una sola letra se tratan como nombres de variables de tipo. Por ejemplo, la consulta t list
es la misma que 't list
.
language
Cambia consultas, búsquedas y visualización de resultados al lenguaje de programación especificado por language
. Esta opción acepta F# y C#.
xmldoc
Si xmldoc
está habilitada, muestra documentos XML en los resultados de búsqueda.
Las consultas de F# son básicamente las mismas que las firmas de F#. Sólo se explicará en detalle la extensión de FSharpApiSearch.
>
es el mensaje cuando inicia FSharpApiSearch.Console.exe en modo interactivo.
API | Ejemplo de consulta |
---|---|
Funciones y valores del módulo | int -> string |
registro, campo de estructura | Ref<'a> -> 'a |
unión discriminada | 'a -> Option<'a> |
miembro | 'a list -> int |
constructor | Uri : _ Uri.new : _ Uri..ctor : _ |
Nombre (nombre de la función, nombre del miembro, etc.) | head : 'a list -> 'a head |
patrón activo | (||) : ... -> Expr -> ? |
Tipos, abreviaturas de tipos, módulos. | List<'T> |
expresión de cálculo | { let! } : Async<'T> |
Búsqueda de subtipo | #seq<'a> -> 'a |
Para buscar por nombre, escriba name : signature
o name
. Si no especifica una firma, especifique _
en la parte de la firma.
> 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
Utilice el asterisco ( *
) para buscar coincidencias parciales. Por ejemplo, FSharp.Core.String.* : _
muestra todas las API del 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, las variables de tipo como 'a
y los nombres de tipo como int
no coinciden. Sin embargo, es posible que desee buscar ambos casos a la vez. En tales casos, puede utilizar el comodín ?
o _
.
> ? -> 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
...
Además, al nombrar comodines, puede agregar la condición de que el mismo nombre de tipo aparezca en las posiciones de comodines con el mismo nombre. Por ejemplo, ? -> ?
coincide con todas las funciones siguientes:
'a -> 'a
int -> int
'a -> int
int -> string
Sin embargo, si lo nombra como ?a -> ?a
, el ejemplo anterior no coincidirá con 'a -> int
o int -> string
.
Una búsqueda de subtipo es una restricción que especifica tipos que son compatibles con un tipo base o interfaz específico.
Para utilizar la búsqueda de subtipos en una consulta, escriba #type
. Puede especificar el nombre del tipo y el nombre de la interfaz en type
. Los parámetros de tipo y los comodines no se pueden especificar en el nombre del tipo.
Por ejemplo, ? -> #seq<'T>
puede buscar funciones que heredan de seq<'T>
devolver tipos como List<'T>
, IList<'T>
y 'T[]
.
Para buscar, por ejemplo, miembros, escriba receiver -> signature
.
Cuando busque un método, escriba receiver -> arg -> returnType
.
Para buscar métodos de múltiples argumentos, escriba receiver -> arg1 -> arg2 -> returnType
o receiver -> arg1 * arg2 -> returnType
. Normalmente, los argumentos del método se buscan en formato tupla ( arg1 * arg2
) y formato curry ( arg1 -> arg2
) sin distinguir entre ellos. Si desea buscar por formato de argumento, desactive ignore-param-style
.
Para buscar una propiedad, escriba receiver -> propertyType
. Las propiedades indexadas se escriben como receiver -> index -> propertyType
.
Los miembros estáticos se pueden buscar con las mismas consultas que los valores y funciones en los módulos. Los métodos de argumentos múltiples se escriben como métodos de instancia arg1 -> arg2 -> returnType
o arg1 * arg2 -> returnType
.
Para buscar un patrón activo, escriba (||) : (args ->) inputType -> returnType
. Para buscar un patrón parcialmente activo, escriba (|_|) : (args ->) inputType -> returnType
.
En inputType
, especifique el tipo manejado por el patrón activo. Por ejemplo, si desea buscar patrones activos para Expr
escriba (||) : ... -> Expr -> ?
Especifique los argumentos del patrón activo en args
. Si desea buscar patrones activos con argumentos, escriba (||) : arg1 -> arg2 -> inputType -> returnType
. Si desea buscar patrones activos sin argumentos, escriba (||) : inputType -> returnType
. Si desea buscar sin distinguir entre la presencia o ausencia de argumentos, use la palabra clave ...
en la parte del argumento y escriba (||) : ... -> inputType -> returnType
.
La parte retyrnType
especifica el tipo devuelto por la función, que es el patrón activo real. El valor de retorno de la función de patrón activo es diferente para patrones únicos, múltiples y parcialmente activos. Especifique cualquier tipo correspondiente, option<_>
, Choice<_,...,_>
. Generalmente se recomienda utilizar comodines ( ?
).
Para buscar una expresión de cálculo, escriba { syntax } : type
. Encuentra un constructor que pueda manejar la sintaxis y el tipo especificados.
syntax
puede incluir let!
yield
, yield!
return
, return!
use
, use!
if/then
, for
, while
, try/with
, try/finally
y cualquier nombre de operación personalizado. Si desea especificar varias syntax
, sepárelas con ;
y escriba { s1; s2 } : type
Las consultas de C# tienen una sintaxis diferente a la de las firmas de C#.
API | Ejemplo de consulta |
---|---|
miembro | object -> () -> string string -> int |
constructor | Uri : _ Uri..ctor : _ |
tipo de parámetro | List<T> -> int Dictionary<tkey, tvalue> <TKey, TValue> : Dictionary<TKey, TValue> |
Nombre (nombre del miembro, etc.) | Length : string -> int Length |
moho | List |
Búsqueda de subtipo | <T> : #IEnumerable<T> -> T |
Para buscar un miembro o escribir por nombre, escriba name : signature
o name
. Si no especifica una firma, especifique _
en la parte de la firma.
> 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
...
Utilice el asterisco ( *
) para buscar coincidencias parciales. Por ejemplo, System.String.* : _
muestra todas las API de 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
...
Hay tres tipos de descripciones de parámetros de tipo:
formato | ejemplo | tipo de parámetro | comentarios |
---|---|---|---|
<t> : signature | <TKey, TValue> : Dictionary<TKey, TValue> | TKey , TValue | Las letras mayúsculas se pueden utilizar en parámetros de tipo en forma detallada |
todo en minúsculas | Dictionary<tkey, tvalue> | tkey , tvalue | Si todas las letras están en minúsculas, puede omitir la parte <T> . |
un personaje | List<T> -> int | T | Si es un solo carácter, se puede omitir la parte <T> . |
Sin embargo, incluso si todos están en minúsculas, los tipos integrados como int y string no se tratan como parámetros de tipo.
El nombre del parámetro de tipo en la consulta no tiene que coincidir con el nombre del parámetro de tipo que se busca. Por ejemplo, la consulta List<A>
coincide con el tipo System.Collections.Generics.List<T>
.
Normalmente, los parámetros de tipo como T
y los nombres de tipo como int
no coinciden. Sin embargo, es posible que desees buscar ambos casos a la vez. En tales casos, puede utilizar ?
.
> <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
...
Además, al nombrar comodines, puede agregar la condición de que el mismo nombre de tipo aparezca en las posiciones de comodines con el mismo nombre. Por ejemplo, ? -> ?
coincide con todo lo siguiente:
static T F1<T>(T x)
static int F2 (int x)
static T F3<T>(int x)
static int F4 (string x)
Sin embargo, si lo nombra como ?a -> ?a
, el ejemplo anterior no coincidirá con F2
o F4
.
Una búsqueda de subtipo es una restricción que especifica tipos que son compatibles con un tipo base o interfaz específico.
Para utilizar la búsqueda de subtipos en una consulta, escriba #type
. Puede especificar el nombre del tipo y el nombre de la interfaz en type
. Los parámetros de tipo y los comodines no se pueden especificar en el nombre del tipo.
Por ejemplo, <T> : ? -> #IEnumerable<T>
puede buscar métodos que heredan de IEnumerable<T>
y devolver tipos como List<T>
, IList<T>
y T[]
.
Para buscar un método, escriba receiver -> (arg) -> returnType
. Los métodos de argumentos múltiples se escriben como receiver -> (arg1, arg2) -> returnType
. Se pueden omitir los paréntesis en la parte del argumento. Si desea buscar API que no tengan argumentos ni valores de retorno, utilice ()
y 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 buscar una propiedad, escriba receiver -> propertyType
. Las propiedades indexadas se escriben 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 buscar un método, escriba (arg) -> returnType
. Al buscar una propiedad, escriba propertyType
.
> string -> int
System.Convert.ToInt32(string value) : int, static method, mscorlib
System.Int32.Parse(string s) : int, static method, mscorlib
...
De esta forma, el tipo al que pertenece el miembro no se indica en la consulta de miembro estático.