F# API Search Engineはシグネチャや名前でF#のAPIを検索できる検索エンジンです。
ベータ版なので仕様が不安定です。
プロジェクト名 | 概要 |
---|---|
FSharpApiSearch | 検索エンジン本体 |
FSharpApiSearch.Database | 検索エンジンのデータベース作成ツール |
FSharpApiSearch.Console | 検索エンジンのフロントエンド(コンソールアプリケーション) |
リリースページからzipファイルをダウンロードし、展開してください。
まず最初にFSharpApiSearch.Database.exeを実行してデータベースを作成します。
FSharpApiSearch.Database.exe
FSharpApiSearch.Console.exeにクエリを与えずに実行するとインタラクティブモードで起動します。
インタラクティブモードを終了するには#q
を入力してください。
FSharpApiSearch.Console.exe
引数にクエリを渡すと一度だけ検索を行います。
FSharpApiSearch.Console.exe "int -> int"
デフォルトで検索できるアセンブリはFSharp.Core
、mscorlib
、System
、System.Core
です。
データベース作成時にアセンブリを指定すると検索対象を追加できます。--lib
オプションでアセンブリを検索するディレクトリを指定できます。
指定するアセンブリが依存するアセンブリも指定して下さい。
FSharpApiSearch.Database.exe --lib:TargetAssemblyDirectory TargetAssembly1 TargetAssembly2 DependentAssembly
データベースを作成した後、実際に検索で使用するには--target
オプションを使用します。
FSharpApiSearch.Console.exeの--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
基本的にはF# のシグネチャと同じです。FSharpApiSearchの拡張のみ詳細を説明します。
また、>
はFSharpApiSearch.Console.exeをインタラクティブモードで起動したときのプロンプトです。
API | クエリ例 |
---|---|
モジュールの関数と値 | int -> string |
レコード、構造体のフィールド | Ref<'a> => 'a |
メソッド、プロパティ | 'a list => int |
コンストラクタ | string -> Uri |
型略称 | string means System.String |
名前 (関数名、メソッド名等) | head : 'a list -> 'a |
型制約 | 検索対象に型制約が指定されている場合にエミュレートします |
name : signature
と書きます。シグネチャを指定しない場合は、シグネチャ部分に_
を指定します。
> id : 'a -> 'a
Microsoft.FSharp.Core.Operators.id: 'T -> 'T, module value, distance: 0
> choose : _
Microsoft.FSharp.Collections.Array.choose: ('T -> option<'U>) -> 'T[] -> 'U[], module value, distance: 0
Microsoft.FSharp.Collections.ArrayModule.Parallel.choose: ('T -> option<'U>) -> 'T[] -> 'U[], module value, distance: 0
Microsoft.FSharp.Collections.List.choose: ('T -> option<'U>) -> list<'T> -> list<'U>, module value, distance: 0
Microsoft.FSharp.Collections.Seq.choose: ('T -> option<'U>) -> seq<'T> -> seq<'U>, module value, distance: 0
Microsoft.FSharp.Control.Event.choose: ('T -> option<'U>) -> IEvent<'Del, 'T> -> IEvent<'U>, module value, distance: 0
Microsoft.FSharp.Control.Observable.choose: ('T -> option<'U>) -> IObservable<'T> -> IObservable<'U>, module value, distance: 0
通常、'a
などの型変数とint
などの型名はマッチしません。
しかし、どちらのケースもまとめて検索したい場合があります。
このような場合に、ワイルドカード?
が使えます。
> ? -> list<?> -> ?
Microsoft.FSharp.Collections.List.Cons: 'T * list<'T> -> list<'T>, static method, distance: 0
Microsoft.FSharp.Collections.List.append: list<'T> -> list<'T> -> list<'T>, module value, distance: 0
Microsoft.FSharp.Collections.List.averageBy: ('T -> 'U) -> list<'T> -> 'U, module value, distance: 0
Microsoft.FSharp.Collections.List.choose: ('T -> option<'U>) -> list<'T> -> list<'U>, module value, distance: 0
Microsoft.FSharp.Collections.List.chunkBySize: int -> list<'T> -> list<list<'T>>, module value, distance: 0
...
また、ワイルドカードに名前を付けることで、同じ名前を持つワイルドカードの位置には同一の型名が入るという条件を追加できます。
例えば、? -> ?
は以下のすべての関数にマッチします。
'a -> 'a
int -> int
'a -> int
int -> string
しかし、?a -> ?a
のように名前を付けると、上の例では'a -> int
やint -> string
にはマッチしなくなります。
receiver => signature
と書きます。
メソッドを検索する場合はreceiver => arg -> returnType
と書きます。
多引数のメソッドを検索するにはreceiver => arg1 -> arg2 -> returnType
またはreceiver => arg1 * arg2 -> returnType
と書きます。
通常ではメソッドの引数がタプル形式(arg1 * arg2
)とカリー化形式(arg1 -> arg2
)を区別せずに検索します。
引数の形式を区別して検索したい場合はignore-argstyle
オプションを無効にします。
プロパティを検索する場合はreceiver => propertyType
と書きます。
インデックス付きプロパティはreceiver => index -> propertyType
と書きます。
インスタンスメンバの検索は次の特別規則があります。
arg -> receiver -> returnType
という形式の関数にマッチします。- 引数なしの検索(
receiver => propertyType
)は、receiver => unit -> propertyType
という形式のインスタンスメソッドともマッチします。
例は次の通りです。
> string => int
System.String.Length: int, instance property with get, distance: 0
Microsoft.FSharp.Core.LanguagePrimitives.ParseInt32: string -> int32, module value, distance: 1
Microsoft.FSharp.Core.String.length: string -> int, module value, distance: 1
System.String.GetHashCode: unit -> int, instance method, distance: 1
System.String.Length
はint
を返すプロパティなのでマッチしていますが、
それに加えてMicrosoft.FSharp.Core.String.length
もマッチしています。
これは、特別規則1に該当するため返されています。
また、System.String.GetHashCode
は特別規則2に該当するため返されています。
モジュール内の値や関数と同じクエリで検索できます。多引数メソッドはインスタンスメソッドと同様にarg1 -> arg2 -> returnType
またはarg1 * arg2 -> returnType
と書きます。
FSharpApiSearch.Console.exeに--strict[+|-]
オプションを付けて起動するか、
インタラクティブモードで#strict [enable|disable]
を実行すると設定できます。
デフォルトは有効です。
strict
オプションが有効の場合は、クエリ中の型変数または名前付きワイルドカードを使用した場合に、違う名前同士が同じ型にマッチしません。
例えば、?a -> ?a
というクエリはint -> int
というシグネチャにマッチしますが、?a -> ?b
というクエリはint -> int
にマッチしません。
このオプションに無効にした場合は、?a -> ?b
というクエリでint -> int
にマッチします。
FSharpApiSearch.Console.exeに--similarity[+|-]
オプションを付けて起動するか、
インタラクティブモードで#similarity [enable|disable]
を実行すると設定できます。
デフォルトは無効です。
similarity
オプションが有効の場合は、型変数と他の型がそれぞれマッチするようになり、一致度が高い順に並び替えられて表示されます。
また、検索に型制約が考慮されるようになります。
FSharpApiSearch.Console.exeに--ignore-argstyle[+|-]
オプションを付けて起動するか、
インタラクティブモードで#ignore-argstyle [enable|disable]
を実行すると設定できます。
デフォルトは有効です。
関数、メソッドの引数の形式には、カリー化形式(arg1 -> arg2 -> returnType
)とタプル形式(arg1 * arg2 -> returnType
)の2種類があります。
ignore-argstyle
オプションが有効の場合は、カリー化形式とタプル形式を無視してマッチします。
- 型名
- 判別共用体
- アクティブパターン
- 関数の型略称
- 拡張メソッド
- 測定単位
- 可視性
- コンピュテーション式
- C# で定義されたクラス、構造体のフィールド
- Windows
- .Net Framework 4.5
- F# 4.0