F# 2.0 (つまり、Visual Studio 2010) では、キーワード リストを拡張する方法はありません (Ramon の拡張以外)。ただし、F# 3.0 (Visual Sutdio 11) のクエリ メカニズムは拡張可能であり、 and のような独自のキーワードを定義できselect
ますcount
。
seq
以下は、ビルダーのようなものをreverse
キーワードで定義する基本的な例です。
type SeqBuilder() =
// Standard definition for 'for' and 'yield' in sequences
member x.For (source : seq<'T>, body : 'T -> seq<'R>) =
seq { for v in source do yield! body v }
member x.Yield item =
seq { yield item }
// Define an operation 'select' that performs projection
[<CustomOperation("select")>]
member x.Select (source : seq<'T>, [<ProjectionParameter>] f: 'T -> 'R) : seq<'R> =
Seq.map f source
// Defines an operation 'reverse' that reverses the sequence
[<CustomOperation("reverse", MaintainsVariableSpace = true)>]
member x.Expand (source : seq<'T>) =
List.ofSeq source |> List.rev
let mseq = SeqBuilder()
これがどのように機能するかの詳細はまだ文書化されていませんが、CustomOperation
属性は操作を特別な構文として扱う必要があることを示しています (さまざまなプロパティを設定して動作を指定できますMaintainsVariableSpace
。つまり、シーケンス内の値は変更されません)。このProjectionparameter
属性は、キーワードに続く式を暗黙的に関数に変換する必要があることを指定します。
現在、mseq
ビルダーは と の両方select
をサポートしていreverse
ます。
let q = mseq { for i in 1 .. 10 do
select (i + 100)
reverse }